From 29a671a9ff79d06b1ddb99de95a28abc9b2fc56a Mon Sep 17 00:00:00 2001 From: Petar Todorovic Date: Mon, 11 May 2026 15:03:04 +0200 Subject: [PATCH 1/4] refactor: effect migration --- .gitmodules | 3 + AGENTS.md | 25 + package.json | 10 +- packages/common/package.json | 10 +- .../common/scripts/generate-client-factory.ts | 197 +-- .../generate-tradingview-symbols/index.ts | 45 +- .../generate-tradingview-symbols/utils.ts | 19 +- packages/common/src/atoms/actions-atoms.ts | 21 +- .../common/src/atoms/close-position-atoms.ts | 26 +- packages/common/src/atoms/config-atom.ts | 5 +- .../common/src/atoms/edit-position-atoms.ts | 35 +- .../common/src/atoms/hyperliquid-atoms.ts | 6 +- packages/common/src/atoms/index.ts | 1 - packages/common/src/atoms/markets-atoms.ts | 59 +- packages/common/src/atoms/order-form-atoms.ts | 64 +- .../src/atoms/orders-pending-actions-atom.ts | 20 +- packages/common/src/atoms/portfolio-atoms.ts | 57 +- .../atoms/position-pending-actions-atom.ts | 21 +- packages/common/src/atoms/providers-atoms.ts | 7 +- packages/common/src/atoms/tokens-atoms.ts | 25 +- packages/common/src/atoms/utils.ts | 22 - packages/common/src/atoms/wallet-atom.ts | 8 +- .../src/components/molecules/Chart/index.tsx | 2 +- .../src/components/molecules/Chart/state.ts | 2 +- .../components/molecules/address-switcher.tsx | 2 +- .../molecules/limit-price-dialog.tsx | 24 +- .../molecules/sign-transactions/index.tsx | 4 +- packages/common/src/context/appkit.tsx | 3 +- packages/common/src/domain/signer.ts | 10 +- packages/common/src/domain/tokens.ts | 22 +- packages/common/src/domain/transactions.ts | 18 +- packages/common/src/domain/types.ts | 4 +- packages/common/src/domain/wallet.ts | 6 +- .../common/src/hooks/use-close-position.ts | 2 +- packages/common/src/hooks/use-deposit-form.ts | 55 +- .../common/src/hooks/use-edit-position.ts | 2 +- .../common/src/hooks/use-optional-atom-ref.ts | 2 +- packages/common/src/hooks/use-order-form.ts | 8 +- .../common/src/hooks/use-position-actions.ts | 4 +- packages/common/src/hooks/use-tp-sl-orders.ts | 2 +- .../common/src/hooks/use-withdraw-form.ts | 43 +- packages/common/src/lib/formatting.ts | 4 +- packages/common/src/lib/utils.ts | 3 +- .../src/services/api-client/api-schemas.ts | 1365 ++++------------ .../src/services/api-client/client-factory.ts | 1244 +++------------ .../common/src/services/api-client/index.ts | 80 +- packages/common/src/services/config.ts | 41 +- .../common/src/services/http-client/index.ts | 15 +- .../common/src/services/hyperliquid/index.ts | 26 +- packages/common/src/services/runtime.ts | 42 +- .../src/services/wallet/browser-signer.ts | 37 +- .../services/wallet/ledger-signer/index.ts | 37 +- .../services/wallet/ledger-signer/utils.ts | 8 +- packages/common/src/services/wallet/signer.ts | 4 +- .../src/services/wallet/wallet-service.ts | 120 +- packages/dashboard/package.json | 10 +- .../src/atoms/selected-market-atom.ts | 16 +- .../src/components/modules/root/Preload.tsx | 3 +- .../src/components/modules/trade/chart.tsx | 9 +- .../modules/trade/market-info/index.tsx | 10 +- .../market-info/market-selector-popover.tsx | 23 +- .../modules/trade/order-form/index.tsx | 9 +- .../modules/trade/order-form/sign-dialog.tsx | 3 +- .../header/deposit/deposit-dialog.tsx | 3 +- .../molecules/header/deposit/state.tsx | 9 +- .../src/components/molecules/header/index.tsx | 3 +- .../molecules/header/withdraw/state.tsx | 9 +- .../header/withdraw/withdraw-dialog.tsx | 3 +- .../positions/close-position-dialog.tsx | 2 +- .../components/molecules/positions/index.tsx | 3 +- .../molecules/positions/orders-tab.tsx | 19 +- .../molecules/positions/positions-tab.tsx | 24 +- packages/widget/package.json | 10 +- .../modules/Account/Deposit/index.tsx | 2 +- .../modules/Account/Deposit/state.tsx | 9 +- .../modules/Account/Withdraw/index.tsx | 2 +- .../modules/Account/Withdraw/state.tsx | 9 +- .../components/modules/Account/balance.tsx | 3 +- .../modules/Home/AssetList/index.tsx | 3 +- .../modules/Home/AssetList/item.tsx | 3 +- .../modules/Home/Positions/index.tsx | 40 +- .../modules/Home/Positions/order-card.tsx | 3 +- .../modules/Home/Positions/position-card.tsx | 3 +- .../src/components/modules/Home/index.tsx | 3 +- .../modules/Order/Overview/index.tsx | 16 +- .../PositionDetails/AdjustMargin/index.tsx | 9 +- .../PositionDetails/AdjustMargin/state.tsx | 59 +- .../modules/PositionDetails/Close/index.tsx | 2 +- .../modules/PositionDetails/Close/state.tsx | 11 +- .../PositionDetails/Overview/Orders/index.tsx | 3 +- .../Overview/Position/index.tsx | 9 +- .../PositionDetails/Overview/index.tsx | 14 +- .../Overview/modify-dialog.tsx | 3 +- .../components/modules/Root/PreloadAtoms.tsx | 3 +- .../molecules/account-value-display.tsx | 3 +- .../navigation/wallet-protected-route.tsx | 3 +- .../components/molecules/provider-select.tsx | 3 +- .../molecules/sign/sign-content.tsx | 3 +- .../$marketId/adjust-margin.tsx | 4 +- .../position-details/$marketId/index.tsx | 4 +- ...cas-barake__effect-form-react@0.24.0.patch | 41 + .../@lucas-barake__effect-form@0.23.0.patch | 227 +++ patches/@tim-smart__openapi-gen.patch | 32 - pnpm-lock.yaml | 1380 +++++++---------- pnpm-workspace.yaml | 20 +- 105 files changed, 2249 insertions(+), 3775 deletions(-) create mode 100644 .gitmodules create mode 100644 AGENTS.md delete mode 100644 packages/common/src/atoms/utils.ts create mode 100644 patches/@lucas-barake__effect-form-react@0.24.0.patch create mode 100644 patches/@lucas-barake__effect-form@0.23.0.patch delete mode 100644 patches/@tim-smart__openapi-gen.patch diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e56fd6d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule ".external/effect-smol"] + path = .external/effect-smol + url = https://github.com/Effect-TS/effect-smol.git diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..47a9d36 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,25 @@ +# AGENTS.md + +Instructions for AI coding agents working with this codebase. + +## Commands + +After each code change, run these commands to confirm that nothing is broken + +- To lint and typecheck, run: `pnpm turbo lint --filter=@yieldxyz/perps-{package}`, +- For code formatting, run: `pnpm turbo format --filter=@yieldxyz/perps-{package}`, +- If a file is added, removed, or changed in `routes` folder, to generate route tree run: `pnpm turbo generate-routes --filter=@yieldxyz/perps-{package}` + +## General rules + +- Don't mix components/UI and logic - separate those two in hooks and components files +- All state handling should be done with `@effect-atom/atom-react` +- Use `effect` as much as possible. Don't use async/await +- Math/finance calculations and functions are placed in `packages/common/src/lib/math.ts` +- For manipulating array and records use `effect/Array` and `effect/Record` +- Don't use hooks `useMemo` or `useCallback` as we're using react-compiler +- During refactoring, avoid re-exporting functionality. Update imports in file thats importing this functionality + +## Source code references + +- Check `.external/effect-smol` for all references related to effect. Do not look up web for docs. They are not available yet as this is beta version \ No newline at end of file diff --git a/package.json b/package.json index b58535c..df49ec6 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,15 @@ "prepare": "husky" }, "devDependencies": { - "turbo": "catalog:", "@biomejs/biome": "catalog:", - "@effect/language-service": "catalog:", "@commitlint/cli": "catalog:", "@commitlint/config-conventional": "catalog:", - "husky": "catalog:" + "@effect/language-service": "catalog:", + "husky": "catalog:", + "json-schema-typed": "^8.0.2", + "openapi-typescript": "^7.13.0", + "swagger2openapi": "^7.0.8", + "turbo": "catalog:", + "yaml": "^2.9.0" } } diff --git a/packages/common/package.json b/packages/common/package.json index cdf0d07..afb07af 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -55,9 +55,6 @@ }, "dependencies": { "@base-ui/react": "catalog:", - "@effect-atom/atom-react": "catalog:", - "@effect/experimental": "catalog:", - "@effect/platform": "catalog:", "@effect/platform-node": "catalog:", "@ledgerhq/wallet-api-client": "catalog:", "@lucas-barake/effect-form-react": "catalog:", @@ -82,12 +79,12 @@ "tailwindcss": "catalog:", "tw-animate-css": "catalog:", "viem": "catalog:", - "wagmi": "catalog:" + "wagmi": "catalog:", + "@effect/atom-react": "catalog:" }, "devDependencies": { "@tanstack/devtools-vite": "catalog:", "@tanstack/router-cli": "catalog:", - "@tim-smart/openapi-gen": "catalog:", "@types/node": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", @@ -102,6 +99,7 @@ "vite": "catalog:", "vite-plugin-node-polyfills": "catalog:", "vitest": "catalog:", - "vitest-browser-react": "catalog:" + "vitest-browser-react": "catalog:", + "@effect/openapi-generator": "catalog:" } } diff --git a/packages/common/scripts/generate-client-factory.ts b/packages/common/scripts/generate-client-factory.ts index 0b8351e..e46dcb4 100644 --- a/packages/common/scripts/generate-client-factory.ts +++ b/packages/common/scripts/generate-client-factory.ts @@ -1,119 +1,138 @@ +import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; -import { - Command, - CommandExecutor, - FetchHttpClient, - FileSystem, - HttpClient, - Path, -} from "@effect/platform"; -import { NodeContext, NodeRuntime } from "@effect/platform-node"; -import { Config, Effect, Layer } from "effect"; +import { NodeRuntime, NodeServices } from "@effect/platform-node"; +import { Effect, Fiber, FileSystem, Layer, Stream } from "effect"; +import { FetchHttpClient, HttpClient } from "effect/unstable/http"; +import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"; const fetchOpenApiSpecs = Effect.gen(function* () { const client = yield* HttpClient.HttpClient; const fs = yield* FileSystem.FileSystem; - const perpsDocsUrl = yield* Config.string("PERPS_DOCS_URL"); - const perpsJsonPath = yield* perpsOpenApiJsonPath; + const perpsDocsUrl = process.env.PERPS_DOCS_URL; + if (!perpsDocsUrl) { + return yield* Effect.fail(new Error("PERPS_DOCS_URL is not set")); + } yield* client.get(perpsDocsUrl).pipe( Effect.andThen((response) => response.text), - Effect.andThen((txt) => fs.writeFileString(perpsJsonPath, txt)), + Effect.andThen((txt) => fs.writeFileString(perpsOpenApiJsonPath, txt)), ); }); const generateClientFactory = Effect.gen(function* () { - const ce = yield* CommandExecutor.CommandExecutor; const fs = yield* FileSystem.FileSystem; - const output = yield* ce.string( - Command.make( - "pnpm", - "openapi-gen", - "-n", - "SKClient", - "-t", - "-s", - yield* perpsOpenApiJsonPath, - ), - ); - - const outputSchemas = yield* ce.string( - Command.make( - "pnpm", - "openapi-gen", - "-n", - "SKClient", - "-s", - yield* perpsOpenApiJsonPath, - ), - ); - - if (yield* fs.exists(yield* generateClientPath)) { - yield* fs.remove(yield* generateClientPath); - } - yield* fs.writeFileString(yield* generateClientPath, output); - - if (yield* fs.exists(yield* clientSchemasPath)) { - yield* fs.remove(yield* clientSchemasPath); - } - yield* fs.writeFileString(yield* clientSchemasPath, outputSchemas); - - yield* fs.remove(yield* perpsOpenApiJsonPath); -}); - -const formatClientFactory = Effect.gen(function* () { - const ce = yield* CommandExecutor.CommandExecutor; - - yield* ce.exitCode( - Command.make("biome", "format", "--write", yield* generateClientPath), - ); - yield* ce.exitCode( - Command.make("biome", "format", "--write", yield* clientSchemasPath), - ); + const output = yield* runCommand("pnpm", [ + "openapigen", + "-n", + "SKClient", + "-f", + "httpclient-type-only", + "-s", + perpsOpenApiJsonPath, + "-p", + openApiPatch, + ]); + + const outputSchemas = yield* runCommand("pnpm", [ + "openapigen", + "-n", + "SKClient", + "-f", + "httpclient", + "-s", + perpsOpenApiJsonPath, + "-p", + openApiPatch, + ]); + + const clientSchemas = sanitizeGeneratedSource(outputSchemas); + + yield* fs.writeFileString(generateClientPath, output); + yield* fs.writeFileString(clientSchemasPath, clientSchemas); + yield* fs.remove(perpsOpenApiJsonPath, { force: true }); }); const program = Effect.gen(function* () { yield* fetchOpenApiSpecs; yield* generateClientFactory; - yield* formatClientFactory; }); -const layer = Layer.mergeAll(FetchHttpClient.layer, NodeContext.layer); - -program.pipe(Effect.scoped, Effect.provide(layer), NodeRuntime.runMain); - -const __dirname = Path.Path.pipe( - Effect.andThen((p) => p.dirname(fileURLToPath(import.meta.url))), +program.pipe( + Effect.provide(Layer.mergeAll(FetchHttpClient.layer, NodeServices.layer)), + NodeRuntime.runMain, ); -const perpsOpenApiJsonPath = Effect.all({ - p: Path.Path, - __dirname, -}).pipe(Effect.andThen(({ p, __dirname }) => p.join(__dirname, "perps.json"))); +const __dirname = dirname(fileURLToPath(import.meta.url)); -const generateClientPath = Effect.all({ - p: Path.Path, +const perpsOpenApiJsonPath = join(__dirname, "perps.json"); + +const generateClientPath = join( __dirname, -}).pipe( - Effect.andThen(({ p, __dirname }) => - p.join( - __dirname, - "..", - "src", - "services", - "api-client", - "client-factory.ts", - ), - ), + "..", + "src", + "services", + "api-client", + "client-factory.ts", ); -const clientSchemasPath = Effect.all({ - p: Path.Path, +const clientSchemasPath = join( __dirname, -}).pipe( - Effect.andThen(({ p, __dirname }) => - p.join(__dirname, "..", "src", "services", "api-client", "api-schemas.ts"), - ), + "..", + "src", + "services", + "api-client", + "api-schemas.ts", ); + +const openApiPatch = JSON.stringify([ + { + op: "replace", + path: "/components/schemas/ArgumentSchemaPropertyDto/properties/items", + value: { + type: "object", + description: "Items schema (for arrays)", + }, + }, +]); + +const sanitizeGeneratedSource = (source: string) => + source.replaceAll( + '"examples": [["open","close","updateLeverage"]]', + '"examples": ["open"]', + ); + +const runCommand = (command: string, args: ReadonlyArray) => + Effect.scoped( + Effect.gen(function* () { + const spawner = yield* ChildProcessSpawner.ChildProcessSpawner; + const process = yield* spawner.spawn(ChildProcess.make(command, args)); + const stdoutFiber = yield* process.stdout.pipe( + Stream.decodeText(), + Stream.mkString, + Effect.forkChild, + ); + const stderrFiber = yield* process.stderr.pipe( + Stream.decodeText(), + Stream.mkString, + Effect.forkChild, + ); + const exitCode = yield* process.exitCode; + const stdout = yield* Fiber.join(stdoutFiber); + const stderr = yield* Fiber.join(stderrFiber); + + if (stderr.length > 0) { + yield* Effect.sync(() => console.error(stderr)); + } + + const exitCodeNumber = Number(exitCode); + if (exitCodeNumber !== 0) { + return yield* Effect.fail( + new Error(stderr || `${command} exited with code ${exitCodeNumber}`), + ); + } + + return stdout; + }), + ); diff --git a/packages/common/scripts/generate-tradingview-symbols/index.ts b/packages/common/scripts/generate-tradingview-symbols/index.ts index 12abbcd..f2f0b79 100644 --- a/packages/common/scripts/generate-tradingview-symbols/index.ts +++ b/packages/common/scripts/generate-tradingview-symbols/index.ts @@ -1,13 +1,20 @@ import { writeFile } from "node:fs/promises"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; +import { + Array as _Array, + Config, + Context, + Effect, + Layer, + Logger, +} from "effect"; import { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse, -} from "@effect/platform"; -import { Array as _Array, Config, Effect, Layer, Logger } from "effect"; +} from "effect/unstable/http"; import { type BaseSymbolSchema, byProviderAndCurrency, @@ -24,11 +31,10 @@ import { // ----------------------------------------------------------------------------- // HttpClient Services // ----------------------------------------------------------------------------- -class PerpsClient extends Effect.Service()( +class PerpsClient extends Context.Service()( "perps/scripts/audit-tradingview-symbols/PerpsClient", { - dependencies: [FetchHttpClient.layer], - effect: Effect.gen(function* () { + make: Effect.gen(function* () { const baseUrl = yield* Config.string("PERPS_BASE_URL"); const apiKey = yield* Config.string("PERPS_API_KEY"); const client = yield* HttpClient.HttpClient; @@ -43,13 +49,16 @@ class PerpsClient extends Effect.Service()( ); }), }, -) {} +) { + static readonly layer = Layer.effect(this, this.make).pipe( + Layer.provide(FetchHttpClient.layer), + ); +} -class TradingViewClient extends Effect.Service()( +class TradingViewClient extends Context.Service()( "perps/scripts/audit-tradingview-symbols/TradingViewClient", { - dependencies: [FetchHttpClient.layer], - effect: Effect.gen(function* () { + make: Effect.gen(function* () { const client = yield* HttpClient.HttpClient; return client.pipe( @@ -68,7 +77,11 @@ class TradingViewClient extends Effect.Service()( ); }), }, -) {} +) { + static readonly layer = Layer.effect(this, this.make).pipe( + Layer.provide(FetchHttpClient.layer), + ); +} // ----------------------------------------------------------------------------- // API Functions @@ -127,15 +140,15 @@ const getAllMarketsForProvider = Effect.fn(function* (providerId: string) { }); const totalPages = Math.ceil(firstPage.total / DEFAULT_LIMIT); - const restPages = yield* Effect.allSuccesses( + const restPages = yield* Effect.all( Array.from({ length: totalPages - 1 }).map((_, index) => getMarketsPage({ providerId, offset: (index + 1) * DEFAULT_LIMIT, limit: DEFAULT_LIMIT, - }), + }).pipe(Effect.option), ), - ); + ).pipe(Effect.map(_Array.getSomes)); return [ ...(firstPage.items ?? []), @@ -258,9 +271,9 @@ const program = Effect.gen(function* () { }); const layer = Layer.mergeAll( - PerpsClient.Default, - TradingViewClient.Default, - Logger.pretty, + PerpsClient.layer, + TradingViewClient.layer, + Logger.layer([Logger.consolePretty()]), ); program.pipe(Effect.provide(layer), Effect.runPromise); diff --git a/packages/common/scripts/generate-tradingview-symbols/utils.ts b/packages/common/scripts/generate-tradingview-symbols/utils.ts index 8396f6a..749722d 100644 --- a/packages/common/scripts/generate-tradingview-symbols/utils.ts +++ b/packages/common/scripts/generate-tradingview-symbols/utils.ts @@ -7,7 +7,7 @@ export const DEFAULT_LIMIT = 50; // ----------------------------------------------------------------------------- export const ProviderId = Schema.String.pipe(Schema.brand("ProviderId")); -export const CompareCurrencySchema = Schema.Literal("USD", "USDC", "USDT"); +export const CompareCurrencySchema = Schema.Literals(["USD", "USDC", "USDT"]); export const currencyPriorityRecord: Record< typeof CompareCurrencySchema.Type, @@ -24,7 +24,7 @@ export const TokenDto = Schema.Struct({ symbol: BaseSymbolSchema }); export const ProviderDto = Schema.Struct({ id: Schema.String, - name: Schema.optionalWith(Schema.String, { nullable: true }), + name: Schema.optional(Schema.NullOr(Schema.String)), }); export const MarketDto = Schema.Struct({ @@ -38,7 +38,7 @@ export const MarketsResponse = Schema.Struct({ total: Schema.Number, offset: Schema.Number, limit: Schema.Number, - items: Schema.optionalWith(Schema.Array(MarketDto), { nullable: true }), + items: Schema.optional(Schema.NullOr(Schema.Array(MarketDto))), }); export const ProvidersResponse = Schema.Array(ProviderDto); @@ -53,7 +53,7 @@ export const TradingViewSearchResponse = Schema.Struct({ ), }); -const CheckTradingViewSymbolResult = Schema.Union( +const CheckTradingViewSymbolResult = Schema.Union([ Schema.Struct({ status: Schema.Literal("match"), perpsSymbol: Schema.String, @@ -68,7 +68,7 @@ const CheckTradingViewSymbolResult = Schema.Union( status: Schema.Literal("error"), perpsSymbol: Schema.String, }), -); +]); // ----------------------------------------------------------------------------- // Error Types @@ -100,12 +100,11 @@ export const normalizeSymbol = (symbol: T): T => export const makeResult = Schema.decodeSync(CheckTradingViewSymbolResult); const byCurrency = Order.mapInput( - Order.number, + Order.Number, (val: (typeof TradingViewSearchResponse.Type)["symbols"][number]) => { const compareSymbol = Schema.decodeUnknownOption( Schema.TemplateLiteralParser( - Schema.String, - Schema.Literal("USD", "USDC", "USDT"), + Schema.TemplateLiteral([Schema.String, CompareCurrencySchema]).parts, ), )(val.symbol).pipe( Option.map((v) => v[1]), @@ -121,7 +120,7 @@ const byCurrency = Order.mapInput( ); const byProvider = Order.mapInput( - Order.number, + Order.Number, (val: (typeof TradingViewSearchResponse.Type)["symbols"][number]) => Record.get(exchangePriorityRecord, val.provider_id).pipe( Option.getOrElse(() => 999), @@ -135,7 +134,7 @@ export const compareSymbolsFromBaseSymbol = ( ) => { const compareSymbols = Schema.decodeSync( Schema.Array( - Schema.TemplateLiteral(BaseSymbolSchema, CompareCurrencySchema), + Schema.TemplateLiteral([BaseSymbolSchema, CompareCurrencySchema]), ), )( CompareCurrencySchema.literals.map( diff --git a/packages/common/src/atoms/actions-atoms.ts b/packages/common/src/atoms/actions-atoms.ts index 4cfeb2a..45b9b34 100644 --- a/packages/common/src/atoms/actions-atoms.ts +++ b/packages/common/src/atoms/actions-atoms.ts @@ -1,6 +1,7 @@ -import { Reactivity } from "@effect/experimental/Reactivity"; -import { Atom, type Result } from "@effect-atom/atom-react"; -import { Effect, Stream } from "effect"; +import { type Cause, Effect, Stream } from "effect"; +import type * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Atom from "effect/unstable/reactivity/Atom"; +import * as Reactivity from "effect/unstable/reactivity/Reactivity"; import type { SignTransactionsState, WalletConnected } from "../domain/wallet"; import type { ActionDto } from "../services/api-client/client-factory"; import { runtimeAtom } from "../services/runtime"; @@ -12,7 +13,7 @@ const getActionAtom = Atom.make( Effect.fn(function* (ctx) { const action = ctx.get(actionAtom); if (!action) { - return yield* Effect.dieMessage("No action found"); + return yield* Effect.die(new Error("No action found")); } return action; }), @@ -28,7 +29,9 @@ type SignActionAtoms = ( never >, ) => { - machineStreamAtom: Atom.Atom>; + machineStreamAtom: Atom.Atom< + Result.AsyncResult + >; retryMachineAtom: Atom.AtomResultFn; }; @@ -45,13 +48,7 @@ export const signActionAtoms: SignActionAtoms = Atom.family( Effect.map((val) => val.stream), Stream.unwrap, Stream.takeUntil((v) => v.isDone), - Stream.onDone(() => - Reactivity.pipe( - Effect.andThen((reactivity) => - reactivity.invalidate(portfolioReactivityKeysArray), - ), - ), - ), + Stream.ensuring(Reactivity.invalidate(portfolioReactivityKeysArray)), ), ); diff --git a/packages/common/src/atoms/close-position-atoms.ts b/packages/common/src/atoms/close-position-atoms.ts index e72d916..c97d090 100644 --- a/packages/common/src/atoms/close-position-atoms.ts +++ b/packages/common/src/atoms/close-position-atoms.ts @@ -1,5 +1,7 @@ -import { Atom, Registry, Result } from "@effect-atom/atom-react"; import { Number as _Number, Effect } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Atom from "effect/unstable/reactivity/Atom"; +import * as Registry from "effect/unstable/reactivity/AtomRegistry"; import type { WalletConnected } from "../domain/wallet"; import { getCloseCalculations } from "../lib/math"; import { ApiClientService } from "../services/api-client"; @@ -29,7 +31,7 @@ export const submitCloseAtom = runtimeAtom.fn( .pipe(Result.getOrElse(() => null)); if (!selectedProvider) { - return yield* Effect.dieMessage("No selected provider"); + return yield* Effect.die(new Error("No selected provider")); } const closePercentage = registry.get(closePercentageAtom); @@ -39,15 +41,17 @@ export const submitCloseAtom = runtimeAtom.fn( : getCloseCalculations(args.position, closePercentage); const action = yield* client.ActionsControllerExecuteAction({ - providerId: selectedProvider.id, - address: args.wallet.currentAccount.address, - action: "close", - args: { - marketId: args.position.marketId, - side: args.position.side, - ...(closeCalculations && { - size: closeCalculations.closeSizeInMarketPrice, - }), + payload: { + providerId: selectedProvider.id, + address: args.wallet.currentAccount.address, + action: "close", + args: { + marketId: args.position.marketId, + side: args.position.side, + ...(closeCalculations && { + size: closeCalculations.closeSizeInMarketPrice, + }), + }, }, }); diff --git a/packages/common/src/atoms/config-atom.ts b/packages/common/src/atoms/config-atom.ts index 86681ed..96da85d 100644 --- a/packages/common/src/atoms/config-atom.ts +++ b/packages/common/src/atoms/config-atom.ts @@ -1,4 +1,7 @@ +import { Effect } from "effect"; import { ConfigService } from "../services/config"; import { runtimeAtom } from "../services/runtime"; -export const configAtom = runtimeAtom.atom(ConfigService); +export const configAtom = runtimeAtom.atom( + ConfigService.use((config) => Effect.succeed(config)), +); diff --git a/packages/common/src/atoms/edit-position-atoms.ts b/packages/common/src/atoms/edit-position-atoms.ts index 3885548..e99230d 100644 --- a/packages/common/src/atoms/edit-position-atoms.ts +++ b/packages/common/src/atoms/edit-position-atoms.ts @@ -1,6 +1,7 @@ -import { Registry, Result } from "@effect-atom/atom-react"; import { Effect, flow, Match, Option } from "effect"; import { defined } from "effect/Match"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Registry from "effect/unstable/reactivity/AtomRegistry"; import type { TPOrSLConfiguration, TPOrSLSettings, @@ -8,7 +9,7 @@ import type { import type { WalletConnected } from "../domain/wallet"; import { ApiClientService } from "../services/api-client"; import type { - ArgumentsDto, + ActionRequestDto, PositionDto, } from "../services/api-client/api-schemas"; import { runtimeAtom } from "../services/runtime"; @@ -48,16 +49,14 @@ export const editSLTPAtom = runtimeAtom.fn( .pipe(Result.getOrElse(() => null)); if (!selectedProvider) { - return yield* Effect.dieMessage("No selected provider"); + return yield* Effect.die(new Error("No selected provider")); } - const newStopLossPrice: ArgumentsDto["stopLossPrice"] = tpSlArgument( - tpOrSLSettings.stopLoss, - ); + const newStopLossPrice: ActionRequestDto["args"]["stopLossPrice"] = + tpSlArgument(tpOrSLSettings.stopLoss); - const newTakeProfitPrice: ArgumentsDto["takeProfitPrice"] = tpSlArgument( - tpOrSLSettings.takeProfit, - ); + const newTakeProfitPrice: ActionRequestDto["args"]["takeProfitPrice"] = + tpSlArgument(tpOrSLSettings.takeProfit); const actionArgs = Match.value({ newStopLossPrice, @@ -65,7 +64,7 @@ export const editSLTPAtom = runtimeAtom.fn( }).pipe( Match.withReturnType<{ action: "setTpAndSl" | "takeProfit" | "stopLoss"; - args: ArgumentsDto; + args: ActionRequestDto["args"]; } | null>(), Match.when( { newStopLossPrice: defined, newTakeProfitPrice: defined }, @@ -97,16 +96,18 @@ export const editSLTPAtom = runtimeAtom.fn( ); if (!actionArgs) { - return yield* Effect.dieMessage("No TP/SL settings provided"); + return yield* Effect.die(new Error("No TP/SL settings provided")); } const action = yield* client.ActionsControllerExecuteAction({ - providerId: selectedProvider.id, - address: wallet.currentAccount.address, - action: actionArgs.action, - args: { - marketId: position.marketId, - ...actionArgs.args, + payload: { + providerId: selectedProvider.id, + address: wallet.currentAccount.address, + action: actionArgs.action, + args: { + marketId: position.marketId, + ...actionArgs.args, + }, }, }); diff --git a/packages/common/src/atoms/hyperliquid-atoms.ts b/packages/common/src/atoms/hyperliquid-atoms.ts index 2e7c15a..9db62c0 100644 --- a/packages/common/src/atoms/hyperliquid-atoms.ts +++ b/packages/common/src/atoms/hyperliquid-atoms.ts @@ -2,7 +2,7 @@ import { Stream } from "effect"; import { HyperliquidService, runtimeAtom } from "../services"; export const midPriceAtom = runtimeAtom.atom( - HyperliquidService.use((service) => service.subscribeMidPrice).pipe( - Stream.unwrapScoped, - ), + Stream.unwrap( + HyperliquidService.use((service) => service.subscribeMidPrice), + ).pipe(Stream.scoped), ); diff --git a/packages/common/src/atoms/index.ts b/packages/common/src/atoms/index.ts index 26fe657..8eec338 100644 --- a/packages/common/src/atoms/index.ts +++ b/packages/common/src/atoms/index.ts @@ -10,5 +10,4 @@ export * from "./portfolio-atoms"; export * from "./position-pending-actions-atom"; export * from "./providers-atoms"; export * from "./tokens-atoms"; -export * from "./utils"; export * from "./wallet-atom"; diff --git a/packages/common/src/atoms/markets-atoms.ts b/packages/common/src/atoms/markets-atoms.ts index 1c28c4b..d6d995a 100644 --- a/packages/common/src/atoms/markets-atoms.ts +++ b/packages/common/src/atoms/markets-atoms.ts @@ -1,4 +1,3 @@ -import { Atom, AtomRef } from "@effect-atom/atom-react"; import { Array as _Array, Data, @@ -9,6 +8,8 @@ import { Schedule, Stream, } from "effect"; +import * as Atom from "effect/unstable/reactivity/Atom"; +import * as AtomRef from "effect/unstable/reactivity/AtomRef"; import { ApiClientService } from "../services/api-client"; import type { ProviderDto } from "../services/api-client/api-schemas"; import { runtimeAtom } from "../services/runtime"; @@ -21,25 +22,33 @@ const getAllMarkets = Effect.fn(function* (selectedProvider: ProviderDto) { const client = yield* ApiClientService; const firstPage = yield* client.MarketsControllerGetMarkets({ - providerId: selectedProvider.id, - limit: DEFAULT_LIMIT, - offset: 0, + params: { + providerId: selectedProvider.id as "hyperliquid" | "hyperliquid-xyz", + limit: DEFAULT_LIMIT, + offset: 0, + }, }); const totalPages = Math.ceil(firstPage.total / DEFAULT_LIMIT); - const restPages = yield* Effect.allSuccesses( + const restPages = yield* Effect.all( Array.from({ length: totalPages - 1, }).map((_, index) => - client.MarketsControllerGetMarkets({ - providerId: selectedProvider.id, - offset: (index + 1) * DEFAULT_LIMIT, - limit: DEFAULT_LIMIT, - }), + client + .MarketsControllerGetMarkets({ + params: { + providerId: selectedProvider.id as + | "hyperliquid" + | "hyperliquid-xyz", + offset: (index + 1) * DEFAULT_LIMIT, + limit: DEFAULT_LIMIT, + }, + }) + .pipe(Effect.option), ), { concurrency: "unbounded" }, - ); + ).pipe(Effect.map(_Array.getSomes)); return [ ...(firstPage.items ?? []), @@ -98,22 +107,26 @@ export const refreshMarketsAtom = runtimeAtom.atom( const selectedProvider = yield* ctx.result(selectedProviderAtom); yield* Stream.fromSchedule( - Schedule.forever.pipe(Schedule.addDelay(() => Duration.minutes(1))), + Schedule.forever.pipe( + Schedule.addDelay(() => Effect.succeed(Duration.minutes(1))), + ), ).pipe( Stream.mapEffect(() => getAllMarkets(selectedProvider)), Stream.tap((markets) => ctx.result(marketsAtom).pipe( - Effect.tap((prevMarkets) => { - markets.forEach((market) => { - const prevMarket = Record.get(prevMarkets, market.id); - - if (prevMarket._tag === "None") { - return; - } - - prevMarket.value.set(market); - }); - }), + Effect.tap((prevMarkets) => + Effect.sync(() => { + markets.forEach((market) => { + const prevMarket = Record.get(prevMarkets, market.id); + + if (prevMarket._tag === "None") { + return; + } + + prevMarket.value.set(market); + }); + }), + ), ), ), Stream.runDrain, diff --git a/packages/common/src/atoms/order-form-atoms.ts b/packages/common/src/atoms/order-form-atoms.ts index ae438cd..7c03c82 100644 --- a/packages/common/src/atoms/order-form-atoms.ts +++ b/packages/common/src/atoms/order-form-atoms.ts @@ -1,6 +1,8 @@ -import { Atom, Registry, Result } from "@effect-atom/atom-react"; import { FormBuilder, FormReact } from "@lucas-barake/effect-form-react"; import { Number as _Number, Effect, Schema } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Atom from "effect/unstable/reactivity/Atom"; +import * as Registry from "effect/unstable/reactivity/AtomRegistry"; import { AmountField, type TPOrSLSettings } from "../components"; import { isWalletConnected, type WalletConnected } from "../domain"; import { @@ -15,12 +17,7 @@ import { round, valueFromPercent, } from "../lib"; -import { - ApiClientService, - ApiSchemas, - type ApiTypes, - runtimeAtom, -} from "../services"; +import { ApiClientService, ApiSchemas, runtimeAtom } from "../services"; import { actionAtom } from "./actions-atoms"; import { tpSlArgument } from "./edit-position-atoms"; import { selectedProviderBalancesAtom } from "./portfolio-atoms"; @@ -32,12 +29,11 @@ export const ORDER_SLIDER_STOPS = [0, 25, 50, 75, 100]; // Types export type OrderType = "market" | "limit"; -export type OrderSide = ApiTypes.PositionSide; +export type OrderSide = "long" | "short"; // Schemas -export const LeverageRangesSchema = Schema.Data( - ApiSchemas.MarketDto.fields.leverageRange, -).pipe(Schema.brand("LeverageRange")); +export const LeverageRangesSchema = + ApiSchemas.MarketDto.fields.leverageRange.pipe(Schema.brand("LeverageRange")); // Order Type Atom export const orderTypeAtom = Atom.make("market"); @@ -84,8 +80,12 @@ export const orderFormAtom = Atom.family( .addField( "Amount", Schema.NumberFromString.pipe( - Schema.annotations({ message: () => "Invalid amount" }), - Schema.greaterThan(0, { message: () => "Must be greater than 0" }), + Schema.annotate({ message: "Invalid amount" }), + Schema.check( + Schema.isGreaterThan(0, { + message: "Must be greater than 0", + }), + ), ), ) .refineEffect((values) => @@ -96,7 +96,7 @@ export const orderFormAtom = Atom.family( .pipe(Result.getOrElse(() => null)); if (!isWalletConnected(wallet)) { - return yield* Effect.dieMessage("No wallet"); + return yield* Effect.die(new Error("No wallet")); } const providerBalance = registry @@ -104,7 +104,7 @@ export const orderFormAtom = Atom.family( .pipe(Result.getOrElse(() => null)); if (!providerBalance) { - return { path: ["Amount"], message: "Missing provider balance" }; + return { path: ["Amount"], issue: "Missing provider balance" }; } const leverage = registry.get(leverageAtom(leverageRanges)); @@ -116,7 +116,7 @@ export const orderFormAtom = Atom.family( if (requiredMargin > providerBalance.availableBalance) { return { path: ["Amount"], - message: "Insufficient balance", + issue: "Insufficient balance", }; } }), @@ -133,7 +133,7 @@ export const orderFormAtom = Atom.family( }: { wallet: WalletConnected; market: ApiSchemas.MarketDto; - side: ApiTypes.PositionSide; + side: OrderSide; }, { decoded }, ) => @@ -146,7 +146,7 @@ export const orderFormAtom = Atom.family( .pipe(Result.getOrElse(() => null)); if (!selectedProvider) { - return yield* Effect.dieMessage("No selected provider"); + return yield* Effect.die(new Error("No selected provider")); } const leverage = registry.get(leverageAtom(leverageRanges)); @@ -160,18 +160,20 @@ export const orderFormAtom = Atom.family( orderType === "limit" ? registry.get(limitPriceAtom) : undefined; const action = yield* client.ActionsControllerExecuteAction({ - providerId: selectedProvider.id, - address: wallet.currentAccount.address, - action: "open", - args: { - marketId: market.id, - side, - size: decoded.Amount.toString(), - marginMode: "isolated", - ...(stopLossPrice && { stopLossPrice }), - ...(takeProfitPrice && { takeProfitPrice }), - ...(leverage && { leverage }), - ...(limitPrice && { limitPrice }), + payload: { + providerId: selectedProvider.id, + address: wallet.currentAccount.address, + action: "open", + args: { + marketId: market.id, + side, + size: decoded.Amount.toString(), + marginMode: "isolated", + ...(stopLossPrice && { stopLossPrice }), + ...(takeProfitPrice && { takeProfitPrice }), + ...(leverage && { leverage }), + ...(limitPrice && { limitPrice }), + }, }, }); @@ -195,7 +197,7 @@ export const getOrderCalculations = ( amount: number, leverage: number, market: ApiSchemas.MarketDto, - side: ApiTypes.PositionSide, + side: OrderSide, ) => { const cryptoAmount = calcBaseAmountFromUsd({ usdAmount: amount, diff --git a/packages/common/src/atoms/orders-pending-actions-atom.ts b/packages/common/src/atoms/orders-pending-actions-atom.ts index ebda7bc..3555751 100644 --- a/packages/common/src/atoms/orders-pending-actions-atom.ts +++ b/packages/common/src/atoms/orders-pending-actions-atom.ts @@ -1,5 +1,7 @@ -import { Atom, Registry, Result } from "@effect-atom/atom-react"; import { Effect } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Atom from "effect/unstable/reactivity/Atom"; +import * as Registry from "effect/unstable/reactivity/AtomRegistry"; import type { WalletAccount } from "../domain/wallet"; import { ApiClientService } from "../services/api-client"; import { runtimeAtom } from "../services/runtime"; @@ -20,16 +22,18 @@ export const cancelOrderAtom = Atom.family((orderId: string) => .pipe(Result.getOrElse(() => null)); if (!selectedProvider) { - return yield* Effect.dieMessage("No selected provider"); + return yield* Effect.die(new Error("No selected provider")); } const action = yield* client.ActionsControllerExecuteAction({ - providerId: selectedProvider.id, - address: args.walletAddress, - action: "cancelOrder", - args: { - orderId, - marketId: args.marketId, + payload: { + providerId: selectedProvider.id, + address: args.walletAddress, + action: "cancelOrder", + args: { + orderId, + marketId: args.marketId, + }, }, }); diff --git a/packages/common/src/atoms/portfolio-atoms.ts b/packages/common/src/atoms/portfolio-atoms.ts index 265c6f6..634a3e3 100644 --- a/packages/common/src/atoms/portfolio-atoms.ts +++ b/packages/common/src/atoms/portfolio-atoms.ts @@ -1,5 +1,13 @@ -import { Atom, AtomRef } from "@effect-atom/atom-react"; -import { Duration, Effect, Option, Record, Schema } from "effect"; +import { + Array as _Array, + Duration, + Effect, + Option, + Record, + Schema, +} from "effect"; +import * as Atom from "effect/unstable/reactivity/Atom"; +import * as AtomRef from "effect/unstable/reactivity/AtomRef"; import { WalletAccountAddress } from "../domain"; import type { WalletAccount } from "../domain/wallet"; import { ApiClientService } from "../services/api-client"; @@ -7,7 +15,6 @@ import { runtimeAtom, withReactivity } from "../services/runtime"; import { midPriceAtom } from "./hyperliquid-atoms"; import { marketsBySymbolAtom } from "./markets-atoms"; import { providersAtom, selectedProviderAtom } from "./providers-atoms"; -import { withRefreshAfter } from "./utils"; export const portfolioReactivityKeys = { positions: "positions", @@ -29,8 +36,10 @@ export const positionsAtom = Atom.family( const selectedProvider = yield* ctx.result(selectedProviderAtom); const positions = yield* client.PortfolioControllerGetPositions({ - address: walletAddress, - providerId: selectedProvider.id, + payload: { + address: walletAddress, + providerId: selectedProvider.id, + }, }); return Record.fromIterableBy( @@ -41,7 +50,7 @@ export const positionsAtom = Atom.family( ) .pipe( withReactivity([portfolioReactivityKeys.positions]), - withRefreshAfter(Duration.minutes(1)), + Atom.withRefresh(Duration.minutes(1)), Atom.keepAlive, ), ); @@ -55,14 +64,16 @@ export const ordersAtom = Atom.family( const selectedProvider = yield* ctx.result(selectedProviderAtom); return yield* client.PortfolioControllerGetOrders({ - address: walletAddress, - providerId: selectedProvider.id, + payload: { + address: walletAddress, + providerId: selectedProvider.id, + }, }); }), ) .pipe( withReactivity([portfolioReactivityKeys.orders]), - withRefreshAfter(Duration.minutes(1)), + Atom.withRefresh(Duration.minutes(1)), Atom.keepAlive, ), ); @@ -75,20 +86,24 @@ export const providersBalancesAtom = Atom.family( const providers = yield* get.result(providersAtom); const client = yield* ApiClientService; - return yield* Effect.allSuccesses( + return yield* Effect.all( providers.map((provider) => - client.PortfolioControllerGetBalances({ - address: walletAddress, - providerId: provider.id, - }), + client + .PortfolioControllerGetBalances({ + payload: { + address: walletAddress, + providerId: provider.id, + }, + }) + .pipe(Effect.option), ), { concurrency: "unbounded" }, - ); + ).pipe(Effect.map(_Array.getSomes)); }), ) .pipe( withReactivity([portfolioReactivityKeys.providersBalances]), - withRefreshAfter(Duration.minutes(1)), + Atom.withRefresh(Duration.minutes(1)), Atom.keepAlive, ), ); @@ -102,14 +117,16 @@ export const selectedProviderBalancesAtom = Atom.family( const client = yield* ApiClientService; return yield* client.PortfolioControllerGetBalances({ - address: walletAddress, - providerId: selectedProvider.id, + payload: { + address: walletAddress, + providerId: selectedProvider.id, + }, }); }), ) .pipe( withReactivity([portfolioReactivityKeys.selectedProviderBalances]), - withRefreshAfter(Duration.minutes(1)), + Atom.withRefresh(Duration.minutes(1)), Atom.keepAlive, ), ); @@ -145,7 +162,7 @@ export const updatePositionsMidPriceAtom = Atom.family( export const GetCurrentPositionRefArgs = Schema.Struct({ marketId: Schema.String, address: WalletAccountAddress, -}).pipe(Schema.Data, Schema.brand("GetCurrentPositionRefArgs")); +}).pipe(Schema.brand("GetCurrentPositionRefArgs")); export const makeGetCurrentPositionRefArgs = Schema.decodeSync( GetCurrentPositionRefArgs, diff --git a/packages/common/src/atoms/position-pending-actions-atom.ts b/packages/common/src/atoms/position-pending-actions-atom.ts index 16458fa..f102ce9 100644 --- a/packages/common/src/atoms/position-pending-actions-atom.ts +++ b/packages/common/src/atoms/position-pending-actions-atom.ts @@ -1,5 +1,6 @@ -import { Registry, Result } from "@effect-atom/atom-react"; import { Effect } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Registry from "effect/unstable/reactivity/AtomRegistry"; import type { WalletConnected } from "../domain/wallet"; import { ApiClientService } from "../services/api-client"; import type { PositionDto } from "../services/api-client/api-schemas"; @@ -27,17 +28,19 @@ export const updateLeverageAtom = runtimeAtom.fn( .pipe(Result.getOrElse(() => null)); if (!selectedProvider) { - return yield* Effect.dieMessage("No selected provider"); + return yield* Effect.die(new Error("No selected provider")); } const action = yield* client.ActionsControllerExecuteAction({ - providerId: selectedProvider.id, - address: wallet.currentAccount.address, - action: "updateLeverage", - args: { - marketId: position.marketId, - leverage: newLeverage, - marginMode: "isolated", + payload: { + providerId: selectedProvider.id, + address: wallet.currentAccount.address, + action: "updateLeverage", + args: { + marketId: position.marketId, + leverage: newLeverage, + marginMode: "isolated", + }, }, }); diff --git a/packages/common/src/atoms/providers-atoms.ts b/packages/common/src/atoms/providers-atoms.ts index 0765114..3543093 100644 --- a/packages/common/src/atoms/providers-atoms.ts +++ b/packages/common/src/atoms/providers-atoms.ts @@ -1,5 +1,6 @@ -import { Atom, Result } from "@effect-atom/atom-react"; import { Array as _Array, Data, Effect } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Atom from "effect/unstable/reactivity/Atom"; import { ApiClientService } from "../services/api-client"; import type { ProviderDto } from "../services/api-client/api-schemas"; import { runtimeAtom, withReactivity } from "../services/runtime"; @@ -14,8 +15,8 @@ export const providersReactivityKeysArray = Object.values( export const providersAtom = runtimeAtom .atom( - ApiClientService.pipe( - Effect.andThen((client) => client.ProvidersControllerGetProviders()), + ApiClientService.use((client) => + client.ProvidersControllerGetProviders(undefined), ), ) .pipe(withReactivity([providersReactivityKeys.providers]), Atom.keepAlive); diff --git a/packages/common/src/atoms/tokens-atoms.ts b/packages/common/src/atoms/tokens-atoms.ts index 0b96e8c..974c4be 100644 --- a/packages/common/src/atoms/tokens-atoms.ts +++ b/packages/common/src/atoms/tokens-atoms.ts @@ -1,7 +1,14 @@ -import { HttpClientRequest, HttpClientResponse } from "@effect/platform"; -import { Atom } from "@effect-atom/atom-react"; import { EvmNetworks } from "@stakekit/common"; -import { Array as _Array, Effect, Option, pipe, Record, Schema } from "effect"; +import { + Array as _Array, + Result as _Result, + Effect, + pipe, + Record, + Schema, +} from "effect"; +import { HttpClientRequest, HttpClientResponse } from "effect/unstable/http"; +import * as Atom from "effect/unstable/reactivity/Atom"; import type { TokenBalance } from "../domain/types"; import type { WalletAccount } from "../domain/wallet"; import { ConfigService } from "../services/config"; @@ -105,8 +112,8 @@ export const moralisTokenBalancesAtom = Atom.family( Effect.map((response) => _Array.filterMap(response.result, (token) => !token.usd_price - ? Option.none() - : Option.some({ + ? _Result.failVoid + : _Result.succeed({ price: token.usd_price, amount: token.balance_formatted, token: { @@ -124,7 +131,11 @@ export const moralisTokenBalancesAtom = Atom.family( ), ), (effects) => - Effect.allSuccesses(effects, { concurrency: "unbounded" }).pipe( + Effect.all( + effects.map((effect) => effect.pipe(Effect.option)), + { concurrency: "unbounded" }, + ).pipe( + Effect.map(_Array.getSomes), Effect.map((res) => pipe( Record.fromIterableBy(res, (r) => r.network), @@ -133,8 +144,6 @@ export const moralisTokenBalancesAtom = Atom.family( ), ), ), - - Effect.ensureSuccessType(), ); }), ) diff --git a/packages/common/src/atoms/utils.ts b/packages/common/src/atoms/utils.ts deleted file mode 100644 index e890b41..0000000 --- a/packages/common/src/atoms/utils.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Atom } from "@effect-atom/atom-react"; -import { type Duration, Effect, Schedule } from "effect"; -import { dual } from "effect/Function"; - -export const withRefreshAfter = dual< - (refreshAfter: Duration.Duration) => (atom: Atom.Atom) => Atom.Atom, - (atom: Atom.Atom, refreshAfter: Duration.Duration) => Atom.Atom ->(2, (atom, refreshAfter) => { - return Atom.transform(atom, (ctx) => { - const cancelRefresh = Effect.sleep(refreshAfter).pipe( - Effect.andThen(Effect.sync(() => ctx.refresh(atom))), - Effect.repeat({ - schedule: Schedule.forever.pipe(Schedule.addDelay(() => refreshAfter)), - }), - Effect.runCallback, - ); - - ctx.addFinalizer(cancelRefresh); - - return ctx.get(atom); - }); -}); diff --git a/packages/common/src/atoms/wallet-atom.ts b/packages/common/src/atoms/wallet-atom.ts index 86fa6f7..7120cf2 100644 --- a/packages/common/src/atoms/wallet-atom.ts +++ b/packages/common/src/atoms/wallet-atom.ts @@ -1,5 +1,5 @@ -import { Atom } from "@effect-atom/atom-react"; import { Effect, Stream } from "effect"; +import * as Atom from "effect/unstable/reactivity/Atom"; import type { BrowserWalletConnected, LedgerWalletConnected, @@ -8,9 +8,9 @@ import { runtimeAtom } from "../services/runtime"; import { WalletService } from "../services/wallet/wallet-service"; export const walletAtom = runtimeAtom.atom( - WalletService.pipe( - Effect.andThen((ws) => ws.walletStream), - Stream.unwrap, + Stream.unwrap( + WalletService.use((ws) => Effect.succeed(ws.walletStream)), + ).pipe( Stream.changesWith((a, b) => { if (a.status !== b.status) { return false; diff --git a/packages/common/src/components/molecules/Chart/index.tsx b/packages/common/src/components/molecules/Chart/index.tsx index a6b06be..831ecc4 100644 --- a/packages/common/src/components/molecules/Chart/index.tsx +++ b/packages/common/src/components/molecules/Chart/index.tsx @@ -1,4 +1,4 @@ -import { useAtomValue } from "@effect-atom/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import { Option } from "effect"; import { TriangleAlertIcon } from "lucide-react"; import { useLayoutEffect, useRef, useState } from "react"; diff --git a/packages/common/src/components/molecules/Chart/state.ts b/packages/common/src/components/molecules/Chart/state.ts index 66bfd7c..3a3a3ea 100644 --- a/packages/common/src/components/molecules/Chart/state.ts +++ b/packages/common/src/components/molecules/Chart/state.ts @@ -1,5 +1,5 @@ -import { Atom } from "@effect-atom/atom-react"; import { Array as _Array, Option, Record, Schema } from "effect"; +import * as Atom from "effect/unstable/reactivity/Atom"; import tradingViewSymbols from "../../../assets/tradingview-symbols.json" with { type: "json", }; diff --git a/packages/common/src/components/molecules/address-switcher.tsx b/packages/common/src/components/molecules/address-switcher.tsx index 10b02a4..a80c773 100644 --- a/packages/common/src/components/molecules/address-switcher.tsx +++ b/packages/common/src/components/molecules/address-switcher.tsx @@ -1,4 +1,4 @@ -import { useAtomSet } from "@effect-atom/atom-react"; +import { useAtomSet } from "@effect/atom-react"; import { useDisconnect } from "@reown/appkit/react"; import { Match } from "effect"; import { Check, ChevronDown, Copy, LogOut, Wallet } from "lucide-react"; diff --git a/packages/common/src/components/molecules/limit-price-dialog.tsx b/packages/common/src/components/molecules/limit-price-dialog.tsx index 6acff5f..6e21a8b 100644 --- a/packages/common/src/components/molecules/limit-price-dialog.tsx +++ b/packages/common/src/components/molecules/limit-price-dialog.tsx @@ -1,8 +1,8 @@ import type { DialogRootActions } from "@base-ui/react/dialog"; -import { useAtomSet } from "@effect-atom/atom-react"; +import { useAtomSet } from "@effect/atom-react"; import { FormBuilder, FormReact } from "@lucas-barake/effect-form-react"; import clsx from "clsx"; -import { Option, Schema } from "effect"; +import { Option, Schema, SchemaTransformation } from "effect"; import { X } from "lucide-react"; import { useRef } from "react"; import { applyPercentDelta, round } from "../../lib/math"; @@ -144,16 +144,20 @@ function LimitPriceDialogContent({ const limitPriceFormBuilder = FormBuilder.empty.addField( "Amount", - Schema.Union( - Schema.transform(Schema.Literal(""), Schema.Null, { - strict: true, - decode: () => null, - encode: () => "" as const, - }), + Schema.Union([ + Schema.Literal("").pipe( + Schema.decodeTo( + Schema.Null, + SchemaTransformation.transform({ + decode: () => null, + encode: () => "", + }), + ), + ), Schema.NumberFromString.pipe( - Schema.annotations({ message: () => "Invalid amount" }), + Schema.annotate({ message: "Invalid amount" }), ), - ), + ]), ); const LimitPriceForm = FormReact.make(limitPriceFormBuilder, { diff --git a/packages/common/src/components/molecules/sign-transactions/index.tsx b/packages/common/src/components/molecules/sign-transactions/index.tsx index 0236ee0..99495b3 100644 --- a/packages/common/src/components/molecules/sign-transactions/index.tsx +++ b/packages/common/src/components/molecules/sign-transactions/index.tsx @@ -29,7 +29,9 @@ export function TransactionProgress({ const totalTransactions = transactions.length; if (error) { - console.log(Cause.pretty(Cause.fail(error.cause))); + console.log( + Cause.pretty(Cause.fail("cause" in error ? error.cause : error)), + ); } return ( diff --git a/packages/common/src/context/appkit.tsx b/packages/common/src/context/appkit.tsx index 5dfd993..6408784 100644 --- a/packages/common/src/context/appkit.tsx +++ b/packages/common/src/context/appkit.tsx @@ -1,5 +1,6 @@ -import { Result, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { WagmiProvider } from "wagmi"; import { configAtom } from "../atoms/config-atom"; import { walletAtom } from "../atoms/wallet-atom"; diff --git a/packages/common/src/domain/signer.ts b/packages/common/src/domain/signer.ts index 850c119..5b78354 100644 --- a/packages/common/src/domain/signer.ts +++ b/packages/common/src/domain/signer.ts @@ -7,13 +7,15 @@ export const WalletAccountAddress = Schema.String.pipe( ); const BrowserWalletAccount = Schema.Struct({ + _kind: Schema.tagDefaultOmit("browserWalletAccount"), address: WalletAccountAddress, -}).pipe(Schema.attachPropertySignature("_kind", "browserWalletAccount")); +}); const LedgerWalletAccount = Schema.Struct({ + _kind: Schema.tagDefaultOmit("ledgerWalletAccount"), id: Schema.String.pipe(Schema.brand("WalletAccountId")), address: WalletAccountAddress, -}).pipe(Schema.attachPropertySignature("_kind", "ledgerWalletAccount")); +}); export const makeBrowserWalletAccount = Schema.decodeSync(BrowserWalletAccount); export const makeLedgerWalletAccount = Schema.decodeSync(LedgerWalletAccount); @@ -21,10 +23,10 @@ export const makeLedgerWalletAccount = Schema.decodeSync(LedgerWalletAccount); export type BrowserWalletAccount = typeof BrowserWalletAccount.Type; export type LedgerWalletAccount = typeof LedgerWalletAccount.Type; -export const WalletAccount = Schema.Union( +export const WalletAccount = Schema.Union([ BrowserWalletAccount, LedgerWalletAccount, -); +]); export type WalletAccount = typeof WalletAccount.Type; diff --git a/packages/common/src/domain/tokens.ts b/packages/common/src/domain/tokens.ts index a0a8b96..e332b0a 100644 --- a/packages/common/src/domain/tokens.ts +++ b/packages/common/src/domain/tokens.ts @@ -1,10 +1,20 @@ -import { Equal, Schema } from "effect"; -import { Networks } from "../services/api-client/api-schemas"; +import { Equal, Schema, SchemaTransformation } from "effect"; +import { TokenIdentifierDto } from "../services/api-client/api-schemas"; + +const LowercaseString = Schema.String.pipe( + Schema.decodeTo( + Schema.String.check(Schema.isLowercased()), + SchemaTransformation.transform({ + decode: (input) => input.toLowerCase(), + encode: (input) => input, + }), + ), +); const Token = Schema.Struct({ - network: Networks, - address: Schema.optional(Schema.Lowercase), -}).pipe(Schema.Data, Schema.brand("Token")); + network: TokenIdentifierDto.fields.network, + address: Schema.optional(LowercaseString), +}).pipe(Schema.brand("Token")); export const makeToken = Schema.decodeSync(Token); @@ -18,7 +28,7 @@ export const ethNativeToken = makeToken({ address: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", }); -export const tokenIsSame = Equal.equivalence(); +export const tokenIsSame = Equal.asEquivalence(); export const isArbUsdcToken = (otherToken: typeof Token.Type) => tokenIsSame(otherToken, arbUsdcToken); diff --git a/packages/common/src/domain/transactions.ts b/packages/common/src/domain/transactions.ts index 82dcd60..2d158c9 100644 --- a/packages/common/src/domain/transactions.ts +++ b/packages/common/src/domain/transactions.ts @@ -1,6 +1,6 @@ import { Schema } from "effect"; -const HexString = Schema.TemplateLiteral(Schema.Literal("0x"), Schema.String); +const HexString = Schema.TemplateLiteral([Schema.Literal("0x"), Schema.String]); export const EvmTx = Schema.Struct({ from: Schema.String, @@ -13,19 +13,15 @@ export const EvmTx = Schema.Struct({ }); export const EIP712Tx = Schema.Struct({ - domain: Schema.Struct( - { chainId: Schema.Number }, - { - key: Schema.String, - value: Schema.Unknown, - }, - ), - types: Schema.Record({ key: Schema.String, value: Schema.Unknown }), - message: Schema.Record({ key: Schema.String, value: Schema.Unknown }), + domain: Schema.StructWithRest(Schema.Struct({ chainId: Schema.Number }), [ + Schema.Record(Schema.String, Schema.Unknown), + ]), + types: Schema.Record(Schema.String, Schema.Unknown), + message: Schema.Record(Schema.String, Schema.Unknown), primaryType: Schema.String, }); -export const Transaction = Schema.Union(EvmTx, EIP712Tx); +export const Transaction = Schema.Union([EvmTx, EIP712Tx]); export type Transaction = typeof Transaction.Type; diff --git a/packages/common/src/domain/types.ts b/packages/common/src/domain/types.ts index 226d817..037d656 100644 --- a/packages/common/src/domain/types.ts +++ b/packages/common/src/domain/types.ts @@ -1,4 +1,6 @@ -import type { TokenDto } from "../services/api-client/api-schemas"; +import type { MarketDto } from "../services/api-client/api-schemas"; + +export type TokenDto = MarketDto["baseAsset"]; export type TokenString = `${TokenDto["network"]}-${TokenDto["address"]}`; diff --git a/packages/common/src/domain/wallet.ts b/packages/common/src/domain/wallet.ts index 01cf97b..b5db992 100644 --- a/packages/common/src/domain/wallet.ts +++ b/packages/common/src/domain/wallet.ts @@ -1,7 +1,7 @@ -import type { HttpClientError } from "@effect/platform"; import type { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; +import type { Schema } from "effect"; import { Data, type Effect, type Stream } from "effect"; -import type { ParseError } from "effect/ParseResult"; +import type { HttpClientError } from "effect/unstable/http"; import type { ActionDto, SKClientError, @@ -33,7 +33,7 @@ export type SignTransactionsState = { error: | null | HttpClientError.HttpClientError - | ParseError + | Schema.SchemaError // biome-ignore lint/suspicious/noExplicitAny: any is fine here | SKClientError | DeserializeTransactionError diff --git a/packages/common/src/hooks/use-close-position.ts b/packages/common/src/hooks/use-close-position.ts index d3c24ce..b08dc9d 100644 --- a/packages/common/src/hooks/use-close-position.ts +++ b/packages/common/src/hooks/use-close-position.ts @@ -1,4 +1,4 @@ -import { useAtomSet, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { closePercentageAtom, submitCloseAtom, diff --git a/packages/common/src/hooks/use-deposit-form.ts b/packages/common/src/hooks/use-deposit-form.ts index 8dad98f..63cc544 100644 --- a/packages/common/src/hooks/use-deposit-form.ts +++ b/packages/common/src/hooks/use-deposit-form.ts @@ -1,10 +1,4 @@ -import { - Atom, - Registry, - Result, - useAtomSet, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { FormBuilder, FormReact } from "@lucas-barake/effect-form-react"; import { Array as _Array, @@ -14,6 +8,9 @@ import { Record, Schema, } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Atom from "effect/unstable/reactivity/Atom"; +import * as Registry from "effect/unstable/reactivity/AtomRegistry"; import { actionAtom, moralisTokenBalancesAtom, @@ -56,8 +53,12 @@ export const depositFormBuilder = FormBuilder.empty .addField( "Amount", Schema.NumberFromString.pipe( - Schema.annotations({ message: () => "Invalid amount" }), - Schema.greaterThan(0, { message: () => "Must be greater than 0" }), + Schema.annotate({ message: "Invalid amount" }), + Schema.check( + Schema.isGreaterThan(0, { + message: "Must be greater than 0", + }), + ), ), ) .refineEffect((values) => @@ -77,7 +78,7 @@ export const depositFormBuilder = FormBuilder.empty .pipe(Result.getOrElse(() => null)); if (!tokenBalance) { - return { path: ["Amount"], message: "Missing token balance" }; + return { path: ["Amount"], issue: "Missing token balance" }; } const cryptoAmount = calcBaseAmountFromUsd({ @@ -88,11 +89,11 @@ export const depositFormBuilder = FormBuilder.empty const usdMin = isArbUsdcToken(makeToken(tokenBalance.token)) ? 5 : 10; if (values.Amount < usdMin) { - return { path: ["Amount"], message: `Minimum deposit is $${usdMin}` }; + return { path: ["Amount"], issue: `Minimum deposit is $${usdMin}` }; } if (Number(tokenBalance.amount) < cryptoAmount) { - return { path: ["Amount"], message: "Insufficient balance" }; + return { path: ["Amount"], issue: "Insufficient balance" }; } }), ); @@ -106,7 +107,7 @@ const depositOnSubmit = Effect.gen(function* () { const wallet = registry.get(walletAtom).pipe(Result.getOrElse(() => null)); if (!isWalletConnected(wallet)) { - return yield* Effect.dieMessage("No wallet"); + return yield* Effect.die(new Error("No wallet")); } const selectedTokenBalance = registry @@ -114,7 +115,7 @@ const depositOnSubmit = Effect.gen(function* () { .pipe(Result.getOrElse(() => null)); if (!selectedTokenBalance) { - return yield* Effect.dieMessage("No selected token balance"); + return yield* Effect.die(new Error("No selected token balance")); } const selectedProvider = registry @@ -122,7 +123,7 @@ const depositOnSubmit = Effect.gen(function* () { .pipe(Result.getOrElse(() => null)); if (!selectedProvider) { - return yield* Effect.dieMessage("No selected provider"); + return yield* Effect.die(new Error("No selected provider")); } return { client, wallet, selectedTokenBalance, selectedProvider }; @@ -145,16 +146,20 @@ export const createDepositForm = ( }); const action = yield* client.ActionsControllerExecuteAction({ - providerId: selectedProvider.id, - address: wallet.currentAccount.address, - action: "fund", - args: { - amount: cryptoAmount.toString(), - fromToken: { - network: selectedTokenBalance.token.network, - ...(!isEthNativeToken(makeToken(selectedTokenBalance.token)) && { - address: selectedTokenBalance.token.address, - }), + payload: { + providerId: selectedProvider.id, + address: wallet.currentAccount.address, + action: "fund", + args: { + amount: cryptoAmount.toString(), + fromToken: { + network: selectedTokenBalance.token.network, + ...(!isEthNativeToken( + makeToken(selectedTokenBalance.token), + ) && { + address: selectedTokenBalance.token.address, + }), + }, }, }, }); diff --git a/packages/common/src/hooks/use-edit-position.ts b/packages/common/src/hooks/use-edit-position.ts index 3e64ff0..db328aa 100644 --- a/packages/common/src/hooks/use-edit-position.ts +++ b/packages/common/src/hooks/use-edit-position.ts @@ -1,4 +1,4 @@ -import { useAtom } from "@effect-atom/atom-react"; +import { useAtom } from "@effect/atom-react"; import { editSLTPAtom } from "../atoms/edit-position-atoms"; import { updateLeverageAtom } from "../atoms/position-pending-actions-atom"; diff --git a/packages/common/src/hooks/use-optional-atom-ref.ts b/packages/common/src/hooks/use-optional-atom-ref.ts index 3dba7d5..dc462fc 100644 --- a/packages/common/src/hooks/use-optional-atom-ref.ts +++ b/packages/common/src/hooks/use-optional-atom-ref.ts @@ -1,4 +1,4 @@ -import type { AtomRef } from "@effect-atom/atom-react"; +import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; import React from "react"; export const useOptionalAtomRef = ( diff --git a/packages/common/src/hooks/use-order-form.ts b/packages/common/src/hooks/use-order-form.ts index 7f5c7a6..8e02087 100644 --- a/packages/common/src/hooks/use-order-form.ts +++ b/packages/common/src/hooks/use-order-form.ts @@ -1,5 +1,6 @@ -import { Result, useAtomSet, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { Option, Schema } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { calculateOrderPercentage, calculateOrderPositionSize, @@ -7,6 +8,7 @@ import { LeverageRangesSchema, leverageAtom, limitPriceAtom, + type OrderSide, orderFormAtom, orderSideAtom, orderTypeAtom, @@ -18,7 +20,7 @@ import { selectedProviderBalancesAtom, } from "../atoms/portfolio-atoms"; import type { WalletConnected } from "../domain"; -import type { ApiSchemas, ApiTypes } from "../services"; +import type { ApiSchemas } from "../services"; import { useOptionalAtomRef } from "./use-optional-atom-ref"; export const useOrderType = () => { @@ -216,7 +218,7 @@ export const useOrderPercentage = ( export const useOrderCalculations = ( market: ApiSchemas.MarketDto, - side: ApiTypes.PositionSide, + side: OrderSide, leverageRanges: typeof LeverageRangesSchema.Type, ) => { const { amount } = useOrderAmount(leverageRanges); diff --git a/packages/common/src/hooks/use-position-actions.ts b/packages/common/src/hooks/use-position-actions.ts index 0bbd547..4797631 100644 --- a/packages/common/src/hooks/use-position-actions.ts +++ b/packages/common/src/hooks/use-position-actions.ts @@ -17,10 +17,10 @@ const SetTpAndSlSchema = Schema.Struct({ }), }); -const PendingActionSchema = Schema.Union( +const PendingActionSchema = Schema.Union([ UpdateLeverageSchema, SetTpAndSlSchema, -); +]); export const getPositionActions = ( pendingActions: PositionDto["pendingActions"], diff --git a/packages/common/src/hooks/use-tp-sl-orders.ts b/packages/common/src/hooks/use-tp-sl-orders.ts index aabd670..15d4929 100644 --- a/packages/common/src/hooks/use-tp-sl-orders.ts +++ b/packages/common/src/hooks/use-tp-sl-orders.ts @@ -2,7 +2,7 @@ import { Match, Option, Schema } from "effect"; import type { OrderDto } from "../services/api-client/api-schemas"; const TpSlOrderSchema = Schema.Struct({ - type: Schema.Literal("take_profit", "stop_loss"), + type: Schema.Literals(["take_profit", "stop_loss"]), limitPrice: Schema.optional(Schema.Number), triggerPrice: Schema.optional(Schema.Number), }); diff --git a/packages/common/src/hooks/use-withdraw-form.ts b/packages/common/src/hooks/use-withdraw-form.ts index 3be7bab..857fdcb 100644 --- a/packages/common/src/hooks/use-withdraw-form.ts +++ b/packages/common/src/hooks/use-withdraw-form.ts @@ -1,11 +1,8 @@ -import { - Registry, - Result, - useAtomSet, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { FormBuilder, FormReact } from "@lucas-barake/effect-form-react"; import { Effect, Option, Schema } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Registry from "effect/unstable/reactivity/AtomRegistry"; import { actionAtom, selectedProviderAtom, @@ -21,8 +18,12 @@ export const withdrawFormBuilder = FormBuilder.empty .addField( "Amount", Schema.NumberFromString.pipe( - Schema.annotations({ message: () => "Invalid amount" }), - Schema.greaterThan(0, { message: () => "Must be greater than 0" }), + Schema.annotate({ message: "Invalid amount" }), + Schema.check( + Schema.isGreaterThan(0, { + message: "Must be greater than 0", + }), + ), ), ) .refineEffect((values) => @@ -33,7 +34,7 @@ export const withdrawFormBuilder = FormBuilder.empty .pipe(Result.getOrElse(() => null)); if (!isWalletConnected(wallet)) { - return yield* Effect.dieMessage("No wallet"); + return yield* Effect.die(new Error("No wallet")); } const providerBalance = registry @@ -41,20 +42,20 @@ export const withdrawFormBuilder = FormBuilder.empty .pipe(Result.getOrElse(() => null)); if (!providerBalance) { - return { path: ["Amount"], message: "Missing provider balance" }; + return { path: ["Amount"], issue: "Missing provider balance" }; } if (providerBalance.availableBalance <= 0) { return { path: ["Amount"], - message: "No available balance to withdraw", + issue: "No available balance to withdraw", }; } if (values.Amount > providerBalance.availableBalance) { return { path: ["Amount"], - message: "Insufficient balance", + issue: "Insufficient balance", }; } }), @@ -69,7 +70,7 @@ const withdrawOnSubmit = Effect.gen(function* () { const wallet = registry.get(walletAtom).pipe(Result.getOrElse(() => null)); if (!isWalletConnected(wallet)) { - return yield* Effect.dieMessage("No wallet"); + return yield* Effect.die(new Error("No wallet")); } const selectedProvider = registry @@ -77,7 +78,7 @@ const withdrawOnSubmit = Effect.gen(function* () { .pipe(Result.getOrElse(() => null)); if (!selectedProvider) { - return yield* Effect.dieMessage("No selected provider"); + return yield* Effect.die(new Error("No selected provider")); } const providerBalance = registry @@ -85,7 +86,7 @@ const withdrawOnSubmit = Effect.gen(function* () { .pipe(Result.getOrElse(() => null)); if (!providerBalance) { - return yield* Effect.dieMessage("No provider balance"); + return yield* Effect.die(new Error("No provider balance")); } return { client, wallet, selectedProvider, providerBalance }; @@ -102,11 +103,13 @@ export const createWithdrawForm = ( const { client, wallet, selectedProvider } = yield* withdrawOnSubmit; const action = yield* client.ActionsControllerExecuteAction({ - providerId: selectedProvider.id, - address: wallet.currentAccount.address, - action: "withdraw", - args: { - amount: decoded.Amount.toString(), + payload: { + providerId: selectedProvider.id, + address: wallet.currentAccount.address, + action: "withdraw", + args: { + amount: decoded.Amount.toString(), + }, }, }); diff --git a/packages/common/src/lib/formatting.ts b/packages/common/src/lib/formatting.ts index b1feb7a..fe1cf8e 100644 --- a/packages/common/src/lib/formatting.ts +++ b/packages/common/src/lib/formatting.ts @@ -144,13 +144,13 @@ export function formatCompactUsdAmount(volume: number): string { * - `{ tp: "TP Off", sl: "SL Off" }` */ export function formatTPOrSLSettings(settings: TPOrSLSettings) { - const tp = Option.fromNullable(settings.takeProfit.percentage).pipe( + const tp = Option.fromNullishOr(settings.takeProfit.percentage).pipe( Option.filter((percentage) => percentage !== 0), Option.map((percentage) => `TP ${formatPercentage(percentage)}`), Option.getOrElse(() => "TP Off"), ); - const sl = Option.fromNullable(settings.stopLoss.percentage).pipe( + const sl = Option.fromNullishOr(settings.stopLoss.percentage).pipe( Option.filter((percentage) => percentage !== 0), Option.map((percentage) => `SL ${formatPercentage(percentage)}`), Option.getOrElse(() => "SL Off"), diff --git a/packages/common/src/lib/utils.ts b/packages/common/src/lib/utils.ts index 5b71b14..0edfd50 100644 --- a/packages/common/src/lib/utils.ts +++ b/packages/common/src/lib/utils.ts @@ -1,7 +1,6 @@ import { type ClassValue, clsx } from "clsx"; import { twMerge } from "tailwind-merge"; -import type { TokenString } from "../domain/types"; -import type { TokenDto } from "../services/api-client/api-schemas"; +import type { TokenDto, TokenString } from "../domain/types"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); diff --git a/packages/common/src/services/api-client/api-schemas.ts b/packages/common/src/services/api-client/api-schemas.ts index 17fcfdc..c13b0a3 100644 --- a/packages/common/src/services/api-client/api-schemas.ts +++ b/packages/common/src/services/api-client/api-schemas.ts @@ -1,991 +1,198 @@ -import type * as HttpClient from "@effect/platform/HttpClient" -import * as HttpClientError from "@effect/platform/HttpClientError" -import * as HttpClientRequest from "@effect/platform/HttpClientRequest" -import * as HttpClientResponse from "@effect/platform/HttpClientResponse" import * as Data from "effect/Data" import * as Effect from "effect/Effect" -import type { ParseError } from "effect/ParseResult" -import * as S from "effect/Schema" - -export class ProviderMetadataDto extends S.Class("ProviderMetadataDto")({ - /** -* Provider description -*/ -"description": S.String, - /** -* External link to the provider website -*/ -"externalLink": S.String, - /** -* Provider logo URI -*/ -"logoURI": S.String -}) {} - -/** -* Action type executed -*/ -export class PerpActionTypes extends S.Literal("open", "close", "updateLeverage", "stopLoss", "takeProfit", "cancelOrder", "editOrder", "fund", "withdraw", "approveAgent", "approveBuilderFee", "updateMargin", "setTpAndSl") {} - -export class ProviderDto extends S.Class("ProviderDto")({ - /** -* Provider identifier -*/ -"id": S.String, - /** -* Provider name -*/ -"name": S.String, - /** -* Network the provider operates on -*/ -"network": S.String, - /** -* Provider metadata (description, logo, links) -*/ -"metadata": ProviderMetadataDto, - "supportedActions": PerpActionTypes, - /** -* Argument schemas for each supported action (JSON Schema format) -*/ -"argumentSchemas": S.Record({ key: S.String, value: S.Unknown }) -}) {} - -export class ProvidersControllerGetProviders200 extends S.Array(ProviderDto) {} - -export class ProvidersControllerGetProviders401 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class ProvidersControllerGetProviders429 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }), - "retryAfter": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class ProvidersControllerGetProvider401 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class ProvidersControllerGetProvider429 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }), - "retryAfter": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class MarketsControllerGetMarketsParamsSortBy extends S.Literal("volume24h", "markPrice", "priceChangePercent24h") {} - -export class MarketsControllerGetMarketsParamsOrder extends S.Literal("asc", "desc") {} - -export class MarketsControllerGetMarketsParams extends S.Struct({ - "offset": S.optionalWith(S.Number.pipe(S.greaterThanOrEqualTo(0)), { nullable: true, default: () => 0 as const }), - "limit": S.optionalWith(S.Number.pipe(S.greaterThanOrEqualTo(1), S.lessThanOrEqualTo(500)), { nullable: true, default: () => 100 as const }), - "providerId": S.optionalWith(S.String, { nullable: true }), - "sortBy": S.optionalWith(MarketsControllerGetMarketsParamsSortBy, { nullable: true }), - "order": S.optionalWith(MarketsControllerGetMarketsParamsOrder, { nullable: true }) -}) {} - -/** -* Network identifier -*/ -export class Networks extends S.Literal("ethereum", "ethereum-goerli", "ethereum-holesky", "ethereum-sepolia", "ethereum-hoodi", "arbitrum", "base", "base-sepolia", "gnosis", "optimism", "polygon", "polygon-amoy", "starknet", "zksync", "linea", "unichain", "monad-testnet", "monad", "avalanche-c", "avalanche-c-atomic", "avalanche-p", "binance", "celo", "fantom", "harmony", "moonriver", "okc", "viction", "core", "sonic", "plasma", "katana", "hyperevm", "agoric", "akash", "axelar", "band-protocol", "bitsong", "canto", "chihuahua", "comdex", "coreum", "cosmos", "crescent", "cronos", "cudos", "desmos", "dydx", "evmos", "fetch-ai", "gravity-bridge", "injective", "irisnet", "juno", "kava", "ki-network", "mars-protocol", "nym", "okex-chain", "onomy", "osmosis", "persistence", "quicksilver", "regen", "secret", "sentinel", "sommelier", "stafi", "stargaze", "stride", "teritori", "tgrade", "umee", "sei", "mantra", "celestia", "saga", "zetachain", "dymension", "humansai", "neutron", "polkadot", "kusama", "westend", "bittensor", "aptos", "binancebeacon", "cardano", "near", "solana", "solana-devnet", "stellar", "stellar-testnet", "sui", "tezos", "tron", "ton", "ton-testnet", "hyperliquid") {} - -export class TokenDto extends S.Class("TokenDto")({ - /** -* Token symbol -*/ -"symbol": S.String, - /** -* Token name -*/ -"name": S.optionalWith(S.String, { nullable: true }), - "network": Networks, - /** -* Token decimals -*/ -"decimals": S.optionalWith(S.Number, { nullable: true }), - /** -* Token contract address (optional for native tokens) -*/ -"address": S.optionalWith(S.String, { nullable: true }), - /** -* Token logo URI -*/ -"logoURI": S.optionalWith(S.String, { nullable: true }) -}) {} - -export class MarketMetadataDto extends S.Class("MarketMetadataDto")({ - /** -* Market name -*/ -"name": S.String, - /** -* Market logo URI -*/ -"logoURI": S.String, - /** -* Market URL -*/ -"url": S.String -}) {} - -export class MarketDto extends S.Class("MarketDto")({ - /** -* Market ID -*/ -"id": S.String, - /** -* Provider ID -*/ -"providerId": S.String, - /** -* Base asset information -*/ -"baseAsset": TokenDto, - /** -* Quote asset information -*/ -"quoteAsset": TokenDto, - /** -* Leverage range [min, max] -*/ -"leverageRange": S.Array(S.Number), - /** -* Supported margin modes -*/ -"supportedMarginModes": S.Array(S.Literal("isolated", "cross")), - /** -* Current mark price -*/ -"markPrice": S.Number, - /** -* Oracle/index price -*/ -"oraclePrice": S.Number, - /** -* Absolute price change in 24h -*/ -"priceChange24h": S.Number, - /** -* Percentage price change in 24h -*/ -"priceChangePercent24h": S.Number, - /** -* 24h trading volume in quote asset (e.g., USDC) -*/ -"volume24h": S.Number, - /** -* Open interest in base asset units (e.g., number of ETH coins, not USD notional) -*/ -"openInterest": S.Number, - /** -* Maker fee rate -*/ -"makerFee": S.optionalWith(S.String, { nullable: true }), - /** -* Taker fee rate -*/ -"takerFee": S.optionalWith(S.String, { nullable: true }), - /** -* Current funding rate -*/ -"fundingRate": S.String, - /** -* Funding rate interval in hours -*/ -"fundingRateIntervalHours": S.Number, - /** -* Minimum position size in USD (notional) computed at the current mark price. Typically prevents rejection for being below the $10 minimum, but actual executed notional may differ due to limit/market slippage or price quantization. -*/ -"minSize": S.Number, - /** -* Market metadata -*/ -"metadata": MarketMetadataDto -}) {} - -export class MarketsControllerGetMarkets200 extends S.Struct({ - /** -* Total number of items available -*/ -"total": S.Number, - /** -* Offset of the current page -*/ -"offset": S.Number, - /** -* Limit of the current page -*/ -"limit": S.Number, - "items": S.optionalWith(S.Array(MarketDto), { nullable: true }) -}) {} - -export class MarketsControllerGetMarkets401 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class MarketsControllerGetMarkets429 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }), - "retryAfter": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class MarketsControllerGetCandlesParamsInterval extends S.Literal("1m", "5m", "15m", "1h", "4h", "1d") {} - -export class MarketsControllerGetCandlesParams extends S.Struct({ - "interval": MarketsControllerGetCandlesParamsInterval, - "from": S.Number, - "to": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class CandlesResponseDtoInterval extends S.Literal("1m", "5m", "15m", "1h", "4h", "1d") {} - -export class CandleDto extends S.Class("CandleDto")({ - /** -* Candle open time (unix milliseconds) -*/ -"openTime": S.Number, - /** -* Candle close time (unix milliseconds) -*/ -"closeTime": S.Number, - "open": S.String, - "high": S.String, - "low": S.String, - "close": S.String, - /** -* Volume in base asset units -*/ -"volume": S.String, - /** -* Number of trades in this candle -*/ -"trades": S.Number -}) {} - -export class CandlesResponseDto extends S.Class("CandlesResponseDto")({ - "marketId": S.String, - "interval": CandlesResponseDtoInterval, - "candles": S.Array(CandleDto) -}) {} - -export class MarketsControllerGetCandles401 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class MarketsControllerGetCandles429 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }), - "retryAfter": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class ChartConfigDto extends S.Class("ChartConfigDto")({ - /** -* Price scale (e.g., 100 for 2 decimals, 10000 for 4) -*/ -"pricescale": S.Number, - /** -* Minimum price movement (usually 1) -*/ -"minmov": S.Number, - /** -* Supported chart resolutions -*/ -"supportedResolutions": S.Array(S.String), - /** -* Whether intraday data is supported -*/ -"hasIntraday": S.Boolean, - /** -* Whether daily data is supported -*/ -"hasDaily": S.Boolean -}) {} - -export class MarketDetailDto extends S.Class("MarketDetailDto")({ - /** -* Market ID -*/ -"id": S.String, - /** -* Provider ID -*/ -"providerId": S.String, - /** -* Base asset information -*/ -"baseAsset": TokenDto, - /** -* Quote asset information -*/ -"quoteAsset": TokenDto, - /** -* Leverage range [min, max] -*/ -"leverageRange": S.Array(S.Number), - /** -* Supported margin modes -*/ -"supportedMarginModes": S.Array(S.Literal("isolated", "cross")), - /** -* Current mark price -*/ -"markPrice": S.Number, - /** -* Oracle/index price -*/ -"oraclePrice": S.Number, - /** -* Absolute price change in 24h -*/ -"priceChange24h": S.Number, - /** -* Percentage price change in 24h -*/ -"priceChangePercent24h": S.Number, - /** -* 24h trading volume in quote asset (e.g., USDC) -*/ -"volume24h": S.Number, - /** -* Open interest in base asset units (e.g., number of ETH coins, not USD notional) -*/ -"openInterest": S.Number, - /** -* Maker fee rate -*/ -"makerFee": S.optionalWith(S.String, { nullable: true }), - /** -* Taker fee rate -*/ -"takerFee": S.optionalWith(S.String, { nullable: true }), - /** -* Current funding rate -*/ -"fundingRate": S.String, - /** -* Funding rate interval in hours -*/ -"fundingRateIntervalHours": S.Number, - /** -* Minimum position size in USD (notional) computed at the current mark price. Typically prevents rejection for being below the $10 minimum, but actual executed notional may differ due to limit/market slippage or price quantization. -*/ -"minSize": S.Number, - /** -* Market metadata -*/ -"metadata": MarketMetadataDto, - /** -* Chart display configuration -*/ -"chartConfig": ChartConfigDto -}) {} - -export class MarketsControllerGetMarketById401 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class MarketsControllerGetMarketById429 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }), - "retryAfter": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class PortfolioRequestDto extends S.Class("PortfolioRequestDto")({ - /** -* User wallet address -*/ -"address": S.String, - /** -* Provider ID -*/ -"providerId": S.String -}) {} - -/** -* Order side -*/ -export class PositionSide extends S.Literal("long", "short") {} - -/** -* Margin mode - isolated (dedicated collateral) or cross (shared collateral) -*/ -export class MarginMode extends S.Literal("cross", "isolated") {} - -export class TokenIdentifierDto extends S.Class("TokenIdentifierDto")({ - "network": Networks, - /** -* Token contract address. Leave empty for native tokens like ETH. -*/ -"address": S.optionalWith(S.String, { nullable: true }) -}) {} - -/** -* Funding method: "bridge2" for direct Hyperliquid Bridge2 (Arbitrum USDC only), "lifi" for LiFi bridging (any token/network). If not provided, defaults to bridge2 for Arbitrum USDC and lifi for others. -*/ -export class FundingMethod extends S.Literal("bridge2", "lifi") {} - -export class ArgumentsDto extends S.Class("ArgumentsDto")({ - /** -* Market identifier -*/ -"marketId": S.optionalWith(S.String, { nullable: true }), - "side": S.optionalWith(PositionSide, { nullable: true }), - /** -* Margin/collateral amount in USD (alternative to size). Min: $10 -*/ -"amount": S.optionalWith(S.String, { nullable: true }), - /** -* Position size in USD (alternative to amount). Min: $10 -*/ -"size": S.optionalWith(S.String, { nullable: true }), - /** -* Leverage multiplier -*/ -"leverage": S.optionalWith(S.Number, { nullable: true }), - "marginMode": S.optionalWith(MarginMode, { nullable: true }), - /** -* Limit price. If provided, order will be placed as a limit order at this price. If not provided, order executes immediately as a market order. -*/ -"limitPrice": S.optionalWith(S.Number, { nullable: true }), - /** -* Stop loss trigger price -*/ -"stopLossPrice": S.optionalWith(S.Number, { nullable: true }), - /** -* Take profit trigger price -*/ -"takeProfitPrice": S.optionalWith(S.Number, { nullable: true }), - /** -* Order ID (for cancelOrder, or for updating existing stopLoss/takeProfit) -*/ -"orderId": S.optionalWith(S.String, { nullable: true }), - /** -* Order IDs for batch cancelOrder -*/ -"orderIds": S.optionalWith(S.Array(S.String), { nullable: true }), - /** -* Asset index (internal) -*/ -"assetIndex": S.optionalWith(S.Number, { nullable: true }), - /** -* Source token for cross-chain funding (bridge/swap from another chain) -*/ -"fromToken": S.optionalWith(TokenIdentifierDto, { nullable: true }), - /** -* Agent wallet address to approve (for approveAgent action) -*/ -"agentAddress": S.optionalWith(S.String, { nullable: true }), - /** -* Name for the agent wallet (for approveAgent action). If not provided, defaults to "key". -*/ -"agentName": S.optionalWith(S.String, { nullable: true }), - /** -* Unix timestamp (seconds) when agent approval expires. If not provided, never expires. -*/ -"validUntil": S.optionalWith(S.Number, { nullable: true }), - /** -* Existing stop loss order ID (for updating via SET_TP_AND_SL bundled action) -*/ -"stopLossOrderId": S.optionalWith(S.String, { nullable: true }), - /** -* Existing take profit order ID (for updating via SET_TP_AND_SL bundled action) -*/ -"takeProfitOrderId": S.optionalWith(S.String, { nullable: true }), - /** -* Skip the ERC20 approval transaction. -*/ -"skipApproval": S.optionalWith(S.Boolean, { nullable: true }), - "fundingMethod": S.optionalWith(FundingMethod, { nullable: true }) -}) {} - -export class PendingActionDto extends S.Class("PendingActionDto")({ - "type": PerpActionTypes, - /** -* Action label -*/ -"label": S.String, - /** -* Pre-filled arguments for the action -*/ -"args": ArgumentsDto -}) {} - -export class PositionDto extends S.Class("PositionDto")({ - /** -* Market ID -*/ -"marketId": S.String, - "side": PositionSide, - /** -* Position size in base asset -*/ -"size": S.String, - /** -* Entry price -*/ -"entryPrice": S.Number, - /** -* Current mark price -*/ -"markPrice": S.Number, - /** -* Leverage multiplier -*/ -"leverage": S.Number, - "marginMode": MarginMode, - /** -* Margin amount -*/ -"margin": S.Number, - /** -* Unrealized PnL from price movement -*/ -"unrealizedPnl": S.Number, - /** -* Net cumulative funding received (positive) or paid (negative) since open -*/ -"funding": S.Number, - /** -* Liquidation price -*/ -"liquidationPrice": S.Number, - /** -* Available actions for this position -*/ -"pendingActions": S.Array(PendingActionDto) -}) {} - -export class PortfolioControllerGetPositions200 extends S.Array(PositionDto) {} - -export class PortfolioControllerGetPositions401 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class PortfolioControllerGetPositions429 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }), - "retryAfter": S.optionalWith(S.Number, { nullable: true }) -}) {} - -/** -* Order type -*/ -export class OrderType extends S.Literal("limit", "stop_loss", "take_profit") {} - -export class OrderDto extends S.Class("OrderDto")({ - /** -* Market ID -*/ -"marketId": S.String, - "side": PositionSide, - "type": OrderType, - /** -* Order size in base asset -*/ -"size": S.String, - /** -* Limit price -*/ -"limitPrice": S.optionalWith(S.Number, { nullable: true }), - /** -* Trigger price -*/ -"triggerPrice": S.optionalWith(S.Number, { nullable: true }), - /** -* Current leverage setting for this asset, when available from the underlying venue -*/ -"leverage": S.optionalWith(S.Number, { nullable: true }), - /** -* Margin for this order, derived from current venue state when available. This is an estimate, not an exact exchange-reported value. -*/ -"margin": S.optionalWith(S.Number, { nullable: true }), - /** -* Reduce only flag -*/ -"reduceOnly": S.Boolean, - /** -* Creation timestamp -*/ -"createdAt": S.Number, - /** -* Available actions for this order -*/ -"pendingActions": S.Array(PendingActionDto) -}) {} - -export class PortfolioControllerGetOrders200 extends S.Array(OrderDto) {} - -export class PortfolioControllerGetOrders401 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class PortfolioControllerGetOrders429 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }), - "retryAfter": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class BalanceDto extends S.Class("BalanceDto")({ - /** -* Provider ID -*/ -"providerId": S.String, - /** -* Collateral token (all values denominated in this token) -*/ -"collateral": TokenDto, - /** -* Total account value in collateral asset -*/ -"accountValue": S.Number, - /** -* Margin used by positions in collateral asset -*/ -"usedMargin": S.Number, - /** -* Available balance for new positions in collateral asset -*/ -"availableBalance": S.Number, - /** -* Total price PnL across all positions in collateral asset (excludes funding) -*/ -"unrealizedPnl": S.Number -}) {} - -export class PortfolioControllerGetBalances401 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class PortfolioControllerGetBalances429 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }), - "retryAfter": S.optionalWith(S.Number, { nullable: true }) -}) {} - -/** -* Current action status -*/ -export class ActionStatus extends S.Literal("CANCELED", "CREATED", "WAITING_FOR_NEXT", "PROCESSING", "FAILED", "SUCCESS", "STALE") {} - -export class ActionsControllerGetActionsParams extends S.Struct({ - "offset": S.optionalWith(S.Number.pipe(S.greaterThanOrEqualTo(0)), { nullable: true, default: () => 0 as const }), - "limit": S.optionalWith(S.Number.pipe(S.greaterThanOrEqualTo(1), S.lessThanOrEqualTo(500)), { nullable: true, default: () => 100 as const }), - "address": S.String, - "providerId": S.String, - "status": S.optionalWith(ActionStatus, { nullable: true }), - "statuses": S.optionalWith(S.Array(ActionStatus), { nullable: true }), - "type": S.optionalWith(PerpActionTypes, { nullable: true }), - "marketId": S.optionalWith(S.String, { nullable: true }) -}) {} - -/** -* Human-readable action label -*/ -export class ActionSummaryDtoType extends S.Literal("Open Position", "Close Position", "Stop Loss", "Take Profit", "Set TP & SL", "Cancel Order", "Edit Order", "Update Leverage", "Update Margin", "Fund Account", "Withdraw", "Approve Agent", "Approve Builder Fee") {} - -export class ActionSummaryDtoOrderType extends S.Literal("market", "limit") {} - -export class ActionSummaryDtoDirection extends S.Literal("long", "short") {} - -export class ActionSummaryDtoMarginMode extends S.Literal("cross", "isolated") {} - -export class ActionSummaryDto extends S.Class("ActionSummaryDto")({ - /** -* Human-readable action label -*/ -"type": ActionSummaryDtoType, - "assetId": S.optionalWith(S.Number, { nullable: true }), - "orderType": S.optionalWith(ActionSummaryDtoOrderType, { nullable: true }), - "direction": S.optionalWith(ActionSummaryDtoDirection, { nullable: true }), - "asset": S.optionalWith(S.String, { nullable: true }), - "price": S.optionalWith(S.Number, { nullable: true }), - "size": S.optionalWith(S.String, { nullable: true }), - "leverage": S.optionalWith(S.Number, { nullable: true }), - "collateral": S.optionalWith(S.String, { nullable: true }), - /** -* Fee rate as decimal string -*/ -"fee": S.optionalWith(S.String, { nullable: true }), - /** -* Actual position notional value after size quantization (orderPrice × quantizedSize) -*/ -"orderValue": S.optionalWith(S.Number, { nullable: true }), - "stopLoss": S.optionalWith(S.Number, { nullable: true }), - "takeProfit": S.optionalWith(S.Number, { nullable: true }), - /** -* Update Margin: liquidation price before this margin change. -*/ -"oldLiquidationPrice": S.optionalWith(S.Number, { nullable: true }), - /** -* Approximation — actual value depends on exchange mechanics -*/ -"estimatedLiquidationPrice": S.optionalWith(S.Number, { nullable: true }), - "oldStopLoss": S.optionalWith(S.Number, { nullable: true }), - "oldTakeProfit": S.optionalWith(S.Number, { nullable: true }), - "marginMode": S.optionalWith(ActionSummaryDtoMarginMode, { nullable: true }), - "orderId": S.optionalWith(S.String, { nullable: true }), - "orderIds": S.optionalWith(S.Array(S.String), { nullable: true }), - "amount": S.optionalWith(S.String, { nullable: true }), - "fromToken": S.optionalWith(TokenIdentifierDto, { nullable: true }), - "method": S.optionalWith(S.String, { nullable: true }), - "agentAddress": S.optionalWith(S.String, { nullable: true }), - "agentName": S.optionalWith(S.String, { nullable: true }), - /** -* Close position: expected close price at submission (limit price if limit close, else mark price) -*/ -"closedPrice": S.optionalWith(S.Number, { nullable: true }), - /** -* Close position: unrealized Pnl on the positon at submission (expected PnL if fully closing at mark) -*/ -"pnl": S.optionalWith(S.String, { nullable: true }), - /** -* Close position: deposited margin for the position at submission (isolated margin only, excludes unrealized PnL) -*/ -"margin": S.optionalWith(S.String, { nullable: true }) -}) {} - -/** -* Transaction type -*/ -export class PerpTransactionType extends S.Literal("APPROVAL", "OPEN_POSITION", "CLOSE_POSITION", "UPDATE_LEVERAGE", "STOP_LOSS", "TAKE_PROFIT", "CANCEL_ORDER", "EDIT_ORDER", "FUND", "WITHDRAW", "APPROVE_BUILDER_FEE", "ENABLE_DEX_ABSTRACTION", "APPROVE_AGENT", "UPDATE_MARGIN", "SET_TP_AND_SL") {} - -/** -* Transaction status after submission -*/ -export class PerpTransactionStatus extends S.Literal("CREATED", "QUEUED", "BROADCASTED", "CONFIRMED", "FAILED", "NOT_FOUND") {} - -/** -* Signing format required -*/ -export class SigningFormat extends S.Literal("EVM_TRANSACTION", "EIP712_TYPED_DATA", "SOLANA_TRANSACTION", "COSMOS_TRANSACTION") {} - -export class TransactionDto extends S.Class("TransactionDto")({ - /** -* Transaction ID for API tracking (UUID) -*/ -"id": S.String, - "network": Networks, - /** -* Chain ID -*/ -"chainId": S.String, - "type": PerpTransactionType, - "status": PerpTransactionStatus, - /** -* User address -*/ -"address": S.String, - /** -* Action arguments -*/ -"args": S.optionalWith(ArgumentsDto, { nullable: true }), - "signingFormat": S.optionalWith(SigningFormat, { nullable: true }), - /** -* Unsigned transaction payload to sign -*/ -"signablePayload": S.optionalWith(S.Record({ key: S.String, value: S.Unknown }), { nullable: true }), - /** -* Raw action payload with nonce that this transaction commits to. Use it to independently recompute the EIP-712 connectionId and verify transaction integrity. Present for L1 transactions; undefined for standard EVM transactions where signablePayload is self-describing. -*/ -"rawPayload": S.optionalWith(S.Record({ key: S.String, value: S.Unknown }), { nullable: true }), - /** -* Block explorer URL for this transaction -*/ -"explorerUrl": S.optionalWith(S.Record({ key: S.String, value: S.Unknown }), { nullable: true }) -}) {} - -export class ActionDto extends S.Class("ActionDto")({ - /** -* Unique action identifier (UUID) -*/ -"id": S.String, - /** -* Provider identifier -*/ -"providerId": S.String, - "action": PerpActionTypes, - "status": ActionStatus, - /** -* Human-readable breakdown of what this action does -*/ -"summary": S.NullOr(ActionSummaryDto), - /** -* TLV-encoded, secp256k1-signed metadata. -* -* Hex string of concatenated TLV fields. Each field: Tag (1 byte) + Length (1 byte) + Value (N bytes). Tags > 0x7f use a 3-byte header: 0x81 prefix + Tag (1 byte) + Length (1 byte). -* -* Fields in order: STRUCTURE_TYPE (0x01), VERSION (0x02), ACTION_TYPE (0x81 0xd0, u8: order=0x00 modify=0x01 cancel=0x02 updateLeverage=0x03 close=0x04 updateIsolatedMargin=0x05), ASSET_ID (0x81 0xd1, uint32 BE), ASSET_TICKER (0x24, UTF-8), NETWORK_TYPE (0x81 0xd2), BUILDER_ADDRESS (0x81 0xd3, 20 bytes, optional), MARGIN (0x81 0xd4, u64 big-endian, USD value with 6 decimal precision, e.g. 87500000 = $87.50, optional), LEVERAGE (0x81 0xd5, u32 big-endian, optional), SIGNATURE (0x15, DER-encoded secp256k1 over SHA-256 of preceding bytes). -*/ -"signedMetadata": S.optionalWith(S.Record({ key: S.String, value: S.Unknown }), { nullable: true }), - /** -* Unsigned transactions to sign and submit -*/ -"transactions": S.Array(TransactionDto), - /** -* When the action was created -*/ -"createdAt": S.String, - /** -* When the action completed (null if still in progress) -*/ -"completedAt": S.NullOr(S.String) -}) {} - -export class ActionsControllerGetActions200 extends S.Struct({ - /** -* Total number of items available -*/ -"total": S.Number, - /** -* Offset of the current page -*/ -"offset": S.Number, - /** -* Limit of the current page -*/ -"limit": S.Number, - "items": S.optionalWith(S.Array(ActionDto), { nullable: true }) -}) {} - -export class ActionsControllerGetActions401 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class ActionsControllerGetActions429 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }), - "retryAfter": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class ActionRequestDto extends S.Class("ActionRequestDto")({ - /** -* Provider identifier -*/ -"providerId": S.String, - /** -* User wallet address -*/ -"address": S.String, - "action": PerpActionTypes, - /** -* Action arguments (validated via Zod in chains) -*/ -"args": ArgumentsDto -}) {} - -export class ActionsControllerExecuteAction401 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class ActionsControllerExecuteAction429 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }), - "retryAfter": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class ActionsControllerGetAction401 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class ActionsControllerGetAction429 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }), - "retryAfter": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class SubmitTransactionDto extends S.Class("SubmitTransactionDto")({ - /** -* Signed transaction payload (hex string or signed EIP-712 data). Required if transactionHash is not provided. -*/ -"signedPayload": S.optionalWith(S.String, { nullable: true }), - /** -* Transaction hash if already submitted by the user. Required if signedPayload is not provided. -*/ -"transactionHash": S.optionalWith(S.String, { nullable: true }) -}) {} - -export class SubmitTransactionResponseDto extends S.Class("SubmitTransactionResponseDto")({ - /** -* Transaction hash or order ID (undefined for immediate actions) -*/ -"transactionHash": S.optionalWith(S.String, { nullable: true }), - /** -* Link to view transaction on provider platform -*/ -"link": S.String, - "status": PerpTransactionStatus, - /** -* Error message if status is FAILED -*/ -"error": S.optionalWith(S.String, { nullable: true }), - /** -* Additional provider-specific details -*/ -"details": S.optionalWith(S.Record({ key: S.String, value: S.Unknown }), { nullable: true }) -}) {} - -export class TransactionsControllerSubmitTransaction401 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }) -}) {} - -export class TransactionsControllerSubmitTransaction429 extends S.Struct({ - "message": S.optionalWith(S.String, { nullable: true }), - "error": S.optionalWith(S.String, { nullable: true }), - "statusCode": S.optionalWith(S.Number, { nullable: true }), - "retryAfter": S.optionalWith(S.Number, { nullable: true }) -}) {} +import type { SchemaError } from "effect/Schema" +import * as Schema from "effect/Schema" +import type * as HttpClient from "effect/unstable/http/HttpClient" +import * as HttpClientError from "effect/unstable/http/HttpClientError" +import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest" +import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse" +// non-recursive definitions +export type ArgumentSchemaDto = { readonly "type"?: { }, readonly "properties"?: { }, readonly "required"?: ReadonlyArray, readonly "additionalProperties"?: { }, readonly "items"?: { readonly "type"?: { }, readonly "description"?: string, readonly "enum"?: ReadonlyArray, readonly "default"?: { }, readonly "minimum"?: number, readonly "maximum"?: number, readonly "minLength"?: number, readonly "maxLength"?: number, readonly "pattern"?: string, readonly "items"?: { }, readonly "properties"?: { }, readonly "required"?: ReadonlyArray, readonly "additionalProperties"?: { }, readonly "label"?: string, readonly "placeholder"?: string, readonly "optionsRef"?: string, readonly "options"?: ReadonlyArray }, readonly "enum"?: ReadonlyArray, readonly "default"?: { }, readonly "notes"?: string } +export const ArgumentSchemaDto = Schema.Struct({ "type": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Schema type", "examples": ["object"] })), "properties": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Schema properties (fields)", "examples": [{"marketId":{"type":"string","label":"Market","optionsRef":"markets"},"leverage":{"type":"integer","minimum":1,"maximum":50,"label":"Leverage"}}] })), "required": Schema.optionalKey(Schema.Array(Schema.String).annotate({ "description": "Required field names", "examples": [["marketId","side","leverage"]] })), "additionalProperties": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Allow additional properties", "examples": [false] })), "items": Schema.optionalKey(Schema.Struct({ "type": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Property type", "examples": ["string"] })), "description": Schema.optionalKey(Schema.String.annotate({ "description": "Property description" })), "enum": Schema.optionalKey(Schema.Array(Schema.String).annotate({ "description": "Enum values", "examples": [["long","short"]] })), "default": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Default value" })), "minimum": Schema.optionalKey(Schema.Number.annotate({ "description": "Minimum value" }).check(Schema.isFinite())), "maximum": Schema.optionalKey(Schema.Number.annotate({ "description": "Maximum value" }).check(Schema.isFinite())), "minLength": Schema.optionalKey(Schema.Number.annotate({ "description": "Minimum length" }).check(Schema.isFinite())), "maxLength": Schema.optionalKey(Schema.Number.annotate({ "description": "Maximum length" }).check(Schema.isFinite())), "pattern": Schema.optionalKey(Schema.String.annotate({ "description": "Regex pattern" })), "items": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Items schema (for arrays)" })), "properties": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Nested properties (for objects)" })), "required": Schema.optionalKey(Schema.Array(Schema.String).annotate({ "description": "Required nested fields" })), "additionalProperties": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Additional properties allowed" })), "label": Schema.optionalKey(Schema.String.annotate({ "description": "Field label for UI", "examples": ["Leverage"] })), "placeholder": Schema.optionalKey(Schema.String.annotate({ "description": "Placeholder text", "examples": ["10"] })), "optionsRef": Schema.optionalKey(Schema.String.annotate({ "description": "Reference to dynamic options", "examples": ["markets"] })), "options": Schema.optionalKey(Schema.Array(Schema.String).annotate({ "description": "Static option values", "examples": [["isolated","cross"]] })) }).annotate({ "description": "Array items schema" })), "enum": Schema.optionalKey(Schema.Array(Schema.String).annotate({ "description": "Enum values" })), "default": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Default value" })), "notes": Schema.optionalKey(Schema.String.annotate({ "description": "Notes about this action schema", "examples": ["You can specify either amount or size"] })) }) +export type PerpActionTypes = "open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl" +export const PerpActionTypes = Schema.Literals(["open", "close", "updateLeverage", "stopLoss", "takeProfit", "cancelOrder", "editOrder", "fund", "withdraw", "approveAgent", "approveBuilderFee", "updateMargin", "setTpAndSl"]).annotate({ "description": "Action type executed" }) +export type MarketDto = { readonly "id": string, readonly "providerId": string, readonly "baseAsset": { readonly "symbol": string, readonly "name"?: string, readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "decimals"?: number, readonly "address"?: string, readonly "logoURI"?: string }, readonly "quoteAsset": { readonly "symbol": string, readonly "name"?: string, readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "decimals"?: number, readonly "address"?: string, readonly "logoURI"?: string }, readonly "leverageRange": ReadonlyArray, readonly "supportedMarginModes": ReadonlyArray<"isolated" | "cross">, readonly "markPrice": number, readonly "oraclePrice": number, readonly "priceChange24h": number, readonly "priceChangePercent24h": number, readonly "volume24h": number, readonly "openInterest": number, readonly "makerFee"?: string, readonly "takerFee"?: string, readonly "fundingRate": string, readonly "fundingRateIntervalHours": number, readonly "minSize": number, readonly "metadata": { readonly "name": string, readonly "logoURI": string, readonly "url": string } } +export const MarketDto = Schema.Struct({ "id": Schema.String.annotate({ "description": "Market ID", "examples": ["hyperliquid-eth-usdc"] }), "providerId": Schema.String.annotate({ "description": "Provider ID", "examples": ["hyperliquid"] }), "baseAsset": Schema.Struct({ "symbol": Schema.String.annotate({ "description": "Token symbol", "examples": ["ETH"] }), "name": Schema.optionalKey(Schema.String.annotate({ "description": "Token name", "examples": ["Ethereum"] })), "network": Schema.Literals(["ethereum", "ethereum-goerli", "ethereum-holesky", "ethereum-sepolia", "ethereum-hoodi", "arbitrum", "base", "base-sepolia", "gnosis", "optimism", "polygon", "polygon-amoy", "starknet", "zksync", "linea", "unichain", "monad-testnet", "monad", "avalanche-c", "avalanche-c-atomic", "avalanche-p", "binance", "celo", "fantom", "harmony", "moonriver", "okc", "viction", "core", "sonic", "plasma", "katana", "hyperevm", "agoric", "akash", "axelar", "band-protocol", "bitsong", "canto", "chihuahua", "comdex", "coreum", "cosmos", "crescent", "cronos", "cudos", "desmos", "dydx", "evmos", "fetch-ai", "gravity-bridge", "injective", "irisnet", "juno", "kava", "ki-network", "mars-protocol", "nym", "okex-chain", "onomy", "osmosis", "persistence", "quicksilver", "regen", "secret", "sentinel", "sommelier", "stafi", "stargaze", "stride", "teritori", "tgrade", "umee", "sei", "mantra", "celestia", "saga", "zetachain", "dymension", "humansai", "neutron", "polkadot", "kusama", "westend", "bittensor", "aptos", "binancebeacon", "cardano", "near", "solana", "solana-devnet", "stellar", "stellar-testnet", "sui", "tezos", "tron", "ton", "ton-testnet", "hyperliquid"]).annotate({ "description": "Network identifier", "examples": ["hyperliquid"] }), "decimals": Schema.optionalKey(Schema.Number.annotate({ "description": "Token decimals", "examples": [6] }).check(Schema.isFinite())), "address": Schema.optionalKey(Schema.String.annotate({ "description": "Token contract address (optional for native tokens)", "examples": ["0xaf88d065e77c8cC2239327C5EDb3A432268e5831"] })), "logoURI": Schema.optionalKey(Schema.String.annotate({ "description": "Token logo URI" })) }).annotate({ "description": "Base asset information" }), "quoteAsset": Schema.Struct({ "symbol": Schema.String.annotate({ "description": "Token symbol", "examples": ["ETH"] }), "name": Schema.optionalKey(Schema.String.annotate({ "description": "Token name", "examples": ["Ethereum"] })), "network": Schema.Literals(["ethereum", "ethereum-goerli", "ethereum-holesky", "ethereum-sepolia", "ethereum-hoodi", "arbitrum", "base", "base-sepolia", "gnosis", "optimism", "polygon", "polygon-amoy", "starknet", "zksync", "linea", "unichain", "monad-testnet", "monad", "avalanche-c", "avalanche-c-atomic", "avalanche-p", "binance", "celo", "fantom", "harmony", "moonriver", "okc", "viction", "core", "sonic", "plasma", "katana", "hyperevm", "agoric", "akash", "axelar", "band-protocol", "bitsong", "canto", "chihuahua", "comdex", "coreum", "cosmos", "crescent", "cronos", "cudos", "desmos", "dydx", "evmos", "fetch-ai", "gravity-bridge", "injective", "irisnet", "juno", "kava", "ki-network", "mars-protocol", "nym", "okex-chain", "onomy", "osmosis", "persistence", "quicksilver", "regen", "secret", "sentinel", "sommelier", "stafi", "stargaze", "stride", "teritori", "tgrade", "umee", "sei", "mantra", "celestia", "saga", "zetachain", "dymension", "humansai", "neutron", "polkadot", "kusama", "westend", "bittensor", "aptos", "binancebeacon", "cardano", "near", "solana", "solana-devnet", "stellar", "stellar-testnet", "sui", "tezos", "tron", "ton", "ton-testnet", "hyperliquid"]).annotate({ "description": "Network identifier", "examples": ["hyperliquid"] }), "decimals": Schema.optionalKey(Schema.Number.annotate({ "description": "Token decimals", "examples": [6] }).check(Schema.isFinite())), "address": Schema.optionalKey(Schema.String.annotate({ "description": "Token contract address (optional for native tokens)", "examples": ["0xaf88d065e77c8cC2239327C5EDb3A432268e5831"] })), "logoURI": Schema.optionalKey(Schema.String.annotate({ "description": "Token logo URI" })) }).annotate({ "description": "Quote asset information" }), "leverageRange": Schema.Array(Schema.Number.check(Schema.isFinite())).annotate({ "description": "Leverage range [min, max]", "examples": [[1,50]] }), "supportedMarginModes": Schema.Array(Schema.Literals(["isolated", "cross"])).annotate({ "description": "Supported margin modes" }), "markPrice": Schema.Number.annotate({ "description": "Current mark price" }).check(Schema.isFinite()), "oraclePrice": Schema.Number.annotate({ "description": "Oracle/index price" }).check(Schema.isFinite()), "priceChange24h": Schema.Number.annotate({ "description": "Absolute price change in 24h", "examples": [-1.233] }).check(Schema.isFinite()), "priceChangePercent24h": Schema.Number.annotate({ "description": "Percentage price change in 24h", "examples": [-5.01] }).check(Schema.isFinite()), "volume24h": Schema.Number.annotate({ "description": "24h trading volume in quote asset (e.g., USDC)" }).check(Schema.isFinite()), "openInterest": Schema.Number.annotate({ "description": "Open interest in base asset units (e.g., number of ETH coins, not USD notional)" }).check(Schema.isFinite()), "makerFee": Schema.optionalKey(Schema.String.annotate({ "description": "Maker fee rate", "examples": ["0.0002"] })), "takerFee": Schema.optionalKey(Schema.String.annotate({ "description": "Taker fee rate", "examples": ["0.0004"] })), "fundingRate": Schema.String.annotate({ "description": "Current funding rate", "examples": ["0.00012"] }), "fundingRateIntervalHours": Schema.Number.annotate({ "description": "Funding rate interval in hours", "examples": [8] }).check(Schema.isFinite()), "minSize": Schema.Number.annotate({ "description": "Minimum position size in USD (notional) computed at the current mark price. Typically prevents rejection for being below the $10 minimum, but actual executed notional may differ due to limit/market slippage or price quantization.", "examples": [10.22] }).check(Schema.isFinite()), "metadata": Schema.Struct({ "name": Schema.String.annotate({ "description": "Market name", "examples": ["ETH-USDC Perpetual"] }), "logoURI": Schema.String.annotate({ "description": "Market logo URI" }), "url": Schema.String.annotate({ "description": "Market URL" }) }).annotate({ "description": "Market metadata" }) }) +export type MarketDetailDto = { readonly "id": string, readonly "providerId": string, readonly "baseAsset": { readonly "symbol": string, readonly "name"?: string, readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "decimals"?: number, readonly "address"?: string, readonly "logoURI"?: string }, readonly "quoteAsset": { readonly "symbol": string, readonly "name"?: string, readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "decimals"?: number, readonly "address"?: string, readonly "logoURI"?: string }, readonly "leverageRange": ReadonlyArray, readonly "supportedMarginModes": ReadonlyArray<"isolated" | "cross">, readonly "markPrice": number, readonly "oraclePrice": number, readonly "priceChange24h": number, readonly "priceChangePercent24h": number, readonly "volume24h": number, readonly "openInterest": number, readonly "makerFee"?: string, readonly "takerFee"?: string, readonly "fundingRate": string, readonly "fundingRateIntervalHours": number, readonly "minSize": number, readonly "metadata": { readonly "name": string, readonly "logoURI": string, readonly "url": string }, readonly "chartConfig": { readonly "pricescale": number, readonly "minmov": number, readonly "supportedResolutions": ReadonlyArray, readonly "hasIntraday": boolean, readonly "hasDaily": boolean } } +export const MarketDetailDto = Schema.Struct({ "id": Schema.String.annotate({ "description": "Market ID", "examples": ["hyperliquid-eth-usdc"] }), "providerId": Schema.String.annotate({ "description": "Provider ID", "examples": ["hyperliquid"] }), "baseAsset": Schema.Struct({ "symbol": Schema.String.annotate({ "description": "Token symbol", "examples": ["ETH"] }), "name": Schema.optionalKey(Schema.String.annotate({ "description": "Token name", "examples": ["Ethereum"] })), "network": Schema.Literals(["ethereum", "ethereum-goerli", "ethereum-holesky", "ethereum-sepolia", "ethereum-hoodi", "arbitrum", "base", "base-sepolia", "gnosis", "optimism", "polygon", "polygon-amoy", "starknet", "zksync", "linea", "unichain", "monad-testnet", "monad", "avalanche-c", "avalanche-c-atomic", "avalanche-p", "binance", "celo", "fantom", "harmony", "moonriver", "okc", "viction", "core", "sonic", "plasma", "katana", "hyperevm", "agoric", "akash", "axelar", "band-protocol", "bitsong", "canto", "chihuahua", "comdex", "coreum", "cosmos", "crescent", "cronos", "cudos", "desmos", "dydx", "evmos", "fetch-ai", "gravity-bridge", "injective", "irisnet", "juno", "kava", "ki-network", "mars-protocol", "nym", "okex-chain", "onomy", "osmosis", "persistence", "quicksilver", "regen", "secret", "sentinel", "sommelier", "stafi", "stargaze", "stride", "teritori", "tgrade", "umee", "sei", "mantra", "celestia", "saga", "zetachain", "dymension", "humansai", "neutron", "polkadot", "kusama", "westend", "bittensor", "aptos", "binancebeacon", "cardano", "near", "solana", "solana-devnet", "stellar", "stellar-testnet", "sui", "tezos", "tron", "ton", "ton-testnet", "hyperliquid"]).annotate({ "description": "Network identifier", "examples": ["hyperliquid"] }), "decimals": Schema.optionalKey(Schema.Number.annotate({ "description": "Token decimals", "examples": [6] }).check(Schema.isFinite())), "address": Schema.optionalKey(Schema.String.annotate({ "description": "Token contract address (optional for native tokens)", "examples": ["0xaf88d065e77c8cC2239327C5EDb3A432268e5831"] })), "logoURI": Schema.optionalKey(Schema.String.annotate({ "description": "Token logo URI" })) }).annotate({ "description": "Base asset information" }), "quoteAsset": Schema.Struct({ "symbol": Schema.String.annotate({ "description": "Token symbol", "examples": ["ETH"] }), "name": Schema.optionalKey(Schema.String.annotate({ "description": "Token name", "examples": ["Ethereum"] })), "network": Schema.Literals(["ethereum", "ethereum-goerli", "ethereum-holesky", "ethereum-sepolia", "ethereum-hoodi", "arbitrum", "base", "base-sepolia", "gnosis", "optimism", "polygon", "polygon-amoy", "starknet", "zksync", "linea", "unichain", "monad-testnet", "monad", "avalanche-c", "avalanche-c-atomic", "avalanche-p", "binance", "celo", "fantom", "harmony", "moonriver", "okc", "viction", "core", "sonic", "plasma", "katana", "hyperevm", "agoric", "akash", "axelar", "band-protocol", "bitsong", "canto", "chihuahua", "comdex", "coreum", "cosmos", "crescent", "cronos", "cudos", "desmos", "dydx", "evmos", "fetch-ai", "gravity-bridge", "injective", "irisnet", "juno", "kava", "ki-network", "mars-protocol", "nym", "okex-chain", "onomy", "osmosis", "persistence", "quicksilver", "regen", "secret", "sentinel", "sommelier", "stafi", "stargaze", "stride", "teritori", "tgrade", "umee", "sei", "mantra", "celestia", "saga", "zetachain", "dymension", "humansai", "neutron", "polkadot", "kusama", "westend", "bittensor", "aptos", "binancebeacon", "cardano", "near", "solana", "solana-devnet", "stellar", "stellar-testnet", "sui", "tezos", "tron", "ton", "ton-testnet", "hyperliquid"]).annotate({ "description": "Network identifier", "examples": ["hyperliquid"] }), "decimals": Schema.optionalKey(Schema.Number.annotate({ "description": "Token decimals", "examples": [6] }).check(Schema.isFinite())), "address": Schema.optionalKey(Schema.String.annotate({ "description": "Token contract address (optional for native tokens)", "examples": ["0xaf88d065e77c8cC2239327C5EDb3A432268e5831"] })), "logoURI": Schema.optionalKey(Schema.String.annotate({ "description": "Token logo URI" })) }).annotate({ "description": "Quote asset information" }), "leverageRange": Schema.Array(Schema.Number.check(Schema.isFinite())).annotate({ "description": "Leverage range [min, max]", "examples": [[1,50]] }), "supportedMarginModes": Schema.Array(Schema.Literals(["isolated", "cross"])).annotate({ "description": "Supported margin modes" }), "markPrice": Schema.Number.annotate({ "description": "Current mark price" }).check(Schema.isFinite()), "oraclePrice": Schema.Number.annotate({ "description": "Oracle/index price" }).check(Schema.isFinite()), "priceChange24h": Schema.Number.annotate({ "description": "Absolute price change in 24h", "examples": [-1.233] }).check(Schema.isFinite()), "priceChangePercent24h": Schema.Number.annotate({ "description": "Percentage price change in 24h", "examples": [-5.01] }).check(Schema.isFinite()), "volume24h": Schema.Number.annotate({ "description": "24h trading volume in quote asset (e.g., USDC)" }).check(Schema.isFinite()), "openInterest": Schema.Number.annotate({ "description": "Open interest in base asset units (e.g., number of ETH coins, not USD notional)" }).check(Schema.isFinite()), "makerFee": Schema.optionalKey(Schema.String.annotate({ "description": "Maker fee rate", "examples": ["0.0002"] })), "takerFee": Schema.optionalKey(Schema.String.annotate({ "description": "Taker fee rate", "examples": ["0.0004"] })), "fundingRate": Schema.String.annotate({ "description": "Current funding rate", "examples": ["0.00012"] }), "fundingRateIntervalHours": Schema.Number.annotate({ "description": "Funding rate interval in hours", "examples": [8] }).check(Schema.isFinite()), "minSize": Schema.Number.annotate({ "description": "Minimum position size in USD (notional) computed at the current mark price. Typically prevents rejection for being below the $10 minimum, but actual executed notional may differ due to limit/market slippage or price quantization.", "examples": [10.22] }).check(Schema.isFinite()), "metadata": Schema.Struct({ "name": Schema.String.annotate({ "description": "Market name", "examples": ["ETH-USDC Perpetual"] }), "logoURI": Schema.String.annotate({ "description": "Market logo URI" }), "url": Schema.String.annotate({ "description": "Market URL" }) }).annotate({ "description": "Market metadata" }), "chartConfig": Schema.Struct({ "pricescale": Schema.Number.annotate({ "description": "Price scale (e.g., 100 for 2 decimals, 10000 for 4)", "examples": [100] }).check(Schema.isFinite()), "minmov": Schema.Number.annotate({ "description": "Minimum price movement (usually 1)", "examples": [1] }).check(Schema.isFinite()), "supportedResolutions": Schema.Array(Schema.String).annotate({ "description": "Supported chart resolutions", "examples": [["1","5","15","60","240","1D"]] }), "hasIntraday": Schema.Boolean.annotate({ "description": "Whether intraday data is supported", "examples": [true] }), "hasDaily": Schema.Boolean.annotate({ "description": "Whether daily data is supported", "examples": [true] }) }).annotate({ "description": "Chart display configuration" }) }) +export type CandleDto = { readonly "openTime": number, readonly "closeTime": number, readonly "open": string, readonly "high": string, readonly "low": string, readonly "close": string, readonly "volume": string, readonly "trades": number } +export const CandleDto = Schema.Struct({ "openTime": Schema.Number.annotate({ "description": "Candle open time (unix milliseconds)", "examples": [1704067200000] }).check(Schema.isFinite()), "closeTime": Schema.Number.annotate({ "description": "Candle close time (unix milliseconds)", "examples": [1704070799999] }).check(Schema.isFinite()), "open": Schema.String.annotate({ "examples": ["42150.5"] }), "high": Schema.String.annotate({ "examples": ["42500.0"] }), "low": Schema.String.annotate({ "examples": ["42000.0"] }), "close": Schema.String.annotate({ "examples": ["42350.25"] }), "volume": Schema.String.annotate({ "description": "Volume in base asset units", "examples": ["1234.56"] }), "trades": Schema.Number.annotate({ "description": "Number of trades in this candle", "examples": [482] }).check(Schema.isFinite()) }) +export type PortfolioRequestDto = { readonly "address": string, readonly "providerId": string } +export const PortfolioRequestDto = Schema.Struct({ "address": Schema.String.annotate({ "description": "User wallet address", "examples": ["0x1234..."] }), "providerId": Schema.String.annotate({ "description": "Provider ID", "examples": ["hyperliquid"] }) }) +export type TokenIdentifierDto = { readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "address"?: string } +export const TokenIdentifierDto = Schema.Struct({ "network": Schema.Literals(["ethereum", "ethereum-goerli", "ethereum-holesky", "ethereum-sepolia", "ethereum-hoodi", "arbitrum", "base", "base-sepolia", "gnosis", "optimism", "polygon", "polygon-amoy", "starknet", "zksync", "linea", "unichain", "monad-testnet", "monad", "avalanche-c", "avalanche-c-atomic", "avalanche-p", "binance", "celo", "fantom", "harmony", "moonriver", "okc", "viction", "core", "sonic", "plasma", "katana", "hyperevm", "agoric", "akash", "axelar", "band-protocol", "bitsong", "canto", "chihuahua", "comdex", "coreum", "cosmos", "crescent", "cronos", "cudos", "desmos", "dydx", "evmos", "fetch-ai", "gravity-bridge", "injective", "irisnet", "juno", "kava", "ki-network", "mars-protocol", "nym", "okex-chain", "onomy", "osmosis", "persistence", "quicksilver", "regen", "secret", "sentinel", "sommelier", "stafi", "stargaze", "stride", "teritori", "tgrade", "umee", "sei", "mantra", "celestia", "saga", "zetachain", "dymension", "humansai", "neutron", "polkadot", "kusama", "westend", "bittensor", "aptos", "binancebeacon", "cardano", "near", "solana", "solana-devnet", "stellar", "stellar-testnet", "sui", "tezos", "tron", "ton", "ton-testnet", "hyperliquid"]).annotate({ "description": "Network identifier", "examples": ["ethereum"] }), "address": Schema.optionalKey(Schema.String.annotate({ "description": "Token contract address. Leave empty for native tokens like ETH.", "examples": ["0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"] })) }) +export type PendingActionDto = { readonly "type": "open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl", readonly "label": string, readonly "args": { readonly "marketId"?: string, readonly "side"?: "long" | "short", readonly "amount"?: string, readonly "size"?: string, readonly "leverage"?: number, readonly "marginMode"?: "cross" | "isolated", readonly "limitPrice"?: number, readonly "stopLossPrice"?: number, readonly "takeProfitPrice"?: number, readonly "orderId"?: string, readonly "orderIds"?: ReadonlyArray, readonly "assetIndex"?: number, readonly "fromToken"?: { readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "address"?: string }, readonly "agentAddress"?: string, readonly "agentName"?: string, readonly "validUntil"?: number, readonly "stopLossOrderId"?: string, readonly "takeProfitOrderId"?: string, readonly "skipApproval"?: boolean, readonly "fundingMethod"?: "bridge2" | "lifi" } } +export const PendingActionDto = Schema.Struct({ "type": Schema.Literals(["open", "close", "updateLeverage", "stopLoss", "takeProfit", "cancelOrder", "editOrder", "fund", "withdraw", "approveAgent", "approveBuilderFee", "updateMargin", "setTpAndSl"]).annotate({ "description": "Action type executed", "examples": ["close"] }), "label": Schema.String.annotate({ "description": "Action label", "examples": ["Close Position"] }), "args": Schema.Struct({ "marketId": Schema.optionalKey(Schema.String.annotate({ "description": "Market identifier", "examples": ["hyperliquid-eth-usdc"] })), "side": Schema.optionalKey(Schema.Literals(["long", "short"]).annotate({ "description": "Order side", "examples": ["long"] })), "amount": Schema.optionalKey(Schema.String.annotate({ "description": "Margin/collateral amount in USD (alternative to size). Min: $10", "examples": ["100"] })), "size": Schema.optionalKey(Schema.String.annotate({ "description": "Position size in USD (alternative to amount). Min: $10", "examples": ["1000"] })), "leverage": Schema.optionalKey(Schema.Number.annotate({ "description": "Leverage multiplier", "examples": [10] }).check(Schema.isFinite())), "marginMode": Schema.optionalKey(Schema.Literals(["cross", "isolated"]).annotate({ "description": "Margin mode - isolated (dedicated collateral) or cross (shared collateral)", "examples": ["isolated"] })), "limitPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Limit price. If provided, order will be placed as a limit order at this price. If not provided, order executes immediately as a market order.", "examples": [2000] }).check(Schema.isFinite())), "stopLossPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Stop loss trigger price", "examples": [1800] }).check(Schema.isFinite())), "takeProfitPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Take profit trigger price", "examples": [2200] }).check(Schema.isFinite())), "orderId": Schema.optionalKey(Schema.String.annotate({ "description": "Order ID (for cancelOrder, or for updating existing stopLoss/takeProfit)", "examples": ["12345"] })), "orderIds": Schema.optionalKey(Schema.Array(Schema.String).annotate({ "description": "Order IDs for batch cancelOrder", "examples": [["12345","67890"]] })), "assetIndex": Schema.optionalKey(Schema.Number.annotate({ "description": "Asset index (internal)", "examples": [0] }).check(Schema.isFinite())), "fromToken": Schema.optionalKey(Schema.Struct({ "network": Schema.Literals(["ethereum", "ethereum-goerli", "ethereum-holesky", "ethereum-sepolia", "ethereum-hoodi", "arbitrum", "base", "base-sepolia", "gnosis", "optimism", "polygon", "polygon-amoy", "starknet", "zksync", "linea", "unichain", "monad-testnet", "monad", "avalanche-c", "avalanche-c-atomic", "avalanche-p", "binance", "celo", "fantom", "harmony", "moonriver", "okc", "viction", "core", "sonic", "plasma", "katana", "hyperevm", "agoric", "akash", "axelar", "band-protocol", "bitsong", "canto", "chihuahua", "comdex", "coreum", "cosmos", "crescent", "cronos", "cudos", "desmos", "dydx", "evmos", "fetch-ai", "gravity-bridge", "injective", "irisnet", "juno", "kava", "ki-network", "mars-protocol", "nym", "okex-chain", "onomy", "osmosis", "persistence", "quicksilver", "regen", "secret", "sentinel", "sommelier", "stafi", "stargaze", "stride", "teritori", "tgrade", "umee", "sei", "mantra", "celestia", "saga", "zetachain", "dymension", "humansai", "neutron", "polkadot", "kusama", "westend", "bittensor", "aptos", "binancebeacon", "cardano", "near", "solana", "solana-devnet", "stellar", "stellar-testnet", "sui", "tezos", "tron", "ton", "ton-testnet", "hyperliquid"]).annotate({ "description": "Network identifier", "examples": ["ethereum"] }), "address": Schema.optionalKey(Schema.String.annotate({ "description": "Token contract address. Leave empty for native tokens like ETH.", "examples": ["0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"] })) }).annotate({ "description": "Source token for cross-chain funding (bridge/swap from another chain)" })), "agentAddress": Schema.optionalKey(Schema.String.annotate({ "description": "Agent wallet address to approve (for approveAgent action)", "examples": ["0x1234567890abcdef1234567890abcdef12345678"] })), "agentName": Schema.optionalKey(Schema.String.annotate({ "description": "Name for the agent wallet (for approveAgent action). If not provided, defaults to \"key\".", "examples": ["My Trading Bot"] })), "validUntil": Schema.optionalKey(Schema.Number.annotate({ "description": "Unix timestamp (seconds) when agent approval expires. If not provided, never expires.", "examples": [1735689600] }).check(Schema.isFinite())), "stopLossOrderId": Schema.optionalKey(Schema.String.annotate({ "description": "Existing stop loss order ID (for updating via SET_TP_AND_SL bundled action)", "examples": ["12345"] })), "takeProfitOrderId": Schema.optionalKey(Schema.String.annotate({ "description": "Existing take profit order ID (for updating via SET_TP_AND_SL bundled action)", "examples": ["12346"] })), "skipApproval": Schema.optionalKey(Schema.Boolean.annotate({ "description": "Skip the ERC20 approval transaction.", "examples": [true] })), "fundingMethod": Schema.optionalKey(Schema.Literals(["bridge2", "lifi"]).annotate({ "description": "Funding method: \"bridge2\" for direct Hyperliquid Bridge2 (Arbitrum USDC only), \"lifi\" for LiFi bridging (any token/network). If not provided, defaults to bridge2 for Arbitrum USDC and lifi for others.", "examples": ["bridge2"] })) }).annotate({ "description": "Pre-filled arguments for the action", "examples": [{"marketId":"hyperliquid-eth-usdc"}] }) }) +export type BalanceDto = { readonly "providerId": string, readonly "collateral": { readonly "symbol": string, readonly "name"?: string, readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "decimals"?: number, readonly "address"?: string, readonly "logoURI"?: string }, readonly "accountValue": number, readonly "usedMargin": number, readonly "availableBalance": number, readonly "unrealizedPnl": number } +export const BalanceDto = Schema.Struct({ "providerId": Schema.String.annotate({ "description": "Provider ID", "examples": ["hyperliquid"] }), "collateral": Schema.Struct({ "symbol": Schema.String.annotate({ "description": "Token symbol", "examples": ["ETH"] }), "name": Schema.optionalKey(Schema.String.annotate({ "description": "Token name", "examples": ["Ethereum"] })), "network": Schema.Literals(["ethereum", "ethereum-goerli", "ethereum-holesky", "ethereum-sepolia", "ethereum-hoodi", "arbitrum", "base", "base-sepolia", "gnosis", "optimism", "polygon", "polygon-amoy", "starknet", "zksync", "linea", "unichain", "monad-testnet", "monad", "avalanche-c", "avalanche-c-atomic", "avalanche-p", "binance", "celo", "fantom", "harmony", "moonriver", "okc", "viction", "core", "sonic", "plasma", "katana", "hyperevm", "agoric", "akash", "axelar", "band-protocol", "bitsong", "canto", "chihuahua", "comdex", "coreum", "cosmos", "crescent", "cronos", "cudos", "desmos", "dydx", "evmos", "fetch-ai", "gravity-bridge", "injective", "irisnet", "juno", "kava", "ki-network", "mars-protocol", "nym", "okex-chain", "onomy", "osmosis", "persistence", "quicksilver", "regen", "secret", "sentinel", "sommelier", "stafi", "stargaze", "stride", "teritori", "tgrade", "umee", "sei", "mantra", "celestia", "saga", "zetachain", "dymension", "humansai", "neutron", "polkadot", "kusama", "westend", "bittensor", "aptos", "binancebeacon", "cardano", "near", "solana", "solana-devnet", "stellar", "stellar-testnet", "sui", "tezos", "tron", "ton", "ton-testnet", "hyperliquid"]).annotate({ "description": "Network identifier", "examples": ["hyperliquid"] }), "decimals": Schema.optionalKey(Schema.Number.annotate({ "description": "Token decimals", "examples": [6] }).check(Schema.isFinite())), "address": Schema.optionalKey(Schema.String.annotate({ "description": "Token contract address (optional for native tokens)", "examples": ["0xaf88d065e77c8cC2239327C5EDb3A432268e5831"] })), "logoURI": Schema.optionalKey(Schema.String.annotate({ "description": "Token logo URI" })) }).annotate({ "description": "Collateral token (all values denominated in this token)" }), "accountValue": Schema.Number.annotate({ "description": "Total account value in collateral asset", "examples": [1280.44] }).check(Schema.isFinite()), "usedMargin": Schema.Number.annotate({ "description": "Margin used by positions in collateral asset", "examples": [320.13] }).check(Schema.isFinite()), "availableBalance": Schema.Number.annotate({ "description": "Available balance for new positions in collateral asset", "examples": [960.31] }).check(Schema.isFinite()), "unrealizedPnl": Schema.Number.annotate({ "description": "Total price PnL across all positions in collateral asset (excludes funding)", "examples": [12.8] }).check(Schema.isFinite()) }) +export type ActionRequestDto = { readonly "providerId": string, readonly "address": string, readonly "action": "open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl", readonly "args": { readonly "marketId"?: string, readonly "side"?: "long" | "short", readonly "amount"?: string, readonly "size"?: string, readonly "leverage"?: number, readonly "marginMode"?: "cross" | "isolated", readonly "limitPrice"?: number, readonly "stopLossPrice"?: number, readonly "takeProfitPrice"?: number, readonly "orderId"?: string, readonly "orderIds"?: ReadonlyArray, readonly "assetIndex"?: number, readonly "fromToken"?: { readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "address"?: string }, readonly "agentAddress"?: string, readonly "agentName"?: string, readonly "validUntil"?: number, readonly "stopLossOrderId"?: string, readonly "takeProfitOrderId"?: string, readonly "skipApproval"?: boolean, readonly "fundingMethod"?: "bridge2" | "lifi" } } +export const ActionRequestDto = Schema.Struct({ "providerId": Schema.String.annotate({ "description": "Provider identifier", "examples": ["hyperliquid"] }), "address": Schema.String.annotate({ "description": "User wallet address", "examples": ["0x1234..."] }), "action": Schema.Literals(["open", "close", "updateLeverage", "stopLoss", "takeProfit", "cancelOrder", "editOrder", "fund", "withdraw", "approveAgent", "approveBuilderFee", "updateMargin", "setTpAndSl"]).annotate({ "description": "Action type executed", "examples": ["open"] }), "args": Schema.Struct({ "marketId": Schema.optionalKey(Schema.String.annotate({ "description": "Market identifier", "examples": ["hyperliquid-eth-usdc"] })), "side": Schema.optionalKey(Schema.Literals(["long", "short"]).annotate({ "description": "Order side", "examples": ["long"] })), "amount": Schema.optionalKey(Schema.String.annotate({ "description": "Margin/collateral amount in USD (alternative to size). Min: $10", "examples": ["100"] })), "size": Schema.optionalKey(Schema.String.annotate({ "description": "Position size in USD (alternative to amount). Min: $10", "examples": ["1000"] })), "leverage": Schema.optionalKey(Schema.Number.annotate({ "description": "Leverage multiplier", "examples": [10] }).check(Schema.isFinite())), "marginMode": Schema.optionalKey(Schema.Literals(["cross", "isolated"]).annotate({ "description": "Margin mode - isolated (dedicated collateral) or cross (shared collateral)", "examples": ["isolated"] })), "limitPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Limit price. If provided, order will be placed as a limit order at this price. If not provided, order executes immediately as a market order.", "examples": [2000] }).check(Schema.isFinite())), "stopLossPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Stop loss trigger price", "examples": [1800] }).check(Schema.isFinite())), "takeProfitPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Take profit trigger price", "examples": [2200] }).check(Schema.isFinite())), "orderId": Schema.optionalKey(Schema.String.annotate({ "description": "Order ID (for cancelOrder, or for updating existing stopLoss/takeProfit)", "examples": ["12345"] })), "orderIds": Schema.optionalKey(Schema.Array(Schema.String).annotate({ "description": "Order IDs for batch cancelOrder", "examples": [["12345","67890"]] })), "assetIndex": Schema.optionalKey(Schema.Number.annotate({ "description": "Asset index (internal)", "examples": [0] }).check(Schema.isFinite())), "fromToken": Schema.optionalKey(Schema.Struct({ "network": Schema.Literals(["ethereum", "ethereum-goerli", "ethereum-holesky", "ethereum-sepolia", "ethereum-hoodi", "arbitrum", "base", "base-sepolia", "gnosis", "optimism", "polygon", "polygon-amoy", "starknet", "zksync", "linea", "unichain", "monad-testnet", "monad", "avalanche-c", "avalanche-c-atomic", "avalanche-p", "binance", "celo", "fantom", "harmony", "moonriver", "okc", "viction", "core", "sonic", "plasma", "katana", "hyperevm", "agoric", "akash", "axelar", "band-protocol", "bitsong", "canto", "chihuahua", "comdex", "coreum", "cosmos", "crescent", "cronos", "cudos", "desmos", "dydx", "evmos", "fetch-ai", "gravity-bridge", "injective", "irisnet", "juno", "kava", "ki-network", "mars-protocol", "nym", "okex-chain", "onomy", "osmosis", "persistence", "quicksilver", "regen", "secret", "sentinel", "sommelier", "stafi", "stargaze", "stride", "teritori", "tgrade", "umee", "sei", "mantra", "celestia", "saga", "zetachain", "dymension", "humansai", "neutron", "polkadot", "kusama", "westend", "bittensor", "aptos", "binancebeacon", "cardano", "near", "solana", "solana-devnet", "stellar", "stellar-testnet", "sui", "tezos", "tron", "ton", "ton-testnet", "hyperliquid"]).annotate({ "description": "Network identifier", "examples": ["ethereum"] }), "address": Schema.optionalKey(Schema.String.annotate({ "description": "Token contract address. Leave empty for native tokens like ETH.", "examples": ["0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"] })) }).annotate({ "description": "Source token for cross-chain funding (bridge/swap from another chain)" })), "agentAddress": Schema.optionalKey(Schema.String.annotate({ "description": "Agent wallet address to approve (for approveAgent action)", "examples": ["0x1234567890abcdef1234567890abcdef12345678"] })), "agentName": Schema.optionalKey(Schema.String.annotate({ "description": "Name for the agent wallet (for approveAgent action). If not provided, defaults to \"key\".", "examples": ["My Trading Bot"] })), "validUntil": Schema.optionalKey(Schema.Number.annotate({ "description": "Unix timestamp (seconds) when agent approval expires. If not provided, never expires.", "examples": [1735689600] }).check(Schema.isFinite())), "stopLossOrderId": Schema.optionalKey(Schema.String.annotate({ "description": "Existing stop loss order ID (for updating via SET_TP_AND_SL bundled action)", "examples": ["12345"] })), "takeProfitOrderId": Schema.optionalKey(Schema.String.annotate({ "description": "Existing take profit order ID (for updating via SET_TP_AND_SL bundled action)", "examples": ["12346"] })), "skipApproval": Schema.optionalKey(Schema.Boolean.annotate({ "description": "Skip the ERC20 approval transaction.", "examples": [true] })), "fundingMethod": Schema.optionalKey(Schema.Literals(["bridge2", "lifi"]).annotate({ "description": "Funding method: \"bridge2\" for direct Hyperliquid Bridge2 (Arbitrum USDC only), \"lifi\" for LiFi bridging (any token/network). If not provided, defaults to bridge2 for Arbitrum USDC and lifi for others.", "examples": ["bridge2"] })) }).annotate({ "description": "Action arguments (validated via Zod in chains)" }) }) +export type ActionStatus = "CANCELED" | "CREATED" | "WAITING_FOR_NEXT" | "PROCESSING" | "FAILED" | "SUCCESS" | "STALE" +export const ActionStatus = Schema.Literals(["CANCELED", "CREATED", "WAITING_FOR_NEXT", "PROCESSING", "FAILED", "SUCCESS", "STALE"]).annotate({ "description": "Current action status" }) +export type TransactionDto = { readonly "id": string, readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "chainId": string, readonly "type": "APPROVAL" | "OPEN_POSITION" | "CLOSE_POSITION" | "UPDATE_LEVERAGE" | "STOP_LOSS" | "TAKE_PROFIT" | "CANCEL_ORDER" | "EDIT_ORDER" | "FUND" | "WITHDRAW" | "APPROVE_BUILDER_FEE" | "ENABLE_DEX_ABSTRACTION" | "APPROVE_AGENT" | "UPDATE_MARGIN" | "SET_TP_AND_SL", readonly "status": "CREATED" | "QUEUED" | "BROADCASTED" | "CONFIRMED" | "FAILED" | "NOT_FOUND", readonly "address": string, readonly "args"?: { readonly "marketId"?: string, readonly "side"?: "long" | "short", readonly "amount"?: string, readonly "size"?: string, readonly "leverage"?: number, readonly "marginMode"?: "cross" | "isolated", readonly "limitPrice"?: number, readonly "stopLossPrice"?: number, readonly "takeProfitPrice"?: number, readonly "orderId"?: string, readonly "orderIds"?: ReadonlyArray, readonly "assetIndex"?: number, readonly "fromToken"?: { readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "address"?: string }, readonly "agentAddress"?: string, readonly "agentName"?: string, readonly "validUntil"?: number, readonly "stopLossOrderId"?: string, readonly "takeProfitOrderId"?: string, readonly "skipApproval"?: boolean, readonly "fundingMethod"?: "bridge2" | "lifi" }, readonly "signingFormat"?: "EVM_TRANSACTION" | "EIP712_TYPED_DATA" | "SOLANA_TRANSACTION" | "COSMOS_TRANSACTION", readonly "signablePayload"?: { }, readonly "rawPayload"?: { }, readonly "explorerUrls": ReadonlyArray } +export const TransactionDto = Schema.Struct({ "id": Schema.String.annotate({ "description": "Transaction ID for API tracking (UUID)", "examples": ["550e8400-e29b-41d4-a716-446655440000"] }), "network": Schema.Literals(["ethereum", "ethereum-goerli", "ethereum-holesky", "ethereum-sepolia", "ethereum-hoodi", "arbitrum", "base", "base-sepolia", "gnosis", "optimism", "polygon", "polygon-amoy", "starknet", "zksync", "linea", "unichain", "monad-testnet", "monad", "avalanche-c", "avalanche-c-atomic", "avalanche-p", "binance", "celo", "fantom", "harmony", "moonriver", "okc", "viction", "core", "sonic", "plasma", "katana", "hyperevm", "agoric", "akash", "axelar", "band-protocol", "bitsong", "canto", "chihuahua", "comdex", "coreum", "cosmos", "crescent", "cronos", "cudos", "desmos", "dydx", "evmos", "fetch-ai", "gravity-bridge", "injective", "irisnet", "juno", "kava", "ki-network", "mars-protocol", "nym", "okex-chain", "onomy", "osmosis", "persistence", "quicksilver", "regen", "secret", "sentinel", "sommelier", "stafi", "stargaze", "stride", "teritori", "tgrade", "umee", "sei", "mantra", "celestia", "saga", "zetachain", "dymension", "humansai", "neutron", "polkadot", "kusama", "westend", "bittensor", "aptos", "binancebeacon", "cardano", "near", "solana", "solana-devnet", "stellar", "stellar-testnet", "sui", "tezos", "tron", "ton", "ton-testnet", "hyperliquid"]).annotate({ "description": "Network identifier", "examples": ["hyperliquid"] }), "chainId": Schema.String.annotate({ "description": "Chain ID", "examples": ["1337"] }), "type": Schema.Literals(["APPROVAL", "OPEN_POSITION", "CLOSE_POSITION", "UPDATE_LEVERAGE", "STOP_LOSS", "TAKE_PROFIT", "CANCEL_ORDER", "EDIT_ORDER", "FUND", "WITHDRAW", "APPROVE_BUILDER_FEE", "ENABLE_DEX_ABSTRACTION", "APPROVE_AGENT", "UPDATE_MARGIN", "SET_TP_AND_SL"]).annotate({ "description": "Transaction type", "examples": ["OPEN_POSITION"] }), "status": Schema.Literals(["CREATED", "QUEUED", "BROADCASTED", "CONFIRMED", "FAILED", "NOT_FOUND"]).annotate({ "description": "Transaction status after submission", "examples": ["CREATED"] }), "address": Schema.String.annotate({ "description": "User address", "examples": ["0x123..."] }), "args": Schema.optionalKey(Schema.Struct({ "marketId": Schema.optionalKey(Schema.String.annotate({ "description": "Market identifier", "examples": ["hyperliquid-eth-usdc"] })), "side": Schema.optionalKey(Schema.Literals(["long", "short"]).annotate({ "description": "Order side", "examples": ["long"] })), "amount": Schema.optionalKey(Schema.String.annotate({ "description": "Margin/collateral amount in USD (alternative to size). Min: $10", "examples": ["100"] })), "size": Schema.optionalKey(Schema.String.annotate({ "description": "Position size in USD (alternative to amount). Min: $10", "examples": ["1000"] })), "leverage": Schema.optionalKey(Schema.Number.annotate({ "description": "Leverage multiplier", "examples": [10] }).check(Schema.isFinite())), "marginMode": Schema.optionalKey(Schema.Literals(["cross", "isolated"]).annotate({ "description": "Margin mode - isolated (dedicated collateral) or cross (shared collateral)", "examples": ["isolated"] })), "limitPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Limit price. If provided, order will be placed as a limit order at this price. If not provided, order executes immediately as a market order.", "examples": [2000] }).check(Schema.isFinite())), "stopLossPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Stop loss trigger price", "examples": [1800] }).check(Schema.isFinite())), "takeProfitPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Take profit trigger price", "examples": [2200] }).check(Schema.isFinite())), "orderId": Schema.optionalKey(Schema.String.annotate({ "description": "Order ID (for cancelOrder, or for updating existing stopLoss/takeProfit)", "examples": ["12345"] })), "orderIds": Schema.optionalKey(Schema.Array(Schema.String).annotate({ "description": "Order IDs for batch cancelOrder", "examples": [["12345","67890"]] })), "assetIndex": Schema.optionalKey(Schema.Number.annotate({ "description": "Asset index (internal)", "examples": [0] }).check(Schema.isFinite())), "fromToken": Schema.optionalKey(Schema.Struct({ "network": Schema.Literals(["ethereum", "ethereum-goerli", "ethereum-holesky", "ethereum-sepolia", "ethereum-hoodi", "arbitrum", "base", "base-sepolia", "gnosis", "optimism", "polygon", "polygon-amoy", "starknet", "zksync", "linea", "unichain", "monad-testnet", "monad", "avalanche-c", "avalanche-c-atomic", "avalanche-p", "binance", "celo", "fantom", "harmony", "moonriver", "okc", "viction", "core", "sonic", "plasma", "katana", "hyperevm", "agoric", "akash", "axelar", "band-protocol", "bitsong", "canto", "chihuahua", "comdex", "coreum", "cosmos", "crescent", "cronos", "cudos", "desmos", "dydx", "evmos", "fetch-ai", "gravity-bridge", "injective", "irisnet", "juno", "kava", "ki-network", "mars-protocol", "nym", "okex-chain", "onomy", "osmosis", "persistence", "quicksilver", "regen", "secret", "sentinel", "sommelier", "stafi", "stargaze", "stride", "teritori", "tgrade", "umee", "sei", "mantra", "celestia", "saga", "zetachain", "dymension", "humansai", "neutron", "polkadot", "kusama", "westend", "bittensor", "aptos", "binancebeacon", "cardano", "near", "solana", "solana-devnet", "stellar", "stellar-testnet", "sui", "tezos", "tron", "ton", "ton-testnet", "hyperliquid"]).annotate({ "description": "Network identifier", "examples": ["ethereum"] }), "address": Schema.optionalKey(Schema.String.annotate({ "description": "Token contract address. Leave empty for native tokens like ETH.", "examples": ["0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"] })) }).annotate({ "description": "Source token for cross-chain funding (bridge/swap from another chain)" })), "agentAddress": Schema.optionalKey(Schema.String.annotate({ "description": "Agent wallet address to approve (for approveAgent action)", "examples": ["0x1234567890abcdef1234567890abcdef12345678"] })), "agentName": Schema.optionalKey(Schema.String.annotate({ "description": "Name for the agent wallet (for approveAgent action). If not provided, defaults to \"key\".", "examples": ["My Trading Bot"] })), "validUntil": Schema.optionalKey(Schema.Number.annotate({ "description": "Unix timestamp (seconds) when agent approval expires. If not provided, never expires.", "examples": [1735689600] }).check(Schema.isFinite())), "stopLossOrderId": Schema.optionalKey(Schema.String.annotate({ "description": "Existing stop loss order ID (for updating via SET_TP_AND_SL bundled action)", "examples": ["12345"] })), "takeProfitOrderId": Schema.optionalKey(Schema.String.annotate({ "description": "Existing take profit order ID (for updating via SET_TP_AND_SL bundled action)", "examples": ["12346"] })), "skipApproval": Schema.optionalKey(Schema.Boolean.annotate({ "description": "Skip the ERC20 approval transaction.", "examples": [true] })), "fundingMethod": Schema.optionalKey(Schema.Literals(["bridge2", "lifi"]).annotate({ "description": "Funding method: \"bridge2\" for direct Hyperliquid Bridge2 (Arbitrum USDC only), \"lifi\" for LiFi bridging (any token/network). If not provided, defaults to bridge2 for Arbitrum USDC and lifi for others.", "examples": ["bridge2"] })) }).annotate({ "description": "Action arguments" })), "signingFormat": Schema.optionalKey(Schema.Literals(["EVM_TRANSACTION", "EIP712_TYPED_DATA", "SOLANA_TRANSACTION", "COSMOS_TRANSACTION"]).annotate({ "description": "Signing format required", "examples": ["EIP712_TYPED_DATA"] })), "signablePayload": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Unsigned transaction payload to sign", "examples": [{"domain":{"name":"Hyperliquid","version":"1","chainId":1337},"types":{},"message":{}}] })), "rawPayload": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Raw action payload with nonce that this transaction commits to. Use it to independently recompute the EIP-712 connectionId and verify transaction integrity. Present for L1 transactions; undefined for standard EVM transactions where signablePayload is self-describing.", "examples": [{"type":"order","orders":[{"a":4,"b":true,"p":"3500.0","s":"0.5","r":false,"t":{"limit":{"tif":"Gtc"}}}],"grouping":"na","nonce":1706198400000}] })), "explorerUrls": Schema.Array(Schema.String).annotate({ "description": "Block explorer URLs derived from timeline fills for this transaction’s venue order ids (distinct L1 settlements, sorted). Falls back to a single URL from `hash` when no matching timeline rows yet.", "examples": [["https://app.hyperliquid.xyz/explorer/tx/0x8a3fb2c1d4e5f67890abcdef12345678"]] }) }) +export type PerpEventType = "order_filled" | "liquidation" | "stop_loss_triggered" | "take_profit_triggered" +export const PerpEventType = Schema.Literals(["order_filled", "liquidation", "stop_loss_triggered", "take_profit_triggered"]) +export type SubmitTransactionDto = { readonly "signedPayload"?: string, readonly "transactionHash"?: string } +export const SubmitTransactionDto = Schema.Struct({ "signedPayload": Schema.optionalKey(Schema.String.annotate({ "description": "Signed transaction payload (hex string or signed EIP-712 data). Required if transactionHash is not provided.", "examples": ["0x1234567890abcdef..."] })), "transactionHash": Schema.optionalKey(Schema.String.annotate({ "description": "Transaction hash if already submitted by the user. Required if signedPayload is not provided.", "examples": ["0xabcdef1234567890..."] })) }) +export type SubmitTransactionResponseDto = { readonly "transactionHash"?: string, readonly "link": string, readonly "status": "CREATED" | "QUEUED" | "BROADCASTED" | "CONFIRMED" | "FAILED" | "NOT_FOUND", readonly "error"?: string, readonly "details"?: { } } +export const SubmitTransactionResponseDto = Schema.Struct({ "transactionHash": Schema.optionalKey(Schema.String.annotate({ "description": "Transaction hash or order ID (undefined for immediate actions)", "examples": ["0x1234567890abcdef..."] })), "link": Schema.String.annotate({ "description": "Link to view transaction on provider platform", "examples": ["https://app.hyperliquid.xyz/exchange"] }), "status": Schema.Literals(["CREATED", "QUEUED", "BROADCASTED", "CONFIRMED", "FAILED", "NOT_FOUND"]).annotate({ "description": "Transaction status after submission", "examples": ["CONFIRMED"] }), "error": Schema.optionalKey(Schema.String.annotate({ "description": "Error message if status is FAILED", "examples": ["Order rejected: Insufficient margin"] })), "details": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Additional provider-specific details", "examples": [{"orderStatus":"filled","fillPrice":3900}] })) }) +export type HealthStatusDto = { readonly "status": "OK" | "FAIL", readonly "timestamp": string } +export const HealthStatusDto = Schema.Struct({ "status": Schema.Literals(["OK", "FAIL"]).annotate({ "description": "The health status of the service", "examples": ["OK"] }), "timestamp": Schema.String.annotate({ "description": "Timestamp when the health check was performed", "examples": ["2024-01-15T10:30:00.000Z"], "format": "date-time" }) }) +export type ProviderDto = { readonly "id": string, readonly "name": string, readonly "network": string, readonly "metadata": { readonly "description": string, readonly "externalLink": string, readonly "logoURI": string }, readonly "supportedActions": "open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl", readonly "argumentSchemas": { readonly [x: string]: ArgumentSchemaDto } } +export const ProviderDto = Schema.Struct({ "id": Schema.String.annotate({ "description": "Provider identifier", "examples": ["hyperliquid"] }), "name": Schema.String.annotate({ "description": "Provider name", "examples": ["Hyperliquid"] }), "network": Schema.String.annotate({ "description": "Network the provider operates on", "examples": ["hyperliquid"] }), "metadata": Schema.Struct({ "description": Schema.String.annotate({ "description": "Provider description", "examples": ["Hyperliquid is a high-performance L1 optimized for perpetual futures trading."] }), "externalLink": Schema.String.annotate({ "description": "External link to the provider website", "examples": ["https://hyperliquid.xyz"] }), "logoURI": Schema.String.annotate({ "description": "Provider logo URI", "examples": ["https://assets.stakek.it/providers/hyperliquid.svg"] }) }).annotate({ "description": "Provider metadata (description, logo, links)" }), "supportedActions": Schema.Literals(["open", "close", "updateLeverage", "stopLoss", "takeProfit", "cancelOrder", "editOrder", "fund", "withdraw", "approveAgent", "approveBuilderFee", "updateMargin", "setTpAndSl"]).annotate({ "description": "Action type executed", "examples": ["open"] }), "argumentSchemas": Schema.Record(Schema.String, ArgumentSchemaDto).annotate({ "description": "Argument schemas for each supported action (JSON Schema format)", "examples": [{"open":{"type":"object","properties":{"marketId":{"type":"string","label":"Market"},"side":{"enum":["long","short"],"label":"Side"},"leverage":{"type":"number","label":"Leverage"}},"required":["marketId","side","leverage"]}}] }) }) +export type CandlesResponseDto = { readonly "marketId": string, readonly "interval": "1m" | "5m" | "15m" | "1h" | "4h" | "1d", readonly "candles": ReadonlyArray } +export const CandlesResponseDto = Schema.Struct({ "marketId": Schema.String.annotate({ "examples": ["hyperliquid-btc-usdc"] }), "interval": Schema.Literals(["1m", "5m", "15m", "1h", "4h", "1d"]).annotate({ "examples": ["1h"] }), "candles": Schema.Array(CandleDto) }) +export type PositionDto = { readonly "marketId": string, readonly "side": "long" | "short", readonly "size": string, readonly "entryPrice": number, readonly "markPrice": number, readonly "leverage": number, readonly "marginMode": "cross" | "isolated", readonly "margin": number, readonly "unrealizedPnl": number, readonly "funding": number, readonly "liquidationPrice": number, readonly "pendingActions": ReadonlyArray } +export const PositionDto = Schema.Struct({ "marketId": Schema.String.annotate({ "description": "Market ID", "examples": ["hyperliquid-eth-usdc"] }), "side": Schema.Literals(["long", "short"]).annotate({ "description": "Order side", "examples": ["long"] }), "size": Schema.String.annotate({ "description": "Position size in base asset", "examples": ["0.215"] }), "entryPrice": Schema.Number.annotate({ "description": "Entry price", "examples": [4000] }).check(Schema.isFinite()), "markPrice": Schema.Number.annotate({ "description": "Current mark price", "examples": [3975] }).check(Schema.isFinite()), "leverage": Schema.Number.annotate({ "description": "Leverage multiplier", "examples": [20] }).check(Schema.isFinite()), "marginMode": Schema.Literals(["cross", "isolated"]).annotate({ "description": "Margin mode - isolated (dedicated collateral) or cross (shared collateral)", "examples": ["isolated"] }), "margin": Schema.Number.annotate({ "description": "Margin amount", "examples": [43] }).check(Schema.isFinite()), "unrealizedPnl": Schema.Number.annotate({ "description": "Unrealized PnL from price movement", "examples": [5.38] }).check(Schema.isFinite()), "funding": Schema.Number.annotate({ "description": "Net cumulative funding received (positive) or paid (negative) since open", "examples": [-1.24] }).check(Schema.isFinite()), "liquidationPrice": Schema.Number.annotate({ "description": "Liquidation price", "examples": [4200] }).check(Schema.isFinite()), "pendingActions": Schema.Array(PendingActionDto).annotate({ "description": "Available actions for this position" }) }) +export type OrderDto = { readonly "marketId": string, readonly "side": "long" | "short", readonly "type": "market" | "limit" | "stop_loss" | "take_profit", readonly "size": string, readonly "limitPrice"?: number, readonly "triggerPrice"?: number, readonly "leverage"?: number, readonly "margin"?: number, readonly "reduceOnly": boolean, readonly "createdAt": number, readonly "pendingActions": ReadonlyArray } +export const OrderDto = Schema.Struct({ "marketId": Schema.String.annotate({ "description": "Market ID", "examples": ["hyperliquid-eth-usdc"] }), "side": Schema.Literals(["long", "short"]).annotate({ "description": "Order side", "examples": ["long"] }), "type": Schema.Literals(["market", "limit", "stop_loss", "take_profit"]).annotate({ "description": "Normalized order type", "examples": ["limit"] }), "size": Schema.String.annotate({ "description": "Order size in base asset", "examples": ["0.5"] }), "limitPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Limit price", "examples": [3900] }).check(Schema.isFinite())), "triggerPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Trigger price" }).check(Schema.isFinite())), "leverage": Schema.optionalKey(Schema.Number.annotate({ "description": "Current leverage setting for this asset, when available from the underlying venue", "examples": [10] }).check(Schema.isFinite())), "margin": Schema.optionalKey(Schema.Number.annotate({ "description": "Margin for this order, derived from current venue state when available. This is an estimate, not an exact exchange-reported value.", "examples": [12.5] }).check(Schema.isFinite())), "reduceOnly": Schema.Boolean.annotate({ "description": "Reduce only flag", "examples": [false] }), "createdAt": Schema.Number.annotate({ "description": "Creation timestamp", "examples": [1733332000] }).check(Schema.isFinite()), "pendingActions": Schema.Array(PendingActionDto).annotate({ "description": "Available actions for this order" }) }) +export type ActionDto = { readonly "id": string, readonly "providerId": string, readonly "action": "open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl", readonly "status": "CANCELED" | "CREATED" | "WAITING_FOR_NEXT" | "PROCESSING" | "FAILED" | "SUCCESS" | "STALE", readonly "summary": { readonly "type": "Open Position" | "Close Position" | "Stop Loss" | "Take Profit" | "Set TP & SL" | "Cancel Order" | "Edit Order" | "Update Leverage" | "Update Margin" | "Fund Account" | "Withdraw" | "Approve Agent" | "Approve Builder Fee", readonly "assetId"?: number, readonly "orderType"?: "market" | "limit", readonly "direction"?: "long" | "short", readonly "asset"?: string, readonly "price"?: number, readonly "size"?: string, readonly "leverage"?: number, readonly "collateral"?: string, readonly "fee"?: string, readonly "orderValue"?: number, readonly "stopLoss"?: number, readonly "takeProfit"?: number, readonly "oldLiquidationPrice"?: number, readonly "estimatedLiquidationPrice"?: number, readonly "oldStopLoss"?: number, readonly "oldTakeProfit"?: number, readonly "marginMode"?: "cross" | "isolated", readonly "orderId"?: string, readonly "orderIds"?: ReadonlyArray, readonly "cancelledOrderTypes"?: ReadonlyArray<"tp" | "sl">, readonly "amount"?: string, readonly "fromToken"?: TokenIdentifierDto, readonly "method"?: string, readonly "agentAddress"?: string, readonly "agentName"?: string, readonly "closedPrice"?: number, readonly "pnl"?: string, readonly "margin"?: string, readonly "entryPrice"?: number, readonly "exitPrice"?: number } | null, readonly "signedMetadata"?: { }, readonly "transactions": ReadonlyArray, readonly "createdAt": string, readonly "completedAt": string } +export const ActionDto = Schema.Struct({ "id": Schema.String.annotate({ "description": "Unique action identifier (UUID)", "examples": ["550e8400-e29b-41d4-a716-446655440000"] }), "providerId": Schema.String.annotate({ "description": "Provider identifier", "examples": ["hyperliquid"] }), "action": Schema.Literals(["open", "close", "updateLeverage", "stopLoss", "takeProfit", "cancelOrder", "editOrder", "fund", "withdraw", "approveAgent", "approveBuilderFee", "updateMargin", "setTpAndSl"]).annotate({ "description": "Action type executed", "examples": ["open"] }), "status": Schema.Literals(["CANCELED", "CREATED", "WAITING_FOR_NEXT", "PROCESSING", "FAILED", "SUCCESS", "STALE"]).annotate({ "description": "Current action status", "examples": ["CREATED"] }), "summary": Schema.Union([Schema.Struct({ "type": Schema.Literals(["Open Position", "Close Position", "Stop Loss", "Take Profit", "Set TP & SL", "Cancel Order", "Edit Order", "Update Leverage", "Update Margin", "Fund Account", "Withdraw", "Approve Agent", "Approve Builder Fee"]).annotate({ "description": "Human-readable action label", "examples": ["Open Position"] }), "assetId": Schema.optionalKey(Schema.Number.annotate({ "examples": [11] }).check(Schema.isFinite())), "orderType": Schema.optionalKey(Schema.Literals(["market", "limit"]).annotate({ "examples": ["market"] })), "direction": Schema.optionalKey(Schema.Literals(["long", "short"]).annotate({ "examples": ["long"] })), "asset": Schema.optionalKey(Schema.String.annotate({ "examples": ["ETH"] })), "price": Schema.optionalKey(Schema.Number.annotate({ "examples": [3500] }).check(Schema.isFinite())), "size": Schema.optionalKey(Schema.String.annotate({ "examples": ["0.5"] })), "leverage": Schema.optionalKey(Schema.Number.annotate({ "examples": [40] }).check(Schema.isFinite())), "collateral": Schema.optionalKey(Schema.String.annotate({ "examples": ["87.50"] })), "fee": Schema.optionalKey(Schema.String.annotate({ "description": "Fee rate as decimal string", "examples": ["0.001"] })), "orderValue": Schema.optionalKey(Schema.Number.annotate({ "description": "Actual position notional value after size quantization (orderPrice × quantizedSize)", "examples": [1750.25] }).check(Schema.isFinite())), "stopLoss": Schema.optionalKey(Schema.Number.annotate({ "examples": [3200] }).check(Schema.isFinite())), "takeProfit": Schema.optionalKey(Schema.Number.annotate({ "examples": [4000] }).check(Schema.isFinite())), "oldLiquidationPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Update Margin: liquidation price before this margin change.", "examples": [1850.5] }).check(Schema.isFinite())), "estimatedLiquidationPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Approximation — actual value depends on exchange mechanics", "examples": [1920.3] }).check(Schema.isFinite())), "oldStopLoss": Schema.optionalKey(Schema.Number.annotate({ "examples": [3000] }).check(Schema.isFinite())), "oldTakeProfit": Schema.optionalKey(Schema.Number.annotate({ "examples": [4200] }).check(Schema.isFinite())), "marginMode": Schema.optionalKey(Schema.Literals(["cross", "isolated"]).annotate({ "examples": ["isolated"] })), "orderId": Schema.optionalKey(Schema.String.annotate({ "examples": ["12345"] })), "orderIds": Schema.optionalKey(Schema.Array(Schema.String).annotate({ "examples": [["12345","67890"]] })), "cancelledOrderTypes": Schema.optionalKey(Schema.Array(Schema.Literals(["tp", "sl"])).annotate({ "description": "Cancel order: trigger order types cancelled when they can be inferred", "examples": [["tp","sl"]] })), "amount": Schema.optionalKey(Schema.String.annotate({ "examples": ["100"] })), "fromToken": Schema.optionalKey(TokenIdentifierDto), "method": Schema.optionalKey(Schema.String.annotate({ "examples": ["bridge2"] })), "agentAddress": Schema.optionalKey(Schema.String.annotate({ "examples": ["0x1234..."] })), "agentName": Schema.optionalKey(Schema.String.annotate({ "examples": ["Trading Bot 1"] })), "closedPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Close position: expected close price at submission (limit price if limit close, else mark price)", "examples": [1000] }).check(Schema.isFinite())), "pnl": Schema.optionalKey(Schema.String.annotate({ "description": "Close position: unrealized Pnl on the positon at submission (expected PnL if fully closing at mark)", "examples": ["100"] })), "margin": Schema.optionalKey(Schema.String.annotate({ "description": "Close position: deposited margin for the position at submission (isolated margin only, excludes unrealized PnL)", "examples": ["450.00"] })), "entryPrice": Schema.optionalKey(Schema.Number.annotate({ "examples": [3500] }).check(Schema.isFinite())), "exitPrice": Schema.optionalKey(Schema.Number.annotate({ "examples": [3500] }).check(Schema.isFinite())) }).annotate({ "description": "Human-readable breakdown of what this action does" }), Schema.Null]), "signedMetadata": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "TLV-encoded, secp256k1-signed metadata.\n\nHex string of concatenated TLV fields. Each field: Tag (1 byte) + Length (1 byte) + Value (N bytes). Tags > 0x7f use a 3-byte header: 0x81 prefix + Tag (1 byte) + Length (1 byte).\n\nFields in order: STRUCTURE_TYPE (0x01), VERSION (0x02), ACTION_TYPE (0x81 0xd0, u8: order=0x00 modify=0x01 cancel=0x02 updateLeverage=0x03 close=0x04 updateIsolatedMargin=0x05), ASSET_ID (0x81 0xd1, uint32 BE), ASSET_TICKER (0x24, UTF-8), NETWORK_TYPE (0x81 0xd2), BUILDER_ADDRESS (0x81 0xd3, 20 bytes, optional), MARGIN (0x81 0xd4, u64 big-endian, USD value with 6 decimal precision, e.g. 87500000 = $87.50, optional), LEVERAGE (0x81 0xd5, u32 big-endian, optional), SIGNATURE (0x15, DER-encoded secp256k1 over SHA-256 of preceding bytes).", "examples": ["01012b02010181d0010081d1040000000b24034152421547..."] })), "transactions": Schema.Array(TransactionDto).annotate({ "description": "Unsigned transactions to sign and submit" }), "createdAt": Schema.String.annotate({ "description": "When the action was created", "examples": ["2026-02-19T10:23:45.000Z"], "format": "date-time" }), "completedAt": Schema.Union([Schema.String.annotate({ "description": "When the action completed (null if still in progress)", "examples": ["2026-02-19T10:23:48.000Z"], "format": "date-time" })]) }) +export type EventDto = { readonly "id": string, readonly "eventType": PerpEventType, readonly "providerId": string, readonly "occurredAt": string, readonly "marketId"?: string | null, readonly "perpActionId"?: string, readonly "providerOrderId"?: string | null, readonly "explorerUrl"?: string | null, readonly "order": { readonly "orderId": string, readonly "marketId": string, readonly "asset": string, readonly "side": "buy" | "sell", readonly "type": "market" | "limit" | "stop_loss" | "take_profit", readonly "originalSizeBase": string, readonly "remainingSizeBase": string, readonly "limitPrice"?: number, readonly "timeInForce"?: "ioc" | "gtc" | "alo", readonly "triggerPrice"?: number, readonly "reduceOnly": boolean, readonly "isPositionLevel": boolean, readonly "clientOrderId": { } | null, readonly "childOrderIds": ReadonlyArray, readonly "createdAt": string, readonly "closedPnl"?: string, readonly "fillPrice"?: number } } +export const EventDto = Schema.Struct({ "id": Schema.String.annotate({ "format": "uuid" }), "eventType": PerpEventType, "providerId": Schema.String.annotate({ "examples": ["hyperliquid"] }), "occurredAt": Schema.String.annotate({ "format": "date-time" }), "marketId": Schema.optionalKey(Schema.Union([Schema.String, Schema.Null])), "perpActionId": Schema.optionalKey(Schema.Union([Schema.String.annotate({ "description": "Linked StakeKit action; null for liquidations", "format": "uuid" })])), "providerOrderId": Schema.optionalKey(Schema.Union([Schema.String, Schema.Null]).annotate({ "description": "Venue order identifier (e.g. Hyperliquid oid)" })), "explorerUrl": Schema.optionalKey(Schema.Union([Schema.String, Schema.Null]).annotate({ "description": "Block explorer URL for the settlement transaction", "examples": ["https://app.hyperliquid.xyz/explorer/tx/0x8a3fb2c1d4e5f67890abcdef12345678901234567890abcdef1234567890abcd"] })), "order": Schema.Struct({ "orderId": Schema.String.annotate({ "description": "Venue order identifier (e.g. Hyperliquid oid)", "examples": ["394438950581"] }), "marketId": Schema.String.annotate({ "description": "Market identifier", "examples": ["hyperliquid-eth-usdc"] }), "asset": Schema.String.annotate({ "description": "Base asset ticker", "examples": ["ETH"] }), "side": Schema.Literals(["buy", "sell"]).annotate({ "description": "Order side", "examples": ["buy"] }), "type": Schema.Literals(["market", "limit", "stop_loss", "take_profit"]).annotate({ "description": "Normalized order type", "examples": ["market"] }), "originalSizeBase": Schema.String.annotate({ "description": "Original order size in base asset units", "examples": ["0.0063"] }), "remainingSizeBase": Schema.String.annotate({ "description": "Remaining order size in base asset units", "examples": ["0.0"] }), "limitPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Limit price", "examples": [2395.2] }).check(Schema.isFinite())), "timeInForce": Schema.optionalKey(Schema.Literals(["ioc", "gtc", "alo"]).annotate({ "description": "Normalized time in force", "examples": ["ioc"] })), "triggerPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Trigger price when present on a trigger order", "examples": [2500] }).check(Schema.isFinite())), "reduceOnly": Schema.Boolean.annotate({ "description": "Reduce only flag", "examples": [false] }), "isPositionLevel": Schema.Boolean.annotate({ "description": "Whether the order is a position-level TP/SL order", "examples": [false] }), "clientOrderId": Schema.Union([Schema.Struct({ }), Schema.Null]).annotate({ "description": "Client-supplied order id when present", "examples": [null] }), "childOrderIds": Schema.Array(Schema.String).annotate({ "description": "Child order identifiers", "examples": [[]] }), "createdAt": Schema.String.annotate({ "description": "Order creation timestamp", "examples": ["2026-04-23T07:52:05.187Z"], "format": "date-time" }), "closedPnl": Schema.optionalKey(Schema.String.annotate({ "description": "PnL realized when an order closes, net of fees in USDC (string-encoded decimal). Absent on open / non-closing fills.", "examples": ["-12.45"] })), "fillPrice": Schema.optionalKey(Schema.Number.annotate({ "description": "Realized fill price for fill-sourced events (e.g. order_filled, stop_loss_triggered). One per partial fill — aggregate across rows with the same orderId for an order-level average.", "examples": [2500.5] }).check(Schema.isFinite())) }).annotate({ "description": "Normalized order details for the venue event" }) }) +export type ActivityActionItemDto = { readonly "type": "event" | "action", readonly "action": ActionDto } +export const ActivityActionItemDto = Schema.Struct({ "type": Schema.Literals(["event", "action"]).annotate({ "examples": ["action"] }), "action": ActionDto }) +export type ActivityEventItemDto = { readonly "type": "event" | "action", readonly "event": EventDto } +export const ActivityEventItemDto = Schema.Struct({ "type": Schema.Literals(["event", "action"]).annotate({ "examples": ["event"] }), "event": EventDto }) +// schemas +export type ProvidersControllerGetProviders200 = ReadonlyArray +export const ProvidersControllerGetProviders200 = Schema.Array(ProviderDto) +export type ProvidersControllerGetProviders401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const ProvidersControllerGetProviders401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type ProvidersControllerGetProviders429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const ProvidersControllerGetProviders429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type ProvidersControllerGetProvider200 = ProviderDto +export const ProvidersControllerGetProvider200 = ProviderDto +export type ProvidersControllerGetProvider401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const ProvidersControllerGetProvider401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type ProvidersControllerGetProvider429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const ProvidersControllerGetProvider429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type MarketsControllerGetMarketsParams = { readonly "offset"?: number, readonly "limit"?: number, readonly "providerId"?: "hyperliquid" | "hyperliquid-xyz", readonly "sortBy"?: "volume24h" | "markPrice" | "priceChangePercent24h", readonly "order"?: "asc" | "desc" } +export const MarketsControllerGetMarketsParams = Schema.Struct({ "offset": Schema.optionalKey(Schema.Number.annotate({ "default": 0 }).check(Schema.isFinite()).check(Schema.isGreaterThanOrEqualTo(0))), "limit": Schema.optionalKey(Schema.Number.annotate({ "default": 100 }).check(Schema.isFinite()).check(Schema.isGreaterThanOrEqualTo(1)).check(Schema.isLessThanOrEqualTo(500))), "providerId": Schema.optionalKey(Schema.Literals(["hyperliquid", "hyperliquid-xyz"])), "sortBy": Schema.optionalKey(Schema.Literals(["volume24h", "markPrice", "priceChangePercent24h"])), "order": Schema.optionalKey(Schema.Literals(["asc", "desc"])) }) +export type MarketsControllerGetMarkets200 = { readonly "total": number, readonly "offset": number, readonly "limit": number, readonly "items"?: ReadonlyArray } +export const MarketsControllerGetMarkets200 = Schema.Struct({ "total": Schema.Number.annotate({ "description": "Total number of items available", "examples": [150] }).check(Schema.isFinite()), "offset": Schema.Number.annotate({ "description": "Offset of the current page", "examples": [0] }).check(Schema.isFinite()), "limit": Schema.Number.annotate({ "description": "Limit of the current page", "examples": [100] }).check(Schema.isFinite()), "items": Schema.optionalKey(Schema.Array(MarketDto)) }) +export type MarketsControllerGetMarkets401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const MarketsControllerGetMarkets401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type MarketsControllerGetMarkets429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const MarketsControllerGetMarkets429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type MarketsControllerGetCandlesParams = { readonly "interval": "1m" | "5m" | "15m" | "1h" | "4h" | "1d", readonly "from": number, readonly "to"?: number } +export const MarketsControllerGetCandlesParams = Schema.Struct({ "interval": Schema.Literals(["1m", "5m", "15m", "1h", "4h", "1d"]), "from": Schema.Number.check(Schema.isFinite()), "to": Schema.optionalKey(Schema.Number.check(Schema.isFinite())) }) +export type MarketsControllerGetCandles200 = CandlesResponseDto +export const MarketsControllerGetCandles200 = CandlesResponseDto +export type MarketsControllerGetCandles401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const MarketsControllerGetCandles401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type MarketsControllerGetCandles429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const MarketsControllerGetCandles429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type MarketsControllerGetMarketById200 = MarketDetailDto +export const MarketsControllerGetMarketById200 = MarketDetailDto +export type MarketsControllerGetMarketById401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const MarketsControllerGetMarketById401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type MarketsControllerGetMarketById429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const MarketsControllerGetMarketById429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type PortfolioControllerGetPositionsRequestJson = PortfolioRequestDto +export const PortfolioControllerGetPositionsRequestJson = PortfolioRequestDto +export type PortfolioControllerGetPositions200 = ReadonlyArray +export const PortfolioControllerGetPositions200 = Schema.Array(PositionDto) +export type PortfolioControllerGetPositions401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const PortfolioControllerGetPositions401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type PortfolioControllerGetPositions429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const PortfolioControllerGetPositions429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type PortfolioControllerGetOrdersRequestJson = PortfolioRequestDto +export const PortfolioControllerGetOrdersRequestJson = PortfolioRequestDto +export type PortfolioControllerGetOrders200 = ReadonlyArray +export const PortfolioControllerGetOrders200 = Schema.Array(OrderDto) +export type PortfolioControllerGetOrders401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const PortfolioControllerGetOrders401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type PortfolioControllerGetOrders429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const PortfolioControllerGetOrders429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type PortfolioControllerGetBalancesRequestJson = PortfolioRequestDto +export const PortfolioControllerGetBalancesRequestJson = PortfolioRequestDto +export type PortfolioControllerGetBalances200 = BalanceDto +export const PortfolioControllerGetBalances200 = BalanceDto +export type PortfolioControllerGetBalances401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const PortfolioControllerGetBalances401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type PortfolioControllerGetBalances429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const PortfolioControllerGetBalances429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type ActionsControllerGetActionsParams = { readonly "offset"?: number, readonly "limit"?: number, readonly "address": string, readonly "providerId": string, readonly "status"?: ActionStatus, readonly "statuses"?: ReadonlyArray, readonly "type"?: PerpActionTypes, readonly "marketId"?: string } +export const ActionsControllerGetActionsParams = Schema.Struct({ "offset": Schema.optionalKey(Schema.Number.annotate({ "default": 0 }).check(Schema.isFinite()).check(Schema.isGreaterThanOrEqualTo(0))), "limit": Schema.optionalKey(Schema.Number.annotate({ "default": 100 }).check(Schema.isFinite()).check(Schema.isGreaterThanOrEqualTo(1)).check(Schema.isLessThanOrEqualTo(500))), "address": Schema.String, "providerId": Schema.String, "status": Schema.optionalKey(ActionStatus), "statuses": Schema.optionalKey(Schema.Array(ActionStatus)), "type": Schema.optionalKey(PerpActionTypes), "marketId": Schema.optionalKey(Schema.String) }) +export type ActionsControllerGetActions200 = { readonly "total": number, readonly "offset": number, readonly "limit": number, readonly "items"?: ReadonlyArray } +export const ActionsControllerGetActions200 = Schema.Struct({ "total": Schema.Number.annotate({ "description": "Total number of items available", "examples": [150] }).check(Schema.isFinite()), "offset": Schema.Number.annotate({ "description": "Offset of the current page", "examples": [0] }).check(Schema.isFinite()), "limit": Schema.Number.annotate({ "description": "Limit of the current page", "examples": [100] }).check(Schema.isFinite()), "items": Schema.optionalKey(Schema.Array(ActionDto)) }) +export type ActionsControllerGetActions401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const ActionsControllerGetActions401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type ActionsControllerGetActions429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const ActionsControllerGetActions429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type ActionsControllerExecuteActionRequestJson = ActionRequestDto +export const ActionsControllerExecuteActionRequestJson = ActionRequestDto +export type ActionsControllerExecuteAction200 = ActionDto +export const ActionsControllerExecuteAction200 = ActionDto +export type ActionsControllerExecuteAction401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const ActionsControllerExecuteAction401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type ActionsControllerExecuteAction429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const ActionsControllerExecuteAction429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type ActionsControllerGetAction200 = ActionDto +export const ActionsControllerGetAction200 = ActionDto +export type ActionsControllerGetAction401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const ActionsControllerGetAction401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type ActionsControllerGetAction429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const ActionsControllerGetAction429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type ActivityControllerGetActivityParams = { readonly "offset"?: number, readonly "limit"?: number, readonly "address": string, readonly "providerId": string, readonly "actionStatus"?: ActionStatus, readonly "actionStatuses"?: ReadonlyArray } +export const ActivityControllerGetActivityParams = Schema.Struct({ "offset": Schema.optionalKey(Schema.Number.annotate({ "default": 0 }).check(Schema.isFinite()).check(Schema.isGreaterThanOrEqualTo(0))), "limit": Schema.optionalKey(Schema.Number.annotate({ "default": 100 }).check(Schema.isFinite()).check(Schema.isGreaterThanOrEqualTo(1)).check(Schema.isLessThanOrEqualTo(500))), "address": Schema.String, "providerId": Schema.String, "actionStatus": Schema.optionalKey(ActionStatus), "actionStatuses": Schema.optionalKey(Schema.Array(ActionStatus)) }) +export type ActivityControllerGetActivity200 = { readonly "total": number, readonly "offset": number, readonly "limit": number, readonly "items"?: ReadonlyArray } +export const ActivityControllerGetActivity200 = Schema.Struct({ "total": Schema.Number.annotate({ "description": "Total number of items available", "examples": [150] }).check(Schema.isFinite()), "offset": Schema.Number.annotate({ "description": "Offset of the current page", "examples": [0] }).check(Schema.isFinite()), "limit": Schema.Number.annotate({ "description": "Limit of the current page", "examples": [100] }).check(Schema.isFinite()), "items": Schema.optionalKey(Schema.Array(Schema.Union([ActivityEventItemDto, ActivityActionItemDto], { mode: "oneOf" }))) }) +export type ActivityControllerGetActivity401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const ActivityControllerGetActivity401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type ActivityControllerGetActivity429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const ActivityControllerGetActivity429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type EventsControllerGetEventsParams = { readonly "offset"?: number, readonly "limit"?: number, readonly "address": string, readonly "providerId": string, readonly "eventType"?: PerpEventType, readonly "eventTypes"?: ReadonlyArray, readonly "marketId"?: string, readonly "perpActionId"?: string, readonly "providerOrderId"?: string, readonly "fromDate"?: string, readonly "toDate"?: string } +export const EventsControllerGetEventsParams = Schema.Struct({ "offset": Schema.optionalKey(Schema.Number.annotate({ "default": 0 }).check(Schema.isFinite()).check(Schema.isGreaterThanOrEqualTo(0))), "limit": Schema.optionalKey(Schema.Number.annotate({ "default": 100 }).check(Schema.isFinite()).check(Schema.isGreaterThanOrEqualTo(1)).check(Schema.isLessThanOrEqualTo(500))), "address": Schema.String, "providerId": Schema.String, "eventType": Schema.optionalKey(PerpEventType), "eventTypes": Schema.optionalKey(Schema.Array(PerpEventType)), "marketId": Schema.optionalKey(Schema.String), "perpActionId": Schema.optionalKey(Schema.String.annotate({ "format": "uuid" })), "providerOrderId": Schema.optionalKey(Schema.String), "fromDate": Schema.optionalKey(Schema.String), "toDate": Schema.optionalKey(Schema.String) }) +export type EventsControllerGetEvents200 = { readonly "total": number, readonly "offset": number, readonly "limit": number, readonly "items"?: ReadonlyArray } +export const EventsControllerGetEvents200 = Schema.Struct({ "total": Schema.Number.annotate({ "description": "Total number of items available", "examples": [150] }).check(Schema.isFinite()), "offset": Schema.Number.annotate({ "description": "Offset of the current page", "examples": [0] }).check(Schema.isFinite()), "limit": Schema.Number.annotate({ "description": "Limit of the current page", "examples": [100] }).check(Schema.isFinite()), "items": Schema.optionalKey(Schema.Array(EventDto)) }) +export type EventsControllerGetEvents401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const EventsControllerGetEvents401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type EventsControllerGetEvents429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const EventsControllerGetEvents429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type EventsControllerGetEvent200 = EventDto +export const EventsControllerGetEvent200 = EventDto +export type EventsControllerGetEvent401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const EventsControllerGetEvent401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type EventsControllerGetEvent429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const EventsControllerGetEvent429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type TransactionsControllerSubmitTransactionRequestJson = SubmitTransactionDto +export const TransactionsControllerSubmitTransactionRequestJson = SubmitTransactionDto +export type TransactionsControllerSubmitTransaction200 = SubmitTransactionResponseDto +export const TransactionsControllerSubmitTransaction200 = SubmitTransactionResponseDto +export type TransactionsControllerSubmitTransaction401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export const TransactionsControllerSubmitTransaction401 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Invalid API key"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Unauthorized"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [401] }).check(Schema.isFinite())) }) +export type TransactionsControllerSubmitTransaction429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export const TransactionsControllerSubmitTransaction429 = Schema.Struct({ "message": Schema.optionalKey(Schema.String.annotate({ "examples": ["Rate limit exceeded"] })), "error": Schema.optionalKey(Schema.String.annotate({ "examples": ["Too Many Requests"] })), "statusCode": Schema.optionalKey(Schema.Number.annotate({ "examples": [429] }).check(Schema.isFinite())), "retryAfter": Schema.optionalKey(Schema.Number.annotate({ "examples": [30] }).check(Schema.isFinite())) }) +export type HealthControllerHealth200 = HealthStatusDto +export const HealthControllerHealth200 = HealthStatusDto + +export interface OperationConfig { + /** + * Whether or not the response should be included in the value returned from + * an operation. + * + * If set to `true`, a tuple of `[A, HttpClientResponse]` will be returned, + * where `A` is the success type of the operation. + * + * If set to `false`, only the success type of the operation will be returned. + */ + readonly includeResponse?: boolean | undefined +} /** -* The health status of the service -*/ -export class HealthStatus extends S.Literal("OK", "FAIL") {} - -export class HealthStatusDto extends S.Class("HealthStatusDto")({ - "status": HealthStatus, - /** -* Timestamp when the health check was performed -*/ -"timestamp": S.String -}) {} + * A utility type which optionally includes the response in the return result + * of an operation based upon the value of the `includeResponse` configuration + * option. + */ +export type WithOptionalResponse = Config extends { + readonly includeResponse: true +} ? [A, HttpClientResponse.HttpClientResponse] : A export const make = ( - httpClient: HttpClient.HttpClient, + httpClient: HttpClient.HttpClient, options: { readonly transformClient?: ((client: HttpClient.HttpClient) => Effect.Effect) | undefined } = {} @@ -995,33 +202,37 @@ export const make = ( Effect.orElseSucceed(response.json, () => "Unexpected status code"), (description) => Effect.fail( - new HttpClientError.ResponseError({ - request: response.request, - response, - reason: "StatusCode", - description: typeof description === "string" ? description : JSON.stringify(description), + new HttpClientError.HttpClientError({ + reason: new HttpClientError.StatusCodeError({ + request: response.request, + response, + description: typeof description === "string" ? description : JSON.stringify(description), + }), }), ), ) - const withResponse: ( - f: (response: HttpClientResponse.HttpClientResponse) => Effect.Effect, - ) => ( - request: HttpClientRequest.HttpClientRequest, - ) => Effect.Effect = options.transformClient - ? (f) => (request) => - Effect.flatMap( - Effect.flatMap(options.transformClient!(httpClient), (client) => - client.execute(request), - ), - f, - ) - : (f) => (request) => Effect.flatMap(httpClient.execute(request), f) + const withResponse = (config: Config | undefined) => ( + f: (response: HttpClientResponse.HttpClientResponse) => Effect.Effect, + ): (request: HttpClientRequest.HttpClientRequest) => Effect.Effect => { + const withOptionalResponse = ( + config?.includeResponse + ? (response: HttpClientResponse.HttpClientResponse) => Effect.map(f(response), (a) => [a, response]) + : (response: HttpClientResponse.HttpClientResponse) => f(response) + ) as any + return options?.transformClient + ? (request) => + Effect.flatMap( + Effect.flatMap(options.transformClient!(httpClient), (client) => client.execute(request)), + withOptionalResponse + ) + : (request) => Effect.flatMap(httpClient.execute(request), withOptionalResponse) + } const decodeSuccess = - (schema: S.Schema) => + (schema: Schema) => (response: HttpClientResponse.HttpClientResponse) => HttpClientResponse.schemaBodyJson(schema)(response) const decodeError = - (tag: Tag, schema: S.Schema) => + (tag: Tag, schema: Schema) => (response: HttpClientResponse.HttpClientResponse) => Effect.flatMap( HttpClientResponse.schemaBodyJson(schema)(response), @@ -1029,109 +240,137 @@ export const make = ( ) return { httpClient, - "ProvidersControllerGetProviders": () => HttpClientRequest.get(`/v1/providers`).pipe( - withResponse(HttpClientResponse.matchStatus({ + "ProvidersControllerGetProviders": (options) => HttpClientRequest.get(`/v1/providers`).pipe( + withResponse(options?.config)(HttpClientResponse.matchStatus({ "2xx": decodeSuccess(ProvidersControllerGetProviders200), "401": decodeError("ProvidersControllerGetProviders401", ProvidersControllerGetProviders401), "429": decodeError("ProvidersControllerGetProviders429", ProvidersControllerGetProviders429), orElse: unexpectedStatus })) ), - "ProvidersControllerGetProvider": (providerId) => HttpClientRequest.get(`/v1/providers/${providerId}`).pipe( - withResponse(HttpClientResponse.matchStatus({ - "2xx": decodeSuccess(ProviderDto), + "ProvidersControllerGetProvider": (providerId, options) => HttpClientRequest.get(`/v1/providers/${providerId}`).pipe( + withResponse(options?.config)(HttpClientResponse.matchStatus({ + "2xx": decodeSuccess(ProvidersControllerGetProvider200), "401": decodeError("ProvidersControllerGetProvider401", ProvidersControllerGetProvider401), "429": decodeError("ProvidersControllerGetProvider429", ProvidersControllerGetProvider429), "404": () => Effect.void, orElse: unexpectedStatus })) ), - "MarketsControllerGetMarkets": (options) => HttpClientRequest.get(`/v1/markets`).pipe( - HttpClientRequest.setUrlParams({ "offset": options?.["offset"] as any, "limit": options?.["limit"] as any, "providerId": options?.["providerId"] as any, "sortBy": options?.["sortBy"] as any, "order": options?.["order"] as any }), - withResponse(HttpClientResponse.matchStatus({ + "MarketsControllerGetMarkets": (options) => HttpClientRequest.get(`/v1/markets`).pipe( + HttpClientRequest.setUrlParams({ "offset": options?.params?.["offset"] as any, "limit": options?.params?.["limit"] as any, "providerId": options?.params?.["providerId"] as any, "sortBy": options?.params?.["sortBy"] as any, "order": options?.params?.["order"] as any }), + withResponse(options?.config)(HttpClientResponse.matchStatus({ "2xx": decodeSuccess(MarketsControllerGetMarkets200), "401": decodeError("MarketsControllerGetMarkets401", MarketsControllerGetMarkets401), "429": decodeError("MarketsControllerGetMarkets429", MarketsControllerGetMarkets429), + "400": () => Effect.void, orElse: unexpectedStatus })) ), - "MarketsControllerGetCandles": (marketId, options) => HttpClientRequest.get(`/v1/markets/${marketId}/candles`).pipe( - HttpClientRequest.setUrlParams({ "interval": options?.["interval"] as any, "from": options?.["from"] as any, "to": options?.["to"] as any }), - withResponse(HttpClientResponse.matchStatus({ - "2xx": decodeSuccess(CandlesResponseDto), + "MarketsControllerGetCandles": (marketId, options) => HttpClientRequest.get(`/v1/markets/${marketId}/candles`).pipe( + HttpClientRequest.setUrlParams({ "interval": options.params["interval"] as any, "from": options.params["from"] as any, "to": options.params["to"] as any }), + withResponse(options.config)(HttpClientResponse.matchStatus({ + "2xx": decodeSuccess(MarketsControllerGetCandles200), "401": decodeError("MarketsControllerGetCandles401", MarketsControllerGetCandles401), "429": decodeError("MarketsControllerGetCandles429", MarketsControllerGetCandles429), "400": () => Effect.void, orElse: unexpectedStatus })) ), - "MarketsControllerGetMarketById": (marketId) => HttpClientRequest.get(`/v1/markets/${marketId}`).pipe( - withResponse(HttpClientResponse.matchStatus({ - "2xx": decodeSuccess(MarketDetailDto), + "MarketsControllerGetMarketById": (marketId, options) => HttpClientRequest.get(`/v1/markets/${marketId}`).pipe( + withResponse(options?.config)(HttpClientResponse.matchStatus({ + "2xx": decodeSuccess(MarketsControllerGetMarketById200), "401": decodeError("MarketsControllerGetMarketById401", MarketsControllerGetMarketById401), "429": decodeError("MarketsControllerGetMarketById429", MarketsControllerGetMarketById429), "404": () => Effect.void, orElse: unexpectedStatus })) ), - "PortfolioControllerGetPositions": (options) => HttpClientRequest.post(`/v1/positions`).pipe( - HttpClientRequest.bodyUnsafeJson(options), - withResponse(HttpClientResponse.matchStatus({ + "PortfolioControllerGetPositions": (options) => HttpClientRequest.post(`/v1/positions`).pipe( + HttpClientRequest.bodyJsonUnsafe(options.payload), + withResponse(options.config)(HttpClientResponse.matchStatus({ "2xx": decodeSuccess(PortfolioControllerGetPositions200), "401": decodeError("PortfolioControllerGetPositions401", PortfolioControllerGetPositions401), "429": decodeError("PortfolioControllerGetPositions429", PortfolioControllerGetPositions429), orElse: unexpectedStatus })) ), - "PortfolioControllerGetOrders": (options) => HttpClientRequest.post(`/v1/orders`).pipe( - HttpClientRequest.bodyUnsafeJson(options), - withResponse(HttpClientResponse.matchStatus({ + "PortfolioControllerGetOrders": (options) => HttpClientRequest.post(`/v1/orders`).pipe( + HttpClientRequest.bodyJsonUnsafe(options.payload), + withResponse(options.config)(HttpClientResponse.matchStatus({ "2xx": decodeSuccess(PortfolioControllerGetOrders200), "401": decodeError("PortfolioControllerGetOrders401", PortfolioControllerGetOrders401), "429": decodeError("PortfolioControllerGetOrders429", PortfolioControllerGetOrders429), orElse: unexpectedStatus })) ), - "PortfolioControllerGetBalances": (options) => HttpClientRequest.post(`/v1/balances`).pipe( - HttpClientRequest.bodyUnsafeJson(options), - withResponse(HttpClientResponse.matchStatus({ - "2xx": decodeSuccess(BalanceDto), + "PortfolioControllerGetBalances": (options) => HttpClientRequest.post(`/v1/balances`).pipe( + HttpClientRequest.bodyJsonUnsafe(options.payload), + withResponse(options.config)(HttpClientResponse.matchStatus({ + "2xx": decodeSuccess(PortfolioControllerGetBalances200), "401": decodeError("PortfolioControllerGetBalances401", PortfolioControllerGetBalances401), "429": decodeError("PortfolioControllerGetBalances429", PortfolioControllerGetBalances429), orElse: unexpectedStatus })) ), - "ActionsControllerGetActions": (options) => HttpClientRequest.get(`/v1/actions`).pipe( - HttpClientRequest.setUrlParams({ "offset": options?.["offset"] as any, "limit": options?.["limit"] as any, "address": options?.["address"] as any, "providerId": options?.["providerId"] as any, "status": options?.["status"] as any, "statuses": options?.["statuses"] as any, "type": options?.["type"] as any, "marketId": options?.["marketId"] as any }), - withResponse(HttpClientResponse.matchStatus({ + "ActionsControllerGetActions": (options) => HttpClientRequest.get(`/v1/actions`).pipe( + HttpClientRequest.setUrlParams({ "offset": options.params["offset"] as any, "limit": options.params["limit"] as any, "address": options.params["address"] as any, "providerId": options.params["providerId"] as any, "status": options.params["status"] as any, "statuses": options.params["statuses"] as any, "type": options.params["type"] as any, "marketId": options.params["marketId"] as any }), + withResponse(options.config)(HttpClientResponse.matchStatus({ "2xx": decodeSuccess(ActionsControllerGetActions200), "401": decodeError("ActionsControllerGetActions401", ActionsControllerGetActions401), "429": decodeError("ActionsControllerGetActions429", ActionsControllerGetActions429), orElse: unexpectedStatus })) ), - "ActionsControllerExecuteAction": (options) => HttpClientRequest.post(`/v1/actions`).pipe( - HttpClientRequest.bodyUnsafeJson(options), - withResponse(HttpClientResponse.matchStatus({ - "2xx": decodeSuccess(ActionDto), + "ActionsControllerExecuteAction": (options) => HttpClientRequest.post(`/v1/actions`).pipe( + HttpClientRequest.bodyJsonUnsafe(options.payload), + withResponse(options.config)(HttpClientResponse.matchStatus({ + "2xx": decodeSuccess(ActionsControllerExecuteAction200), "401": decodeError("ActionsControllerExecuteAction401", ActionsControllerExecuteAction401), "429": decodeError("ActionsControllerExecuteAction429", ActionsControllerExecuteAction429), orElse: unexpectedStatus })) ), - "ActionsControllerGetAction": (id) => HttpClientRequest.get(`/v1/actions/${id}`).pipe( - withResponse(HttpClientResponse.matchStatus({ - "2xx": decodeSuccess(ActionDto), + "ActionsControllerGetAction": (id, options) => HttpClientRequest.get(`/v1/actions/${id}`).pipe( + withResponse(options?.config)(HttpClientResponse.matchStatus({ + "2xx": decodeSuccess(ActionsControllerGetAction200), "401": decodeError("ActionsControllerGetAction401", ActionsControllerGetAction401), "429": decodeError("ActionsControllerGetAction429", ActionsControllerGetAction429), "404": () => Effect.void, orElse: unexpectedStatus })) ), - "TransactionsControllerSubmitTransaction": (transactionId, options) => HttpClientRequest.post(`/v1/transactions/${transactionId}/submit`).pipe( - HttpClientRequest.bodyUnsafeJson(options), - withResponse(HttpClientResponse.matchStatus({ - "2xx": decodeSuccess(SubmitTransactionResponseDto), + "ActivityControllerGetActivity": (options) => HttpClientRequest.get(`/v1/activity`).pipe( + HttpClientRequest.setUrlParams({ "offset": options.params["offset"] as any, "limit": options.params["limit"] as any, "address": options.params["address"] as any, "providerId": options.params["providerId"] as any, "actionStatus": options.params["actionStatus"] as any, "actionStatuses": options.params["actionStatuses"] as any }), + withResponse(options.config)(HttpClientResponse.matchStatus({ + "2xx": decodeSuccess(ActivityControllerGetActivity200), + "401": decodeError("ActivityControllerGetActivity401", ActivityControllerGetActivity401), + "429": decodeError("ActivityControllerGetActivity429", ActivityControllerGetActivity429), + orElse: unexpectedStatus + })) + ), + "EventsControllerGetEvents": (options) => HttpClientRequest.get(`/v1/events`).pipe( + HttpClientRequest.setUrlParams({ "offset": options.params["offset"] as any, "limit": options.params["limit"] as any, "address": options.params["address"] as any, "providerId": options.params["providerId"] as any, "eventType": options.params["eventType"] as any, "eventTypes": options.params["eventTypes"] as any, "marketId": options.params["marketId"] as any, "perpActionId": options.params["perpActionId"] as any, "providerOrderId": options.params["providerOrderId"] as any, "fromDate": options.params["fromDate"] as any, "toDate": options.params["toDate"] as any }), + withResponse(options.config)(HttpClientResponse.matchStatus({ + "2xx": decodeSuccess(EventsControllerGetEvents200), + "401": decodeError("EventsControllerGetEvents401", EventsControllerGetEvents401), + "429": decodeError("EventsControllerGetEvents429", EventsControllerGetEvents429), + orElse: unexpectedStatus + })) + ), + "EventsControllerGetEvent": (id, options) => HttpClientRequest.get(`/v1/events/${id}`).pipe( + withResponse(options?.config)(HttpClientResponse.matchStatus({ + "2xx": decodeSuccess(EventsControllerGetEvent200), + "401": decodeError("EventsControllerGetEvent401", EventsControllerGetEvent401), + "429": decodeError("EventsControllerGetEvent429", EventsControllerGetEvent429), + "404": () => Effect.void, + orElse: unexpectedStatus + })) + ), + "TransactionsControllerSubmitTransaction": (transactionId, options) => HttpClientRequest.post(`/v1/transactions/${transactionId}/submit`).pipe( + HttpClientRequest.bodyJsonUnsafe(options.payload), + withResponse(options.config)(HttpClientResponse.matchStatus({ + "2xx": decodeSuccess(TransactionsControllerSubmitTransaction200), "401": decodeError("TransactionsControllerSubmitTransaction401", TransactionsControllerSubmitTransaction401), "429": decodeError("TransactionsControllerSubmitTransaction429", TransactionsControllerSubmitTransaction429), "403": () => Effect.void, @@ -1139,9 +378,9 @@ export const make = ( orElse: unexpectedStatus })) ), - "HealthControllerHealth": () => HttpClientRequest.get(`/health`).pipe( - withResponse(HttpClientResponse.matchStatus({ - "2xx": decodeSuccess(HealthStatusDto), + "HealthControllerHealth": (options) => HttpClientRequest.get(`/health`).pipe( + withResponse(options?.config)(HttpClientResponse.matchStatus({ + "2xx": decodeSuccess(HealthControllerHealth200), orElse: unexpectedStatus })) ) @@ -1153,55 +392,67 @@ export interface SKClient { /** * Retrieve a list of available perps trading providers with their supported actions and argument schemas. */ -readonly "ProvidersControllerGetProviders": () => Effect.Effect | SKClientError<"ProvidersControllerGetProviders429", typeof ProvidersControllerGetProviders429.Type>> +readonly "ProvidersControllerGetProviders": (options: { readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"ProvidersControllerGetProviders401", typeof ProvidersControllerGetProviders401.Type> | SKClientError<"ProvidersControllerGetProviders429", typeof ProvidersControllerGetProviders429.Type>> /** * Retrieve detailed information about a specific perps trading provider */ -readonly "ProvidersControllerGetProvider": (providerId: string) => Effect.Effect | SKClientError<"ProvidersControllerGetProvider429", typeof ProvidersControllerGetProvider429.Type>> +readonly "ProvidersControllerGetProvider": (providerId: string, options: { readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"ProvidersControllerGetProvider401", typeof ProvidersControllerGetProvider401.Type> | SKClientError<"ProvidersControllerGetProvider429", typeof ProvidersControllerGetProvider429.Type>> /** * Retrieve a paginated list of available perps markets across all supported providers and instruments. */ -readonly "MarketsControllerGetMarkets": (options?: typeof MarketsControllerGetMarketsParams.Encoded | undefined) => Effect.Effect | SKClientError<"MarketsControllerGetMarkets429", typeof MarketsControllerGetMarkets429.Type>> +readonly "MarketsControllerGetMarkets": (options: { readonly params?: typeof MarketsControllerGetMarketsParams.Encoded | undefined; readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"MarketsControllerGetMarkets401", typeof MarketsControllerGetMarkets401.Type> | SKClientError<"MarketsControllerGetMarkets429", typeof MarketsControllerGetMarkets429.Type>> /** * Retrieve historical OHLCV candle data for a market. Limited to 5000 candles per request. */ -readonly "MarketsControllerGetCandles": (marketId: string, options: typeof MarketsControllerGetCandlesParams.Encoded) => Effect.Effect | SKClientError<"MarketsControllerGetCandles429", typeof MarketsControllerGetCandles429.Type>> +readonly "MarketsControllerGetCandles": (marketId: string, options: { readonly params: typeof MarketsControllerGetCandlesParams.Encoded; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"MarketsControllerGetCandles401", typeof MarketsControllerGetCandles401.Type> | SKClientError<"MarketsControllerGetCandles429", typeof MarketsControllerGetCandles429.Type>> /** * Retrieve a single market by its ID, including chart display configuration. */ -readonly "MarketsControllerGetMarketById": (marketId: string) => Effect.Effect | SKClientError<"MarketsControllerGetMarketById429", typeof MarketsControllerGetMarketById429.Type>> +readonly "MarketsControllerGetMarketById": (marketId: string, options: { readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"MarketsControllerGetMarketById401", typeof MarketsControllerGetMarketById401.Type> | SKClientError<"MarketsControllerGetMarketById429", typeof MarketsControllerGetMarketById429.Type>> /** * Retrieve all active positions for a wallet address on a specific perps trading provider. */ -readonly "PortfolioControllerGetPositions": (options: typeof PortfolioRequestDto.Encoded) => Effect.Effect | SKClientError<"PortfolioControllerGetPositions429", typeof PortfolioControllerGetPositions429.Type>> +readonly "PortfolioControllerGetPositions": (options: { readonly payload: typeof PortfolioControllerGetPositionsRequestJson.Encoded; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"PortfolioControllerGetPositions401", typeof PortfolioControllerGetPositions401.Type> | SKClientError<"PortfolioControllerGetPositions429", typeof PortfolioControllerGetPositions429.Type>> /** * Retrieve all open orders for a wallet address on a specific perps trading provider. */ -readonly "PortfolioControllerGetOrders": (options: typeof PortfolioRequestDto.Encoded) => Effect.Effect | SKClientError<"PortfolioControllerGetOrders429", typeof PortfolioControllerGetOrders429.Type>> +readonly "PortfolioControllerGetOrders": (options: { readonly payload: typeof PortfolioControllerGetOrdersRequestJson.Encoded; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"PortfolioControllerGetOrders401", typeof PortfolioControllerGetOrders401.Type> | SKClientError<"PortfolioControllerGetOrders429", typeof PortfolioControllerGetOrders429.Type>> /** * Retrieve account balance and margin information for a wallet address on a specific perps trading provider. */ -readonly "PortfolioControllerGetBalances": (options: typeof PortfolioRequestDto.Encoded) => Effect.Effect | SKClientError<"PortfolioControllerGetBalances429", typeof PortfolioControllerGetBalances429.Type>> +readonly "PortfolioControllerGetBalances": (options: { readonly payload: typeof PortfolioControllerGetBalancesRequestJson.Encoded; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"PortfolioControllerGetBalances401", typeof PortfolioControllerGetBalances401.Type> | SKClientError<"PortfolioControllerGetBalances429", typeof PortfolioControllerGetBalances429.Type>> /** * Retrieve all actions performed by a user on a specific provider, with optional filtering by status and action type. Returns a paginated list ordered by most recent first. */ -readonly "ActionsControllerGetActions": (options: typeof ActionsControllerGetActionsParams.Encoded) => Effect.Effect | SKClientError<"ActionsControllerGetActions429", typeof ActionsControllerGetActions429.Type>> +readonly "ActionsControllerGetActions": (options: { readonly params: typeof ActionsControllerGetActionsParams.Encoded; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"ActionsControllerGetActions401", typeof ActionsControllerGetActions401.Type> | SKClientError<"ActionsControllerGetActions429", typeof ActionsControllerGetActions429.Type>> /** * Generate unsigned transactions for a trading action (open/close positions, manage leverage, set stop loss/take profit, fund/withdraw). Returns transaction data ready to be signed by the user. */ -readonly "ActionsControllerExecuteAction": (options: typeof ActionRequestDto.Encoded) => Effect.Effect | SKClientError<"ActionsControllerExecuteAction429", typeof ActionsControllerExecuteAction429.Type>> +readonly "ActionsControllerExecuteAction": (options: { readonly payload: typeof ActionsControllerExecuteActionRequestJson.Encoded; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"ActionsControllerExecuteAction401", typeof ActionsControllerExecuteAction401.Type> | SKClientError<"ActionsControllerExecuteAction429", typeof ActionsControllerExecuteAction429.Type>> /** * Retrieve detailed information about a specific action including current status, transactions, and execution details. */ -readonly "ActionsControllerGetAction": (id: string) => Effect.Effect | SKClientError<"ActionsControllerGetAction429", typeof ActionsControllerGetAction429.Type>> +readonly "ActionsControllerGetAction": (id: string, options: { readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"ActionsControllerGetAction401", typeof ActionsControllerGetAction401.Type> | SKClientError<"ActionsControllerGetAction429", typeof ActionsControllerGetAction429.Type>> + /** +* Paginated chronological feed of timeline events and user actions for an address on a provider (newest first). Events use occurredAt; actions use createdAt. +*/ +readonly "ActivityControllerGetActivity": (options: { readonly params: typeof ActivityControllerGetActivityParams.Encoded; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"ActivityControllerGetActivity401", typeof ActivityControllerGetActivity401.Type> | SKClientError<"ActivityControllerGetActivity429", typeof ActivityControllerGetActivity429.Type>> + /** +* Retrieve async venue outcomes (fills, liquidations, SL/TP triggers) for a user on a specific provider. Returns a paginated list ordered by most recent first. +*/ +readonly "EventsControllerGetEvents": (options: { readonly params: typeof EventsControllerGetEventsParams.Encoded; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"EventsControllerGetEvents401", typeof EventsControllerGetEvents401.Type> | SKClientError<"EventsControllerGetEvents429", typeof EventsControllerGetEvents429.Type>> + /** +* Retrieve a single perp event by its UUID. +*/ +readonly "EventsControllerGetEvent": (id: string, options: { readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"EventsControllerGetEvent401", typeof EventsControllerGetEvent401.Type> | SKClientError<"EventsControllerGetEvent429", typeof EventsControllerGetEvent429.Type>> /** * Submit a signed transaction to the blockchain or protocol, or record a transaction hash if already submitted. Provide either signedPayload (to have us broadcast) or transactionHash (if already submitted). The transaction must have been created via the actions endpoint. */ -readonly "TransactionsControllerSubmitTransaction": (transactionId: string, options: typeof SubmitTransactionDto.Encoded) => Effect.Effect | SKClientError<"TransactionsControllerSubmitTransaction429", typeof TransactionsControllerSubmitTransaction429.Type>> +readonly "TransactionsControllerSubmitTransaction": (transactionId: string, options: { readonly payload: typeof TransactionsControllerSubmitTransactionRequestJson.Encoded; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SchemaError | SKClientError<"TransactionsControllerSubmitTransaction401", typeof TransactionsControllerSubmitTransaction401.Type> | SKClientError<"TransactionsControllerSubmitTransaction429", typeof TransactionsControllerSubmitTransaction429.Type>> /** * Get the health status of the perps API with current timestamp */ -readonly "HealthControllerHealth": () => Effect.Effect +readonly "HealthControllerHealth": (options: { readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SchemaError> } export interface SKClientError { diff --git a/packages/common/src/services/api-client/client-factory.ts b/packages/common/src/services/api-client/client-factory.ts index 38ba6c7..593ed4e 100644 --- a/packages/common/src/services/api-client/client-factory.ts +++ b/packages/common/src/services/api-client/client-factory.ts @@ -1,989 +1,116 @@ -import type * as HttpClient from "@effect/platform/HttpClient" -import * as HttpClientError from "@effect/platform/HttpClientError" -import * as HttpClientRequest from "@effect/platform/HttpClientRequest" -import * as HttpClientResponse from "@effect/platform/HttpClientResponse" import * as Data from "effect/Data" import * as Effect from "effect/Effect" - -export interface ProviderMetadataDto { - /** -* Provider description -*/ -readonly "description": string; - /** -* External link to the provider website -*/ -readonly "externalLink": string; - /** -* Provider logo URI -*/ -readonly "logoURI": string -} - -/** -* Action type executed -*/ +import type * as HttpClient from "effect/unstable/http/HttpClient" +import * as HttpClientError from "effect/unstable/http/HttpClientError" +import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest" +import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse" +// non-recursive definitions +export type ArgumentSchemaDto = { readonly "type"?: { }, readonly "properties"?: { }, readonly "required"?: ReadonlyArray, readonly "additionalProperties"?: { }, readonly "items"?: { readonly "type"?: { }, readonly "description"?: string, readonly "enum"?: ReadonlyArray, readonly "default"?: { }, readonly "minimum"?: number, readonly "maximum"?: number, readonly "minLength"?: number, readonly "maxLength"?: number, readonly "pattern"?: string, readonly "items"?: { }, readonly "properties"?: { }, readonly "required"?: ReadonlyArray, readonly "additionalProperties"?: { }, readonly "label"?: string, readonly "placeholder"?: string, readonly "optionsRef"?: string, readonly "options"?: ReadonlyArray }, readonly "enum"?: ReadonlyArray, readonly "default"?: { }, readonly "notes"?: string } export type PerpActionTypes = "open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl" - -export interface ProviderDto { - /** -* Provider identifier -*/ -readonly "id": string; - /** -* Provider name -*/ -readonly "name": string; - /** -* Network the provider operates on -*/ -readonly "network": string; - /** -* Provider metadata (description, logo, links) -*/ -readonly "metadata": ProviderMetadataDto; - readonly "supportedActions": PerpActionTypes; - /** -* Argument schemas for each supported action (JSON Schema format) -*/ -readonly "argumentSchemas": Record -} - +export type MarketDto = { readonly "id": string, readonly "providerId": string, readonly "baseAsset": { readonly "symbol": string, readonly "name"?: string, readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "decimals"?: number, readonly "address"?: string, readonly "logoURI"?: string }, readonly "quoteAsset": { readonly "symbol": string, readonly "name"?: string, readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "decimals"?: number, readonly "address"?: string, readonly "logoURI"?: string }, readonly "leverageRange": ReadonlyArray, readonly "supportedMarginModes": ReadonlyArray<"isolated" | "cross">, readonly "markPrice": number, readonly "oraclePrice": number, readonly "priceChange24h": number, readonly "priceChangePercent24h": number, readonly "volume24h": number, readonly "openInterest": number, readonly "makerFee"?: string, readonly "takerFee"?: string, readonly "fundingRate": string, readonly "fundingRateIntervalHours": number, readonly "minSize": number, readonly "metadata": { readonly "name": string, readonly "logoURI": string, readonly "url": string } } +export type MarketDetailDto = { readonly "id": string, readonly "providerId": string, readonly "baseAsset": { readonly "symbol": string, readonly "name"?: string, readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "decimals"?: number, readonly "address"?: string, readonly "logoURI"?: string }, readonly "quoteAsset": { readonly "symbol": string, readonly "name"?: string, readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "decimals"?: number, readonly "address"?: string, readonly "logoURI"?: string }, readonly "leverageRange": ReadonlyArray, readonly "supportedMarginModes": ReadonlyArray<"isolated" | "cross">, readonly "markPrice": number, readonly "oraclePrice": number, readonly "priceChange24h": number, readonly "priceChangePercent24h": number, readonly "volume24h": number, readonly "openInterest": number, readonly "makerFee"?: string, readonly "takerFee"?: string, readonly "fundingRate": string, readonly "fundingRateIntervalHours": number, readonly "minSize": number, readonly "metadata": { readonly "name": string, readonly "logoURI": string, readonly "url": string }, readonly "chartConfig": { readonly "pricescale": number, readonly "minmov": number, readonly "supportedResolutions": ReadonlyArray, readonly "hasIntraday": boolean, readonly "hasDaily": boolean } } +export type CandleDto = { readonly "openTime": number, readonly "closeTime": number, readonly "open": string, readonly "high": string, readonly "low": string, readonly "close": string, readonly "volume": string, readonly "trades": number } +export type PortfolioRequestDto = { readonly "address": string, readonly "providerId": string } +export type TokenIdentifierDto = { readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "address"?: string } +export type PendingActionDto = { readonly "type": "open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl", readonly "label": string, readonly "args": { readonly "marketId"?: string, readonly "side"?: "long" | "short", readonly "amount"?: string, readonly "size"?: string, readonly "leverage"?: number, readonly "marginMode"?: "cross" | "isolated", readonly "limitPrice"?: number, readonly "stopLossPrice"?: number, readonly "takeProfitPrice"?: number, readonly "orderId"?: string, readonly "orderIds"?: ReadonlyArray, readonly "assetIndex"?: number, readonly "fromToken"?: { readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "address"?: string }, readonly "agentAddress"?: string, readonly "agentName"?: string, readonly "validUntil"?: number, readonly "stopLossOrderId"?: string, readonly "takeProfitOrderId"?: string, readonly "skipApproval"?: boolean, readonly "fundingMethod"?: "bridge2" | "lifi" } } +export type BalanceDto = { readonly "providerId": string, readonly "collateral": { readonly "symbol": string, readonly "name"?: string, readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "decimals"?: number, readonly "address"?: string, readonly "logoURI"?: string }, readonly "accountValue": number, readonly "usedMargin": number, readonly "availableBalance": number, readonly "unrealizedPnl": number } +export type ActionRequestDto = { readonly "providerId": string, readonly "address": string, readonly "action": "open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl", readonly "args": { readonly "marketId"?: string, readonly "side"?: "long" | "short", readonly "amount"?: string, readonly "size"?: string, readonly "leverage"?: number, readonly "marginMode"?: "cross" | "isolated", readonly "limitPrice"?: number, readonly "stopLossPrice"?: number, readonly "takeProfitPrice"?: number, readonly "orderId"?: string, readonly "orderIds"?: ReadonlyArray, readonly "assetIndex"?: number, readonly "fromToken"?: { readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "address"?: string }, readonly "agentAddress"?: string, readonly "agentName"?: string, readonly "validUntil"?: number, readonly "stopLossOrderId"?: string, readonly "takeProfitOrderId"?: string, readonly "skipApproval"?: boolean, readonly "fundingMethod"?: "bridge2" | "lifi" } } +export type ActionStatus = "CANCELED" | "CREATED" | "WAITING_FOR_NEXT" | "PROCESSING" | "FAILED" | "SUCCESS" | "STALE" +export type TransactionDto = { readonly "id": string, readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "chainId": string, readonly "type": "APPROVAL" | "OPEN_POSITION" | "CLOSE_POSITION" | "UPDATE_LEVERAGE" | "STOP_LOSS" | "TAKE_PROFIT" | "CANCEL_ORDER" | "EDIT_ORDER" | "FUND" | "WITHDRAW" | "APPROVE_BUILDER_FEE" | "ENABLE_DEX_ABSTRACTION" | "APPROVE_AGENT" | "UPDATE_MARGIN" | "SET_TP_AND_SL", readonly "status": "CREATED" | "QUEUED" | "BROADCASTED" | "CONFIRMED" | "FAILED" | "NOT_FOUND", readonly "address": string, readonly "args"?: { readonly "marketId"?: string, readonly "side"?: "long" | "short", readonly "amount"?: string, readonly "size"?: string, readonly "leverage"?: number, readonly "marginMode"?: "cross" | "isolated", readonly "limitPrice"?: number, readonly "stopLossPrice"?: number, readonly "takeProfitPrice"?: number, readonly "orderId"?: string, readonly "orderIds"?: ReadonlyArray, readonly "assetIndex"?: number, readonly "fromToken"?: { readonly "network": "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid", readonly "address"?: string }, readonly "agentAddress"?: string, readonly "agentName"?: string, readonly "validUntil"?: number, readonly "stopLossOrderId"?: string, readonly "takeProfitOrderId"?: string, readonly "skipApproval"?: boolean, readonly "fundingMethod"?: "bridge2" | "lifi" }, readonly "signingFormat"?: "EVM_TRANSACTION" | "EIP712_TYPED_DATA" | "SOLANA_TRANSACTION" | "COSMOS_TRANSACTION", readonly "signablePayload"?: { }, readonly "rawPayload"?: { }, readonly "explorerUrls": ReadonlyArray } +export type PerpEventType = "order_filled" | "liquidation" | "stop_loss_triggered" | "take_profit_triggered" +export type SubmitTransactionDto = { readonly "signedPayload"?: string, readonly "transactionHash"?: string } +export type SubmitTransactionResponseDto = { readonly "transactionHash"?: string, readonly "link": string, readonly "status": "CREATED" | "QUEUED" | "BROADCASTED" | "CONFIRMED" | "FAILED" | "NOT_FOUND", readonly "error"?: string, readonly "details"?: { } } +export type HealthStatusDto = { readonly "status": "OK" | "FAIL", readonly "timestamp": string } +export type ProviderDto = { readonly "id": string, readonly "name": string, readonly "network": string, readonly "metadata": { readonly "description": string, readonly "externalLink": string, readonly "logoURI": string }, readonly "supportedActions": "open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl", readonly "argumentSchemas": { readonly [x: string]: ArgumentSchemaDto } } +export type CandlesResponseDto = { readonly "marketId": string, readonly "interval": "1m" | "5m" | "15m" | "1h" | "4h" | "1d", readonly "candles": ReadonlyArray } +export type PositionDto = { readonly "marketId": string, readonly "side": "long" | "short", readonly "size": string, readonly "entryPrice": number, readonly "markPrice": number, readonly "leverage": number, readonly "marginMode": "cross" | "isolated", readonly "margin": number, readonly "unrealizedPnl": number, readonly "funding": number, readonly "liquidationPrice": number, readonly "pendingActions": ReadonlyArray } +export type OrderDto = { readonly "marketId": string, readonly "side": "long" | "short", readonly "type": "market" | "limit" | "stop_loss" | "take_profit", readonly "size": string, readonly "limitPrice"?: number, readonly "triggerPrice"?: number, readonly "leverage"?: number, readonly "margin"?: number, readonly "reduceOnly": boolean, readonly "createdAt": number, readonly "pendingActions": ReadonlyArray } +export type ActionDto = { readonly "id": string, readonly "providerId": string, readonly "action": "open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl", readonly "status": "CANCELED" | "CREATED" | "WAITING_FOR_NEXT" | "PROCESSING" | "FAILED" | "SUCCESS" | "STALE", readonly "summary": { readonly "type": "Open Position" | "Close Position" | "Stop Loss" | "Take Profit" | "Set TP & SL" | "Cancel Order" | "Edit Order" | "Update Leverage" | "Update Margin" | "Fund Account" | "Withdraw" | "Approve Agent" | "Approve Builder Fee", readonly "assetId"?: number, readonly "orderType"?: "market" | "limit", readonly "direction"?: "long" | "short", readonly "asset"?: string, readonly "price"?: number, readonly "size"?: string, readonly "leverage"?: number, readonly "collateral"?: string, readonly "fee"?: string, readonly "orderValue"?: number, readonly "stopLoss"?: number, readonly "takeProfit"?: number, readonly "oldLiquidationPrice"?: number, readonly "estimatedLiquidationPrice"?: number, readonly "oldStopLoss"?: number, readonly "oldTakeProfit"?: number, readonly "marginMode"?: "cross" | "isolated", readonly "orderId"?: string, readonly "orderIds"?: ReadonlyArray, readonly "cancelledOrderTypes"?: ReadonlyArray<"tp" | "sl">, readonly "amount"?: string, readonly "fromToken"?: TokenIdentifierDto, readonly "method"?: string, readonly "agentAddress"?: string, readonly "agentName"?: string, readonly "closedPrice"?: number, readonly "pnl"?: string, readonly "margin"?: string, readonly "entryPrice"?: number, readonly "exitPrice"?: number } | null, readonly "signedMetadata"?: { }, readonly "transactions": ReadonlyArray, readonly "createdAt": string, readonly "completedAt": string } +export type EventDto = { readonly "id": string, readonly "eventType": PerpEventType, readonly "providerId": string, readonly "occurredAt": string, readonly "marketId"?: string | null, readonly "perpActionId"?: string, readonly "providerOrderId"?: string | null, readonly "explorerUrl"?: string | null, readonly "order": { readonly "orderId": string, readonly "marketId": string, readonly "asset": string, readonly "side": "buy" | "sell", readonly "type": "market" | "limit" | "stop_loss" | "take_profit", readonly "originalSizeBase": string, readonly "remainingSizeBase": string, readonly "limitPrice"?: number, readonly "timeInForce"?: "ioc" | "gtc" | "alo", readonly "triggerPrice"?: number, readonly "reduceOnly": boolean, readonly "isPositionLevel": boolean, readonly "clientOrderId": { } | null, readonly "childOrderIds": ReadonlyArray, readonly "createdAt": string, readonly "closedPnl"?: string, readonly "fillPrice"?: number } } +export type ActivityActionItemDto = { readonly "type": "event" | "action", readonly "action": ActionDto } +export type ActivityEventItemDto = { readonly "type": "event" | "action", readonly "event": EventDto } +// schemas export type ProvidersControllerGetProviders200 = ReadonlyArray - -export interface ProvidersControllerGetProviders401 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined -} - -export interface ProvidersControllerGetProviders429 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined; - readonly "retryAfter"?: number | undefined -} - -export interface ProvidersControllerGetProvider401 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined -} - -export interface ProvidersControllerGetProvider429 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined; - readonly "retryAfter"?: number | undefined -} - -export type MarketsControllerGetMarketsParamsSortBy = "volume24h" | "markPrice" | "priceChangePercent24h" - -export type MarketsControllerGetMarketsParamsOrder = "asc" | "desc" - -export interface MarketsControllerGetMarketsParams { - readonly "offset"?: number | undefined; - readonly "limit"?: number | undefined; - readonly "providerId"?: string | undefined; - readonly "sortBy"?: MarketsControllerGetMarketsParamsSortBy | undefined; - readonly "order"?: MarketsControllerGetMarketsParamsOrder | undefined -} - -/** -* Network identifier -*/ -export type Networks = "ethereum" | "ethereum-goerli" | "ethereum-holesky" | "ethereum-sepolia" | "ethereum-hoodi" | "arbitrum" | "base" | "base-sepolia" | "gnosis" | "optimism" | "polygon" | "polygon-amoy" | "starknet" | "zksync" | "linea" | "unichain" | "monad-testnet" | "monad" | "avalanche-c" | "avalanche-c-atomic" | "avalanche-p" | "binance" | "celo" | "fantom" | "harmony" | "moonriver" | "okc" | "viction" | "core" | "sonic" | "plasma" | "katana" | "hyperevm" | "agoric" | "akash" | "axelar" | "band-protocol" | "bitsong" | "canto" | "chihuahua" | "comdex" | "coreum" | "cosmos" | "crescent" | "cronos" | "cudos" | "desmos" | "dydx" | "evmos" | "fetch-ai" | "gravity-bridge" | "injective" | "irisnet" | "juno" | "kava" | "ki-network" | "mars-protocol" | "nym" | "okex-chain" | "onomy" | "osmosis" | "persistence" | "quicksilver" | "regen" | "secret" | "sentinel" | "sommelier" | "stafi" | "stargaze" | "stride" | "teritori" | "tgrade" | "umee" | "sei" | "mantra" | "celestia" | "saga" | "zetachain" | "dymension" | "humansai" | "neutron" | "polkadot" | "kusama" | "westend" | "bittensor" | "aptos" | "binancebeacon" | "cardano" | "near" | "solana" | "solana-devnet" | "stellar" | "stellar-testnet" | "sui" | "tezos" | "tron" | "ton" | "ton-testnet" | "hyperliquid" - -export interface TokenDto { - /** -* Token symbol -*/ -readonly "symbol": string; - /** -* Token name -*/ -readonly "name"?: string | undefined; - readonly "network": Networks; - /** -* Token decimals -*/ -readonly "decimals"?: number | undefined; - /** -* Token contract address (optional for native tokens) -*/ -readonly "address"?: string | undefined; - /** -* Token logo URI -*/ -readonly "logoURI"?: string | undefined -} - -export interface MarketMetadataDto { - /** -* Market name -*/ -readonly "name": string; - /** -* Market logo URI -*/ -readonly "logoURI": string; - /** -* Market URL -*/ -readonly "url": string -} - -export interface MarketDto { - /** -* Market ID -*/ -readonly "id": string; - /** -* Provider ID -*/ -readonly "providerId": string; - /** -* Base asset information -*/ -readonly "baseAsset": TokenDto; - /** -* Quote asset information -*/ -readonly "quoteAsset": TokenDto; - /** -* Leverage range [min, max] -*/ -readonly "leverageRange": ReadonlyArray; - /** -* Supported margin modes -*/ -readonly "supportedMarginModes": ReadonlyArray<"isolated" | "cross">; - /** -* Current mark price -*/ -readonly "markPrice": number; - /** -* Oracle/index price -*/ -readonly "oraclePrice": number; - /** -* Absolute price change in 24h -*/ -readonly "priceChange24h": number; - /** -* Percentage price change in 24h -*/ -readonly "priceChangePercent24h": number; - /** -* 24h trading volume in quote asset (e.g., USDC) -*/ -readonly "volume24h": number; - /** -* Open interest in base asset units (e.g., number of ETH coins, not USD notional) -*/ -readonly "openInterest": number; - /** -* Maker fee rate -*/ -readonly "makerFee"?: string | undefined; - /** -* Taker fee rate -*/ -readonly "takerFee"?: string | undefined; - /** -* Current funding rate -*/ -readonly "fundingRate": string; - /** -* Funding rate interval in hours -*/ -readonly "fundingRateIntervalHours": number; - /** -* Minimum position size in USD (notional) computed at the current mark price. Typically prevents rejection for being below the $10 minimum, but actual executed notional may differ due to limit/market slippage or price quantization. -*/ -readonly "minSize": number; - /** -* Market metadata -*/ -readonly "metadata": MarketMetadataDto -} - -export interface MarketsControllerGetMarkets200 { - /** -* Total number of items available -*/ -readonly "total": number; - /** -* Offset of the current page -*/ -readonly "offset": number; - /** -* Limit of the current page -*/ -readonly "limit": number; - readonly "items"?: ReadonlyArray | undefined -} - -export interface MarketsControllerGetMarkets401 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined -} - -export interface MarketsControllerGetMarkets429 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined; - readonly "retryAfter"?: number | undefined -} - -export type MarketsControllerGetCandlesParamsInterval = "1m" | "5m" | "15m" | "1h" | "4h" | "1d" - -export interface MarketsControllerGetCandlesParams { - readonly "interval": MarketsControllerGetCandlesParamsInterval; - readonly "from": number; - readonly "to"?: number | undefined -} - -export type CandlesResponseDtoInterval = "1m" | "5m" | "15m" | "1h" | "4h" | "1d" - -export interface CandleDto { - /** -* Candle open time (unix milliseconds) -*/ -readonly "openTime": number; - /** -* Candle close time (unix milliseconds) -*/ -readonly "closeTime": number; - readonly "open": string; - readonly "high": string; - readonly "low": string; - readonly "close": string; - /** -* Volume in base asset units -*/ -readonly "volume": string; - /** -* Number of trades in this candle -*/ -readonly "trades": number -} - -export interface CandlesResponseDto { - readonly "marketId": string; - readonly "interval": CandlesResponseDtoInterval; - readonly "candles": ReadonlyArray -} - -export interface MarketsControllerGetCandles401 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined -} - -export interface MarketsControllerGetCandles429 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined; - readonly "retryAfter"?: number | undefined -} - -export interface ChartConfigDto { - /** -* Price scale (e.g., 100 for 2 decimals, 10000 for 4) -*/ -readonly "pricescale": number; - /** -* Minimum price movement (usually 1) -*/ -readonly "minmov": number; - /** -* Supported chart resolutions -*/ -readonly "supportedResolutions": ReadonlyArray; - /** -* Whether intraday data is supported -*/ -readonly "hasIntraday": boolean; - /** -* Whether daily data is supported -*/ -readonly "hasDaily": boolean -} - -export interface MarketDetailDto { - /** -* Market ID -*/ -readonly "id": string; - /** -* Provider ID -*/ -readonly "providerId": string; - /** -* Base asset information -*/ -readonly "baseAsset": TokenDto; - /** -* Quote asset information -*/ -readonly "quoteAsset": TokenDto; - /** -* Leverage range [min, max] -*/ -readonly "leverageRange": ReadonlyArray; - /** -* Supported margin modes -*/ -readonly "supportedMarginModes": ReadonlyArray<"isolated" | "cross">; - /** -* Current mark price -*/ -readonly "markPrice": number; - /** -* Oracle/index price -*/ -readonly "oraclePrice": number; - /** -* Absolute price change in 24h -*/ -readonly "priceChange24h": number; - /** -* Percentage price change in 24h -*/ -readonly "priceChangePercent24h": number; - /** -* 24h trading volume in quote asset (e.g., USDC) -*/ -readonly "volume24h": number; - /** -* Open interest in base asset units (e.g., number of ETH coins, not USD notional) -*/ -readonly "openInterest": number; - /** -* Maker fee rate -*/ -readonly "makerFee"?: string | undefined; - /** -* Taker fee rate -*/ -readonly "takerFee"?: string | undefined; - /** -* Current funding rate -*/ -readonly "fundingRate": string; - /** -* Funding rate interval in hours -*/ -readonly "fundingRateIntervalHours": number; - /** -* Minimum position size in USD (notional) computed at the current mark price. Typically prevents rejection for being below the $10 minimum, but actual executed notional may differ due to limit/market slippage or price quantization. -*/ -readonly "minSize": number; - /** -* Market metadata -*/ -readonly "metadata": MarketMetadataDto; - /** -* Chart display configuration -*/ -readonly "chartConfig": ChartConfigDto -} - -export interface MarketsControllerGetMarketById401 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined -} - -export interface MarketsControllerGetMarketById429 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined; - readonly "retryAfter"?: number | undefined -} - -export interface PortfolioRequestDto { - /** -* User wallet address -*/ -readonly "address": string; - /** -* Provider ID -*/ -readonly "providerId": string -} - -/** -* Order side -*/ -export type PositionSide = "long" | "short" - -/** -* Margin mode - isolated (dedicated collateral) or cross (shared collateral) -*/ -export type MarginMode = "cross" | "isolated" - -export interface TokenIdentifierDto { - readonly "network": Networks; - /** -* Token contract address. Leave empty for native tokens like ETH. -*/ -readonly "address"?: string | undefined -} - -/** -* Funding method: "bridge2" for direct Hyperliquid Bridge2 (Arbitrum USDC only), "lifi" for LiFi bridging (any token/network). If not provided, defaults to bridge2 for Arbitrum USDC and lifi for others. -*/ -export type FundingMethod = "bridge2" | "lifi" - -export interface ArgumentsDto { - /** -* Market identifier -*/ -readonly "marketId"?: string | undefined; - readonly "side"?: PositionSide | undefined; - /** -* Margin/collateral amount in USD (alternative to size). Min: $10 -*/ -readonly "amount"?: string | undefined; - /** -* Position size in USD (alternative to amount). Min: $10 -*/ -readonly "size"?: string | undefined; - /** -* Leverage multiplier -*/ -readonly "leverage"?: number | undefined; - readonly "marginMode"?: MarginMode | undefined; - /** -* Limit price. If provided, order will be placed as a limit order at this price. If not provided, order executes immediately as a market order. -*/ -readonly "limitPrice"?: number | undefined; - /** -* Stop loss trigger price -*/ -readonly "stopLossPrice"?: number | undefined; - /** -* Take profit trigger price -*/ -readonly "takeProfitPrice"?: number | undefined; - /** -* Order ID (for cancelOrder, or for updating existing stopLoss/takeProfit) -*/ -readonly "orderId"?: string | undefined; - /** -* Order IDs for batch cancelOrder -*/ -readonly "orderIds"?: ReadonlyArray | undefined; - /** -* Asset index (internal) -*/ -readonly "assetIndex"?: number | undefined; - /** -* Source token for cross-chain funding (bridge/swap from another chain) -*/ -readonly "fromToken"?: TokenIdentifierDto | undefined; - /** -* Agent wallet address to approve (for approveAgent action) -*/ -readonly "agentAddress"?: string | undefined; - /** -* Name for the agent wallet (for approveAgent action). If not provided, defaults to "key". -*/ -readonly "agentName"?: string | undefined; - /** -* Unix timestamp (seconds) when agent approval expires. If not provided, never expires. -*/ -readonly "validUntil"?: number | undefined; - /** -* Existing stop loss order ID (for updating via SET_TP_AND_SL bundled action) -*/ -readonly "stopLossOrderId"?: string | undefined; - /** -* Existing take profit order ID (for updating via SET_TP_AND_SL bundled action) -*/ -readonly "takeProfitOrderId"?: string | undefined; - /** -* Skip the ERC20 approval transaction. -*/ -readonly "skipApproval"?: boolean | undefined; - readonly "fundingMethod"?: FundingMethod | undefined -} - -export interface PendingActionDto { - readonly "type": PerpActionTypes; - /** -* Action label -*/ -readonly "label": string; - /** -* Pre-filled arguments for the action -*/ -readonly "args": ArgumentsDto -} - -export interface PositionDto { - /** -* Market ID -*/ -readonly "marketId": string; - readonly "side": PositionSide; - /** -* Position size in base asset -*/ -readonly "size": string; - /** -* Entry price -*/ -readonly "entryPrice": number; - /** -* Current mark price -*/ -readonly "markPrice": number; - /** -* Leverage multiplier -*/ -readonly "leverage": number; - readonly "marginMode": MarginMode; - /** -* Margin amount -*/ -readonly "margin": number; - /** -* Unrealized PnL from price movement -*/ -readonly "unrealizedPnl": number; - /** -* Net cumulative funding received (positive) or paid (negative) since open -*/ -readonly "funding": number; - /** -* Liquidation price -*/ -readonly "liquidationPrice": number; - /** -* Available actions for this position -*/ -readonly "pendingActions": ReadonlyArray -} - +export type ProvidersControllerGetProviders401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type ProvidersControllerGetProviders429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type ProvidersControllerGetProvider200 = ProviderDto +export type ProvidersControllerGetProvider401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type ProvidersControllerGetProvider429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type MarketsControllerGetMarketsParams = { readonly "offset"?: number, readonly "limit"?: number, readonly "providerId"?: "hyperliquid" | "hyperliquid-xyz", readonly "sortBy"?: "volume24h" | "markPrice" | "priceChangePercent24h", readonly "order"?: "asc" | "desc" } +export type MarketsControllerGetMarkets200 = { readonly "total": number, readonly "offset": number, readonly "limit": number, readonly "items"?: ReadonlyArray } +export type MarketsControllerGetMarkets401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type MarketsControllerGetMarkets429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type MarketsControllerGetCandlesParams = { readonly "interval": "1m" | "5m" | "15m" | "1h" | "4h" | "1d", readonly "from": number, readonly "to"?: number } +export type MarketsControllerGetCandles200 = CandlesResponseDto +export type MarketsControllerGetCandles401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type MarketsControllerGetCandles429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type MarketsControllerGetMarketById200 = MarketDetailDto +export type MarketsControllerGetMarketById401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type MarketsControllerGetMarketById429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type PortfolioControllerGetPositionsRequestJson = PortfolioRequestDto export type PortfolioControllerGetPositions200 = ReadonlyArray - -export interface PortfolioControllerGetPositions401 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined -} - -export interface PortfolioControllerGetPositions429 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined; - readonly "retryAfter"?: number | undefined -} - -/** -* Order type -*/ -export type OrderType = "limit" | "stop_loss" | "take_profit" - -export interface OrderDto { - /** -* Market ID -*/ -readonly "marketId": string; - readonly "side": PositionSide; - readonly "type": OrderType; - /** -* Order size in base asset -*/ -readonly "size": string; - /** -* Limit price -*/ -readonly "limitPrice"?: number | undefined; - /** -* Trigger price -*/ -readonly "triggerPrice"?: number | undefined; - /** -* Current leverage setting for this asset, when available from the underlying venue -*/ -readonly "leverage"?: number | undefined; - /** -* Margin for this order, derived from current venue state when available. This is an estimate, not an exact exchange-reported value. -*/ -readonly "margin"?: number | undefined; - /** -* Reduce only flag -*/ -readonly "reduceOnly": boolean; - /** -* Creation timestamp -*/ -readonly "createdAt": number; - /** -* Available actions for this order -*/ -readonly "pendingActions": ReadonlyArray -} - +export type PortfolioControllerGetPositions401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type PortfolioControllerGetPositions429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type PortfolioControllerGetOrdersRequestJson = PortfolioRequestDto export type PortfolioControllerGetOrders200 = ReadonlyArray - -export interface PortfolioControllerGetOrders401 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined -} - -export interface PortfolioControllerGetOrders429 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined; - readonly "retryAfter"?: number | undefined -} - -export interface BalanceDto { - /** -* Provider ID -*/ -readonly "providerId": string; - /** -* Collateral token (all values denominated in this token) -*/ -readonly "collateral": TokenDto; - /** -* Total account value in collateral asset -*/ -readonly "accountValue": number; - /** -* Margin used by positions in collateral asset -*/ -readonly "usedMargin": number; - /** -* Available balance for new positions in collateral asset -*/ -readonly "availableBalance": number; - /** -* Total price PnL across all positions in collateral asset (excludes funding) -*/ -readonly "unrealizedPnl": number -} - -export interface PortfolioControllerGetBalances401 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined -} - -export interface PortfolioControllerGetBalances429 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined; - readonly "retryAfter"?: number | undefined -} - -/** -* Current action status -*/ -export type ActionStatus = "CANCELED" | "CREATED" | "WAITING_FOR_NEXT" | "PROCESSING" | "FAILED" | "SUCCESS" | "STALE" - -export interface ActionsControllerGetActionsParams { - readonly "offset"?: number | undefined; - readonly "limit"?: number | undefined; - readonly "address": string; - readonly "providerId": string; - readonly "status"?: ActionStatus | undefined; - readonly "statuses"?: ReadonlyArray | undefined; - readonly "type"?: PerpActionTypes | undefined; - readonly "marketId"?: string | undefined -} - -/** -* Human-readable action label -*/ -export type ActionSummaryDtoType = "Open Position" | "Close Position" | "Stop Loss" | "Take Profit" | "Set TP & SL" | "Cancel Order" | "Edit Order" | "Update Leverage" | "Update Margin" | "Fund Account" | "Withdraw" | "Approve Agent" | "Approve Builder Fee" - -export type ActionSummaryDtoOrderType = "market" | "limit" - -export type ActionSummaryDtoDirection = "long" | "short" - -export type ActionSummaryDtoMarginMode = "cross" | "isolated" - -export interface ActionSummaryDto { - /** -* Human-readable action label -*/ -readonly "type": ActionSummaryDtoType; - readonly "assetId"?: number | undefined; - readonly "orderType"?: ActionSummaryDtoOrderType | undefined; - readonly "direction"?: ActionSummaryDtoDirection | undefined; - readonly "asset"?: string | undefined; - readonly "price"?: number | undefined; - readonly "size"?: string | undefined; - readonly "leverage"?: number | undefined; - readonly "collateral"?: string | undefined; - /** -* Fee rate as decimal string -*/ -readonly "fee"?: string | undefined; - /** -* Actual position notional value after size quantization (orderPrice × quantizedSize) -*/ -readonly "orderValue"?: number | undefined; - readonly "stopLoss"?: number | undefined; - readonly "takeProfit"?: number | undefined; - /** -* Update Margin: liquidation price before this margin change. -*/ -readonly "oldLiquidationPrice"?: number | undefined; - /** -* Approximation — actual value depends on exchange mechanics -*/ -readonly "estimatedLiquidationPrice"?: number | undefined; - readonly "oldStopLoss"?: number | undefined; - readonly "oldTakeProfit"?: number | undefined; - readonly "marginMode"?: ActionSummaryDtoMarginMode | undefined; - readonly "orderId"?: string | undefined; - readonly "orderIds"?: ReadonlyArray | undefined; - readonly "amount"?: string | undefined; - readonly "fromToken"?: TokenIdentifierDto | undefined; - readonly "method"?: string | undefined; - readonly "agentAddress"?: string | undefined; - readonly "agentName"?: string | undefined; - /** -* Close position: expected close price at submission (limit price if limit close, else mark price) -*/ -readonly "closedPrice"?: number | undefined; - /** -* Close position: unrealized Pnl on the positon at submission (expected PnL if fully closing at mark) -*/ -readonly "pnl"?: string | undefined; - /** -* Close position: deposited margin for the position at submission (isolated margin only, excludes unrealized PnL) -*/ -readonly "margin"?: string | undefined +export type PortfolioControllerGetOrders401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type PortfolioControllerGetOrders429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type PortfolioControllerGetBalancesRequestJson = PortfolioRequestDto +export type PortfolioControllerGetBalances200 = BalanceDto +export type PortfolioControllerGetBalances401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type PortfolioControllerGetBalances429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type ActionsControllerGetActionsParams = { readonly "offset"?: number, readonly "limit"?: number, readonly "address": string, readonly "providerId": string, readonly "status"?: ActionStatus, readonly "statuses"?: ReadonlyArray, readonly "type"?: PerpActionTypes, readonly "marketId"?: string } +export type ActionsControllerGetActions200 = { readonly "total": number, readonly "offset": number, readonly "limit": number, readonly "items"?: ReadonlyArray } +export type ActionsControllerGetActions401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type ActionsControllerGetActions429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type ActionsControllerExecuteActionRequestJson = ActionRequestDto +export type ActionsControllerExecuteAction200 = ActionDto +export type ActionsControllerExecuteAction401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type ActionsControllerExecuteAction429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type ActionsControllerGetAction200 = ActionDto +export type ActionsControllerGetAction401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type ActionsControllerGetAction429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type ActivityControllerGetActivityParams = { readonly "offset"?: number, readonly "limit"?: number, readonly "address": string, readonly "providerId": string, readonly "actionStatus"?: ActionStatus, readonly "actionStatuses"?: ReadonlyArray } +export type ActivityControllerGetActivity200 = { readonly "total": number, readonly "offset": number, readonly "limit": number, readonly "items"?: ReadonlyArray } +export type ActivityControllerGetActivity401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type ActivityControllerGetActivity429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type EventsControllerGetEventsParams = { readonly "offset"?: number, readonly "limit"?: number, readonly "address": string, readonly "providerId": string, readonly "eventType"?: PerpEventType, readonly "eventTypes"?: ReadonlyArray, readonly "marketId"?: string, readonly "perpActionId"?: string, readonly "providerOrderId"?: string, readonly "fromDate"?: string, readonly "toDate"?: string } +export type EventsControllerGetEvents200 = { readonly "total": number, readonly "offset": number, readonly "limit": number, readonly "items"?: ReadonlyArray } +export type EventsControllerGetEvents401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type EventsControllerGetEvents429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type EventsControllerGetEvent200 = EventDto +export type EventsControllerGetEvent401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type EventsControllerGetEvent429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type TransactionsControllerSubmitTransactionRequestJson = SubmitTransactionDto +export type TransactionsControllerSubmitTransaction200 = SubmitTransactionResponseDto +export type TransactionsControllerSubmitTransaction401 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number } +export type TransactionsControllerSubmitTransaction429 = { readonly "message"?: string, readonly "error"?: string, readonly "statusCode"?: number, readonly "retryAfter"?: number } +export type HealthControllerHealth200 = HealthStatusDto + +export interface OperationConfig { + /** + * Whether or not the response should be included in the value returned from + * an operation. + * + * If set to `true`, a tuple of `[A, HttpClientResponse]` will be returned, + * where `A` is the success type of the operation. + * + * If set to `false`, only the success type of the operation will be returned. + */ + readonly includeResponse?: boolean | undefined } /** -* Transaction type -*/ -export type PerpTransactionType = "APPROVAL" | "OPEN_POSITION" | "CLOSE_POSITION" | "UPDATE_LEVERAGE" | "STOP_LOSS" | "TAKE_PROFIT" | "CANCEL_ORDER" | "EDIT_ORDER" | "FUND" | "WITHDRAW" | "APPROVE_BUILDER_FEE" | "ENABLE_DEX_ABSTRACTION" | "APPROVE_AGENT" | "UPDATE_MARGIN" | "SET_TP_AND_SL" - -/** -* Transaction status after submission -*/ -export type PerpTransactionStatus = "CREATED" | "QUEUED" | "BROADCASTED" | "CONFIRMED" | "FAILED" | "NOT_FOUND" - -/** -* Signing format required -*/ -export type SigningFormat = "EVM_TRANSACTION" | "EIP712_TYPED_DATA" | "SOLANA_TRANSACTION" | "COSMOS_TRANSACTION" - -export interface TransactionDto { - /** -* Transaction ID for API tracking (UUID) -*/ -readonly "id": string; - readonly "network": Networks; - /** -* Chain ID -*/ -readonly "chainId": string; - readonly "type": PerpTransactionType; - readonly "status": PerpTransactionStatus; - /** -* User address -*/ -readonly "address": string; - /** -* Action arguments -*/ -readonly "args"?: ArgumentsDto | undefined; - readonly "signingFormat"?: SigningFormat | undefined; - /** -* Unsigned transaction payload to sign -*/ -readonly "signablePayload"?: Record | undefined; - /** -* Raw action payload with nonce that this transaction commits to. Use it to independently recompute the EIP-712 connectionId and verify transaction integrity. Present for L1 transactions; undefined for standard EVM transactions where signablePayload is self-describing. -*/ -readonly "rawPayload"?: Record | undefined; - /** -* Block explorer URL for this transaction -*/ -readonly "explorerUrl"?: Record | null | undefined -} - -export interface ActionDto { - /** -* Unique action identifier (UUID) -*/ -readonly "id": string; - /** -* Provider identifier -*/ -readonly "providerId": string; - readonly "action": PerpActionTypes; - readonly "status": ActionStatus; - /** -* Human-readable breakdown of what this action does -*/ -readonly "summary": ActionSummaryDto | null; - /** -* TLV-encoded, secp256k1-signed metadata. -* -* Hex string of concatenated TLV fields. Each field: Tag (1 byte) + Length (1 byte) + Value (N bytes). Tags > 0x7f use a 3-byte header: 0x81 prefix + Tag (1 byte) + Length (1 byte). -* -* Fields in order: STRUCTURE_TYPE (0x01), VERSION (0x02), ACTION_TYPE (0x81 0xd0, u8: order=0x00 modify=0x01 cancel=0x02 updateLeverage=0x03 close=0x04 updateIsolatedMargin=0x05), ASSET_ID (0x81 0xd1, uint32 BE), ASSET_TICKER (0x24, UTF-8), NETWORK_TYPE (0x81 0xd2), BUILDER_ADDRESS (0x81 0xd3, 20 bytes, optional), MARGIN (0x81 0xd4, u64 big-endian, USD value with 6 decimal precision, e.g. 87500000 = $87.50, optional), LEVERAGE (0x81 0xd5, u32 big-endian, optional), SIGNATURE (0x15, DER-encoded secp256k1 over SHA-256 of preceding bytes). -*/ -readonly "signedMetadata"?: Record | undefined; - /** -* Unsigned transactions to sign and submit -*/ -readonly "transactions": ReadonlyArray; - /** -* When the action was created -*/ -readonly "createdAt": string; - /** -* When the action completed (null if still in progress) -*/ -readonly "completedAt": string | null -} - -export interface ActionsControllerGetActions200 { - /** -* Total number of items available -*/ -readonly "total": number; - /** -* Offset of the current page -*/ -readonly "offset": number; - /** -* Limit of the current page -*/ -readonly "limit": number; - readonly "items"?: ReadonlyArray | undefined -} - -export interface ActionsControllerGetActions401 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined -} - -export interface ActionsControllerGetActions429 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined; - readonly "retryAfter"?: number | undefined -} - -export interface ActionRequestDto { - /** -* Provider identifier -*/ -readonly "providerId": string; - /** -* User wallet address -*/ -readonly "address": string; - readonly "action": PerpActionTypes; - /** -* Action arguments (validated via Zod in chains) -*/ -readonly "args": ArgumentsDto -} - -export interface ActionsControllerExecuteAction401 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined -} - -export interface ActionsControllerExecuteAction429 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined; - readonly "retryAfter"?: number | undefined -} - -export interface ActionsControllerGetAction401 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined -} - -export interface ActionsControllerGetAction429 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined; - readonly "retryAfter"?: number | undefined -} - -export interface SubmitTransactionDto { - /** -* Signed transaction payload (hex string or signed EIP-712 data). Required if transactionHash is not provided. -*/ -readonly "signedPayload"?: string | undefined; - /** -* Transaction hash if already submitted by the user. Required if signedPayload is not provided. -*/ -readonly "transactionHash"?: string | undefined -} - -export interface SubmitTransactionResponseDto { - /** -* Transaction hash or order ID (undefined for immediate actions) -*/ -readonly "transactionHash"?: string | undefined; - /** -* Link to view transaction on provider platform -*/ -readonly "link": string; - readonly "status": PerpTransactionStatus; - /** -* Error message if status is FAILED -*/ -readonly "error"?: string | undefined; - /** -* Additional provider-specific details -*/ -readonly "details"?: Record | undefined -} - -export interface TransactionsControllerSubmitTransaction401 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined -} - -export interface TransactionsControllerSubmitTransaction429 { - readonly "message"?: string | undefined; - readonly "error"?: string | undefined; - readonly "statusCode"?: number | undefined; - readonly "retryAfter"?: number | undefined -} - -/** -* The health status of the service -*/ -export type HealthStatus = "OK" | "FAIL" - -export interface HealthStatusDto { - readonly "status": HealthStatus; - /** -* Timestamp when the health check was performed -*/ -readonly "timestamp": string -} + * A utility type which optionally includes the response in the return result + * of an operation based upon the value of the `includeResponse` configuration + * option. + */ +export type WithOptionalResponse = Config extends { + readonly includeResponse: true +} ? [A, HttpClientResponse.HttpClientResponse] : A export const make = ( - httpClient: HttpClient.HttpClient, + httpClient: HttpClient.HttpClient, options: { readonly transformClient?: ((client: HttpClient.HttpClient) => Effect.Effect) | undefined } = {} @@ -993,29 +120,33 @@ export const make = ( Effect.orElseSucceed(response.json, () => "Unexpected status code"), (description) => Effect.fail( - new HttpClientError.ResponseError({ - request: response.request, - response, - reason: "StatusCode", - description: typeof description === "string" ? description : JSON.stringify(description), + new HttpClientError.HttpClientError({ + reason: new HttpClientError.StatusCodeError({ + request: response.request, + response, + description: typeof description === "string" ? description : JSON.stringify(description), + }), }), ), ) - const withResponse: ( - f: (response: HttpClientResponse.HttpClientResponse) => Effect.Effect, - ) => ( - request: HttpClientRequest.HttpClientRequest, - ) => Effect.Effect = options.transformClient - ? (f) => (request) => - Effect.flatMap( - Effect.flatMap(options.transformClient!(httpClient), (client) => - client.execute(request), - ), - f, - ) - : (f) => (request) => Effect.flatMap(httpClient.execute(request), f) + const withResponse = (config: Config | undefined) => ( + f: (response: HttpClientResponse.HttpClientResponse) => Effect.Effect, + ): (request: HttpClientRequest.HttpClientRequest) => Effect.Effect => { + const withOptionalResponse = ( + config?.includeResponse + ? (response: HttpClientResponse.HttpClientResponse) => Effect.map(f(response), (a) => [a, response]) + : (response: HttpClientResponse.HttpClientResponse) => f(response) + ) as any + return options?.transformClient + ? (request) => + Effect.flatMap( + Effect.flatMap(options.transformClient!(httpClient), (client) => client.execute(request)), + withOptionalResponse + ) + : (request) => Effect.flatMap(httpClient.execute(request), withOptionalResponse) + } const decodeSuccess = (response: HttpClientResponse.HttpClientResponse) => - response.json as Effect.Effect + response.json as Effect.Effect const decodeVoid = (_response: HttpClientResponse.HttpClientResponse) => Effect.void const decodeError = @@ -1024,13 +155,13 @@ export const make = ( response: HttpClientResponse.HttpClientResponse, ): Effect.Effect< never, - SKClientError | HttpClientError.ResponseError + SKClientError | HttpClientError.HttpClientError > => Effect.flatMap( - response.json as Effect.Effect, + response.json as Effect.Effect, (cause) => Effect.fail(SKClientError(tag, cause, response)), ) - const onRequest = ( + const onRequest = (config: Config | undefined) => ( successCodes: ReadonlyArray, errorCodes?: Record, ) => { @@ -1046,56 +177,67 @@ export const make = ( if (successCodes.length === 0) { cases["2xx"] = decodeVoid } - return withResponse(HttpClientResponse.matchStatus(cases) as any) + return withResponse(config)(HttpClientResponse.matchStatus(cases) as any) } return { httpClient, - "ProvidersControllerGetProviders": () => HttpClientRequest.get(`/v1/providers`).pipe( - onRequest(["2xx"], {"401":"ProvidersControllerGetProviders401","429":"ProvidersControllerGetProviders429"}) + "ProvidersControllerGetProviders": (options) => HttpClientRequest.get(`/v1/providers`).pipe( + onRequest(options?.config)(["2xx"], {"401":"ProvidersControllerGetProviders401","429":"ProvidersControllerGetProviders429"}) + ), + "ProvidersControllerGetProvider": (providerId, options) => HttpClientRequest.get(`/v1/providers/${providerId}`).pipe( + onRequest(options?.config)(["2xx"], {"401":"ProvidersControllerGetProvider401","429":"ProvidersControllerGetProvider429"}) + ), + "MarketsControllerGetMarkets": (options) => HttpClientRequest.get(`/v1/markets`).pipe( + HttpClientRequest.setUrlParams({ "offset": options?.params?.["offset"] as any, "limit": options?.params?.["limit"] as any, "providerId": options?.params?.["providerId"] as any, "sortBy": options?.params?.["sortBy"] as any, "order": options?.params?.["order"] as any }), + onRequest(options?.config)(["2xx"], {"401":"MarketsControllerGetMarkets401","429":"MarketsControllerGetMarkets429"}) ), - "ProvidersControllerGetProvider": (providerId) => HttpClientRequest.get(`/v1/providers/${providerId}`).pipe( - onRequest(["2xx"], {"401":"ProvidersControllerGetProvider401","429":"ProvidersControllerGetProvider429"}) + "MarketsControllerGetCandles": (marketId, options) => HttpClientRequest.get(`/v1/markets/${marketId}/candles`).pipe( + HttpClientRequest.setUrlParams({ "interval": options.params["interval"] as any, "from": options.params["from"] as any, "to": options.params["to"] as any }), + onRequest(options.config)(["2xx"], {"401":"MarketsControllerGetCandles401","429":"MarketsControllerGetCandles429"}) ), - "MarketsControllerGetMarkets": (options) => HttpClientRequest.get(`/v1/markets`).pipe( - HttpClientRequest.setUrlParams({ "offset": options?.["offset"] as any, "limit": options?.["limit"] as any, "providerId": options?.["providerId"] as any, "sortBy": options?.["sortBy"] as any, "order": options?.["order"] as any }), - onRequest(["2xx"], {"401":"MarketsControllerGetMarkets401","429":"MarketsControllerGetMarkets429"}) + "MarketsControllerGetMarketById": (marketId, options) => HttpClientRequest.get(`/v1/markets/${marketId}`).pipe( + onRequest(options?.config)(["2xx"], {"401":"MarketsControllerGetMarketById401","429":"MarketsControllerGetMarketById429"}) ), - "MarketsControllerGetCandles": (marketId, options) => HttpClientRequest.get(`/v1/markets/${marketId}/candles`).pipe( - HttpClientRequest.setUrlParams({ "interval": options?.["interval"] as any, "from": options?.["from"] as any, "to": options?.["to"] as any }), - onRequest(["2xx"], {"401":"MarketsControllerGetCandles401","429":"MarketsControllerGetCandles429"}) + "PortfolioControllerGetPositions": (options) => HttpClientRequest.post(`/v1/positions`).pipe( + HttpClientRequest.bodyJsonUnsafe(options.payload), + onRequest(options.config)(["2xx"], {"401":"PortfolioControllerGetPositions401","429":"PortfolioControllerGetPositions429"}) ), - "MarketsControllerGetMarketById": (marketId) => HttpClientRequest.get(`/v1/markets/${marketId}`).pipe( - onRequest(["2xx"], {"401":"MarketsControllerGetMarketById401","429":"MarketsControllerGetMarketById429"}) + "PortfolioControllerGetOrders": (options) => HttpClientRequest.post(`/v1/orders`).pipe( + HttpClientRequest.bodyJsonUnsafe(options.payload), + onRequest(options.config)(["2xx"], {"401":"PortfolioControllerGetOrders401","429":"PortfolioControllerGetOrders429"}) ), - "PortfolioControllerGetPositions": (options) => HttpClientRequest.post(`/v1/positions`).pipe( - HttpClientRequest.bodyUnsafeJson(options), - onRequest(["2xx"], {"401":"PortfolioControllerGetPositions401","429":"PortfolioControllerGetPositions429"}) + "PortfolioControllerGetBalances": (options) => HttpClientRequest.post(`/v1/balances`).pipe( + HttpClientRequest.bodyJsonUnsafe(options.payload), + onRequest(options.config)(["2xx"], {"401":"PortfolioControllerGetBalances401","429":"PortfolioControllerGetBalances429"}) ), - "PortfolioControllerGetOrders": (options) => HttpClientRequest.post(`/v1/orders`).pipe( - HttpClientRequest.bodyUnsafeJson(options), - onRequest(["2xx"], {"401":"PortfolioControllerGetOrders401","429":"PortfolioControllerGetOrders429"}) + "ActionsControllerGetActions": (options) => HttpClientRequest.get(`/v1/actions`).pipe( + HttpClientRequest.setUrlParams({ "offset": options.params["offset"] as any, "limit": options.params["limit"] as any, "address": options.params["address"] as any, "providerId": options.params["providerId"] as any, "status": options.params["status"] as any, "statuses": options.params["statuses"] as any, "type": options.params["type"] as any, "marketId": options.params["marketId"] as any }), + onRequest(options.config)(["2xx"], {"401":"ActionsControllerGetActions401","429":"ActionsControllerGetActions429"}) ), - "PortfolioControllerGetBalances": (options) => HttpClientRequest.post(`/v1/balances`).pipe( - HttpClientRequest.bodyUnsafeJson(options), - onRequest(["2xx"], {"401":"PortfolioControllerGetBalances401","429":"PortfolioControllerGetBalances429"}) + "ActionsControllerExecuteAction": (options) => HttpClientRequest.post(`/v1/actions`).pipe( + HttpClientRequest.bodyJsonUnsafe(options.payload), + onRequest(options.config)(["2xx"], {"401":"ActionsControllerExecuteAction401","429":"ActionsControllerExecuteAction429"}) ), - "ActionsControllerGetActions": (options) => HttpClientRequest.get(`/v1/actions`).pipe( - HttpClientRequest.setUrlParams({ "offset": options?.["offset"] as any, "limit": options?.["limit"] as any, "address": options?.["address"] as any, "providerId": options?.["providerId"] as any, "status": options?.["status"] as any, "statuses": options?.["statuses"] as any, "type": options?.["type"] as any, "marketId": options?.["marketId"] as any }), - onRequest(["2xx"], {"401":"ActionsControllerGetActions401","429":"ActionsControllerGetActions429"}) + "ActionsControllerGetAction": (id, options) => HttpClientRequest.get(`/v1/actions/${id}`).pipe( + onRequest(options?.config)(["2xx"], {"401":"ActionsControllerGetAction401","429":"ActionsControllerGetAction429"}) ), - "ActionsControllerExecuteAction": (options) => HttpClientRequest.post(`/v1/actions`).pipe( - HttpClientRequest.bodyUnsafeJson(options), - onRequest(["2xx"], {"401":"ActionsControllerExecuteAction401","429":"ActionsControllerExecuteAction429"}) + "ActivityControllerGetActivity": (options) => HttpClientRequest.get(`/v1/activity`).pipe( + HttpClientRequest.setUrlParams({ "offset": options.params["offset"] as any, "limit": options.params["limit"] as any, "address": options.params["address"] as any, "providerId": options.params["providerId"] as any, "actionStatus": options.params["actionStatus"] as any, "actionStatuses": options.params["actionStatuses"] as any }), + onRequest(options.config)(["2xx"], {"401":"ActivityControllerGetActivity401","429":"ActivityControllerGetActivity429"}) ), - "ActionsControllerGetAction": (id) => HttpClientRequest.get(`/v1/actions/${id}`).pipe( - onRequest(["2xx"], {"401":"ActionsControllerGetAction401","429":"ActionsControllerGetAction429"}) + "EventsControllerGetEvents": (options) => HttpClientRequest.get(`/v1/events`).pipe( + HttpClientRequest.setUrlParams({ "offset": options.params["offset"] as any, "limit": options.params["limit"] as any, "address": options.params["address"] as any, "providerId": options.params["providerId"] as any, "eventType": options.params["eventType"] as any, "eventTypes": options.params["eventTypes"] as any, "marketId": options.params["marketId"] as any, "perpActionId": options.params["perpActionId"] as any, "providerOrderId": options.params["providerOrderId"] as any, "fromDate": options.params["fromDate"] as any, "toDate": options.params["toDate"] as any }), + onRequest(options.config)(["2xx"], {"401":"EventsControllerGetEvents401","429":"EventsControllerGetEvents429"}) ), - "TransactionsControllerSubmitTransaction": (transactionId, options) => HttpClientRequest.post(`/v1/transactions/${transactionId}/submit`).pipe( - HttpClientRequest.bodyUnsafeJson(options), - onRequest(["2xx"], {"401":"TransactionsControllerSubmitTransaction401","429":"TransactionsControllerSubmitTransaction429"}) + "EventsControllerGetEvent": (id, options) => HttpClientRequest.get(`/v1/events/${id}`).pipe( + onRequest(options?.config)(["2xx"], {"401":"EventsControllerGetEvent401","429":"EventsControllerGetEvent429"}) ), - "HealthControllerHealth": () => HttpClientRequest.get(`/health`).pipe( - onRequest(["2xx"]) + "TransactionsControllerSubmitTransaction": (transactionId, options) => HttpClientRequest.post(`/v1/transactions/${transactionId}/submit`).pipe( + HttpClientRequest.bodyJsonUnsafe(options.payload), + onRequest(options.config)(["2xx"], {"401":"TransactionsControllerSubmitTransaction401","429":"TransactionsControllerSubmitTransaction429"}) + ), + "HealthControllerHealth": (options) => HttpClientRequest.get(`/health`).pipe( + onRequest(options?.config)(["2xx"]) ) } } @@ -1105,55 +247,67 @@ export interface SKClient { /** * Retrieve a list of available perps trading providers with their supported actions and argument schemas. */ -readonly "ProvidersControllerGetProviders": () => Effect.Effect | SKClientError<"ProvidersControllerGetProviders429", ProvidersControllerGetProviders429>> +readonly "ProvidersControllerGetProviders": (options: { readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"ProvidersControllerGetProviders401", ProvidersControllerGetProviders401> | SKClientError<"ProvidersControllerGetProviders429", ProvidersControllerGetProviders429>> /** * Retrieve detailed information about a specific perps trading provider */ -readonly "ProvidersControllerGetProvider": (providerId: string) => Effect.Effect | SKClientError<"ProvidersControllerGetProvider429", ProvidersControllerGetProvider429>> +readonly "ProvidersControllerGetProvider": (providerId: string, options: { readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"ProvidersControllerGetProvider401", ProvidersControllerGetProvider401> | SKClientError<"ProvidersControllerGetProvider429", ProvidersControllerGetProvider429>> /** * Retrieve a paginated list of available perps markets across all supported providers and instruments. */ -readonly "MarketsControllerGetMarkets": (options?: MarketsControllerGetMarketsParams | undefined) => Effect.Effect | SKClientError<"MarketsControllerGetMarkets429", MarketsControllerGetMarkets429>> +readonly "MarketsControllerGetMarkets": (options: { readonly params?: MarketsControllerGetMarketsParams | undefined; readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"MarketsControllerGetMarkets401", MarketsControllerGetMarkets401> | SKClientError<"MarketsControllerGetMarkets429", MarketsControllerGetMarkets429>> /** * Retrieve historical OHLCV candle data for a market. Limited to 5000 candles per request. */ -readonly "MarketsControllerGetCandles": (marketId: string, options: MarketsControllerGetCandlesParams) => Effect.Effect | SKClientError<"MarketsControllerGetCandles429", MarketsControllerGetCandles429>> +readonly "MarketsControllerGetCandles": (marketId: string, options: { readonly params: MarketsControllerGetCandlesParams; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"MarketsControllerGetCandles401", MarketsControllerGetCandles401> | SKClientError<"MarketsControllerGetCandles429", MarketsControllerGetCandles429>> /** * Retrieve a single market by its ID, including chart display configuration. */ -readonly "MarketsControllerGetMarketById": (marketId: string) => Effect.Effect | SKClientError<"MarketsControllerGetMarketById429", MarketsControllerGetMarketById429>> +readonly "MarketsControllerGetMarketById": (marketId: string, options: { readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"MarketsControllerGetMarketById401", MarketsControllerGetMarketById401> | SKClientError<"MarketsControllerGetMarketById429", MarketsControllerGetMarketById429>> /** * Retrieve all active positions for a wallet address on a specific perps trading provider. */ -readonly "PortfolioControllerGetPositions": (options: PortfolioRequestDto) => Effect.Effect | SKClientError<"PortfolioControllerGetPositions429", PortfolioControllerGetPositions429>> +readonly "PortfolioControllerGetPositions": (options: { readonly payload: PortfolioControllerGetPositionsRequestJson; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"PortfolioControllerGetPositions401", PortfolioControllerGetPositions401> | SKClientError<"PortfolioControllerGetPositions429", PortfolioControllerGetPositions429>> /** * Retrieve all open orders for a wallet address on a specific perps trading provider. */ -readonly "PortfolioControllerGetOrders": (options: PortfolioRequestDto) => Effect.Effect | SKClientError<"PortfolioControllerGetOrders429", PortfolioControllerGetOrders429>> +readonly "PortfolioControllerGetOrders": (options: { readonly payload: PortfolioControllerGetOrdersRequestJson; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"PortfolioControllerGetOrders401", PortfolioControllerGetOrders401> | SKClientError<"PortfolioControllerGetOrders429", PortfolioControllerGetOrders429>> /** * Retrieve account balance and margin information for a wallet address on a specific perps trading provider. */ -readonly "PortfolioControllerGetBalances": (options: PortfolioRequestDto) => Effect.Effect | SKClientError<"PortfolioControllerGetBalances429", PortfolioControllerGetBalances429>> +readonly "PortfolioControllerGetBalances": (options: { readonly payload: PortfolioControllerGetBalancesRequestJson; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"PortfolioControllerGetBalances401", PortfolioControllerGetBalances401> | SKClientError<"PortfolioControllerGetBalances429", PortfolioControllerGetBalances429>> /** * Retrieve all actions performed by a user on a specific provider, with optional filtering by status and action type. Returns a paginated list ordered by most recent first. */ -readonly "ActionsControllerGetActions": (options: ActionsControllerGetActionsParams) => Effect.Effect | SKClientError<"ActionsControllerGetActions429", ActionsControllerGetActions429>> +readonly "ActionsControllerGetActions": (options: { readonly params: ActionsControllerGetActionsParams; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"ActionsControllerGetActions401", ActionsControllerGetActions401> | SKClientError<"ActionsControllerGetActions429", ActionsControllerGetActions429>> /** * Generate unsigned transactions for a trading action (open/close positions, manage leverage, set stop loss/take profit, fund/withdraw). Returns transaction data ready to be signed by the user. */ -readonly "ActionsControllerExecuteAction": (options: ActionRequestDto) => Effect.Effect | SKClientError<"ActionsControllerExecuteAction429", ActionsControllerExecuteAction429>> +readonly "ActionsControllerExecuteAction": (options: { readonly payload: ActionsControllerExecuteActionRequestJson; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"ActionsControllerExecuteAction401", ActionsControllerExecuteAction401> | SKClientError<"ActionsControllerExecuteAction429", ActionsControllerExecuteAction429>> /** * Retrieve detailed information about a specific action including current status, transactions, and execution details. */ -readonly "ActionsControllerGetAction": (id: string) => Effect.Effect | SKClientError<"ActionsControllerGetAction429", ActionsControllerGetAction429>> +readonly "ActionsControllerGetAction": (id: string, options: { readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"ActionsControllerGetAction401", ActionsControllerGetAction401> | SKClientError<"ActionsControllerGetAction429", ActionsControllerGetAction429>> + /** +* Paginated chronological feed of timeline events and user actions for an address on a provider (newest first). Events use occurredAt; actions use createdAt. +*/ +readonly "ActivityControllerGetActivity": (options: { readonly params: ActivityControllerGetActivityParams; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"ActivityControllerGetActivity401", ActivityControllerGetActivity401> | SKClientError<"ActivityControllerGetActivity429", ActivityControllerGetActivity429>> + /** +* Retrieve async venue outcomes (fills, liquidations, SL/TP triggers) for a user on a specific provider. Returns a paginated list ordered by most recent first. +*/ +readonly "EventsControllerGetEvents": (options: { readonly params: EventsControllerGetEventsParams; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"EventsControllerGetEvents401", EventsControllerGetEvents401> | SKClientError<"EventsControllerGetEvents429", EventsControllerGetEvents429>> + /** +* Retrieve a single perp event by its UUID. +*/ +readonly "EventsControllerGetEvent": (id: string, options: { readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"EventsControllerGetEvent401", EventsControllerGetEvent401> | SKClientError<"EventsControllerGetEvent429", EventsControllerGetEvent429>> /** * Submit a signed transaction to the blockchain or protocol, or record a transaction hash if already submitted. Provide either signedPayload (to have us broadcast) or transactionHash (if already submitted). The transaction must have been created via the actions endpoint. */ -readonly "TransactionsControllerSubmitTransaction": (transactionId: string, options: SubmitTransactionDto) => Effect.Effect | SKClientError<"TransactionsControllerSubmitTransaction429", TransactionsControllerSubmitTransaction429>> +readonly "TransactionsControllerSubmitTransaction": (transactionId: string, options: { readonly payload: TransactionsControllerSubmitTransactionRequestJson; readonly config?: Config | undefined }) => Effect.Effect, HttpClientError.HttpClientError | SKClientError<"TransactionsControllerSubmitTransaction401", TransactionsControllerSubmitTransaction401> | SKClientError<"TransactionsControllerSubmitTransaction429", TransactionsControllerSubmitTransaction429>> /** * Get the health status of the perps API with current timestamp */ -readonly "HealthControllerHealth": () => Effect.Effect +readonly "HealthControllerHealth": (options: { readonly config?: Config | undefined } | undefined) => Effect.Effect, HttpClientError.HttpClientError> } export interface SKClientError { diff --git a/packages/common/src/services/api-client/index.ts b/packages/common/src/services/api-client/index.ts index 6accf89..8c8ea32 100644 --- a/packages/common/src/services/api-client/index.ts +++ b/packages/common/src/services/api-client/index.ts @@ -1,56 +1,58 @@ -import { HttpClient, HttpClientRequest } from "@effect/platform"; -import { Effect, Schema } from "effect"; +import { Context, Effect, Layer, Schema } from "effect"; +import { HttpClient, HttpClientRequest } from "effect/unstable/http"; import { toast } from "sonner"; import { ConfigService } from "../config"; import { HttpClientService } from "../http-client"; import * as ApiClientFactory from "./client-factory"; -export class ApiClientService extends Effect.Service()( +export class ApiClientService extends Context.Service()( "perps/services/api-client-service/ApiClientService", { - accessors: true, - dependencies: [ConfigService.Default, HttpClientService.Default], - effect: Effect.gen(function* () { + make: Effect.gen(function* () { const { perpsBaseUrl, perpsApiKey } = yield* ConfigService; - const httpClient = yield* HttpClientService.pipe( - Effect.andThen((client) => - client.pipe( - HttpClient.mapRequest((req) => - req.pipe( - HttpClientRequest.prependUrl(perpsBaseUrl), - HttpClientRequest.setHeader("X-API-KEY", perpsApiKey), - ), - ), - HttpClient.tap((response) => { - if (response.status >= 200 && response.status < 300) { - return Effect.void; - } + const client = yield* HttpClientService; - return response.json.pipe( - Effect.tap((e) => Effect.logError(e)), - Effect.andThen( - Schema.decodeUnknown( - Schema.Struct({ - details: Schema.Struct({ message: Schema.String }), - }), - ), - ), - Effect.tap((e) => toast.error(e.details.message)), - Effect.catchAll((e) => - Effect.logError(e).pipe( - Effect.andThen(() => - Effect.sync(() => toast.error("Something went wrong")), - ), - ), - ), - ); - }), + const httpClient = client.pipe( + HttpClient.mapRequest((req) => + req.pipe( + HttpClientRequest.prependUrl(perpsBaseUrl), + HttpClientRequest.setHeader("X-API-KEY", perpsApiKey), ), ), + HttpClient.tap((response) => { + if (response.status >= 200 && response.status < 300) { + return Effect.void; + } + + return response.json.pipe( + Effect.tap((e) => Effect.logError(e)), + Effect.andThen( + Schema.decodeUnknownEffect( + Schema.Struct({ + details: Schema.Struct({ message: Schema.String }), + }), + ), + ), + Effect.tap((e) => + Effect.sync(() => toast.error(e.details.message)), + ), + Effect.catch((e) => + Effect.logError(e).pipe( + Effect.andThen(() => + Effect.sync(() => toast.error("Something went wrong")), + ), + ), + ), + ); + }), ); return ApiClientFactory.make(httpClient); }), }, -) {} +) { + static readonly layer = Layer.effect(this, this.make).pipe( + Layer.provide(Layer.mergeAll(ConfigService.layer, HttpClientService.layer)), + ); +} diff --git a/packages/common/src/services/config.ts b/packages/common/src/services/config.ts index 7fd21da..bedca92 100644 --- a/packages/common/src/services/config.ts +++ b/packages/common/src/services/config.ts @@ -1,26 +1,27 @@ -import { Config, ConfigProvider, Effect, Schema } from "effect"; +import { Config, ConfigProvider, Context, Effect, Layer } from "effect"; -export class ConfigService extends Effect.Service()( +export class ConfigService extends Context.Service()( "perps/services/config-service/ConfigService", { - effect: Effect.gen(function* () { - const perpsBaseUrl = yield* Schema.Config( - "VITE_PERPS_BASE_URL", - Schema.NonEmptyString, + make: Effect.gen(function* () { + const provider = ConfigProvider.fromEnv({ + env: import.meta.env, + }); + const read = (config: Config.Config) => config.parse(provider); + + const perpsBaseUrl = yield* read( + Config.nonEmptyString("VITE_PERPS_BASE_URL"), ); - const perpsApiKey = yield* Schema.Config( - "VITE_PERPS_API_KEY", - Schema.NonEmptyString, + const perpsApiKey = yield* read( + Config.nonEmptyString("VITE_PERPS_API_KEY"), ); - const reownProjectId = yield* Schema.Config( - "VITE_REOWN_PROJECT_ID", - Schema.NonEmptyString, - ).pipe(Config.option); + const reownProjectId = yield* read( + Config.nonEmptyString("VITE_REOWN_PROJECT_ID").pipe(Config.option), + ); - const moralisApiKey = yield* Schema.Config( - "VITE_MORALIS_API_KEY", - Schema.NonEmptyString, + const moralisApiKey = yield* read( + Config.nonEmptyString("VITE_MORALIS_API_KEY"), ); return { @@ -29,8 +30,8 @@ export class ConfigService extends Effect.Service()( reownProjectId, moralisApiKey, }; - }).pipe( - Effect.withConfigProvider(ConfigProvider.fromJson(import.meta.env)), - ), + }), }, -) {} +) { + static readonly layer = Layer.effect(this, this.make); +} diff --git a/packages/common/src/services/http-client/index.ts b/packages/common/src/services/http-client/index.ts index a363f2e..d92fdbc 100644 --- a/packages/common/src/services/http-client/index.ts +++ b/packages/common/src/services/http-client/index.ts @@ -1,14 +1,17 @@ -import { FetchHttpClient, HttpClient } from "@effect/platform"; -import { Effect } from "effect"; +import { Context, Effect, Layer } from "effect"; +import { FetchHttpClient, HttpClient } from "effect/unstable/http"; -export class HttpClientService extends Effect.Service()( +export class HttpClientService extends Context.Service()( "perps/services/http-client/index/HttpClientService", { - dependencies: [FetchHttpClient.layer], - effect: Effect.gen(function* () { + make: Effect.gen(function* () { const client = yield* HttpClient.HttpClient; return client.pipe(HttpClient.retryTransient({ times: 3 })); }), }, -) {} +) { + static readonly layer = Layer.effect(this, this.make).pipe( + Layer.provide(FetchHttpClient.layer), + ); +} diff --git a/packages/common/src/services/hyperliquid/index.ts b/packages/common/src/services/hyperliquid/index.ts index ae38e34..cbbd246 100644 --- a/packages/common/src/services/hyperliquid/index.ts +++ b/packages/common/src/services/hyperliquid/index.ts @@ -5,12 +5,12 @@ import { SubscriptionClient, WebSocketTransport, } from "@nktkas/hyperliquid"; -import { Chunk, Effect, Schema, Stream } from "effect"; +import { Context, Effect, Layer, Queue, Schema, Stream } from "effect"; -export class HyperliquidService extends Effect.Service()( +export class HyperliquidService extends Context.Service()( "perps/services/hyperliquid/HyperliquidService", { - scoped: Effect.gen(function* () { + make: Effect.gen(function* () { const transport = new WebSocketTransport(); const client = new SubscriptionClient({ transport }); @@ -33,11 +33,11 @@ export class HyperliquidService extends Effect.Service()( coin: typeof CoinSchema.Type; interval: typeof CandleIntervalSchema.Type; }) => - Stream.asyncScoped((emit) => + Stream.callback((queue) => Effect.gen(function* () { const subscription = yield* Effect.promise(() => client.candle(params, (data) => { - emit(Effect.succeed(Chunk.of(data))); + Queue.offerUnsafe(queue, data); }), ); @@ -47,11 +47,11 @@ export class HyperliquidService extends Effect.Service()( }), ); - const subscribeMidPrice = Stream.asyncScoped((emit) => + const subscribeMidPrice = Stream.callback((queue) => Effect.gen(function* () { const subscription = yield* Effect.promise(() => client.allMids({}, (data) => { - emit(Effect.succeed(Chunk.of(data))); + Queue.offerUnsafe(queue, data); }), ); @@ -59,7 +59,7 @@ export class HyperliquidService extends Effect.Service()( Effect.promise(() => subscription.unsubscribe()), ); }), - ).pipe(Stream.broadcastDynamic({ capacity: "unbounded" })); + ).pipe(Stream.share({ capacity: "unbounded" })); return { candleSnapshot, @@ -68,12 +68,14 @@ export class HyperliquidService extends Effect.Service()( }; }), }, -) {} +) { + static readonly layer = Layer.effect(this, this.make); +} export type CandleData = CandleWsEvent; export const CoinSchema = Schema.String; -export const CandleIntervalSchema = Schema.Literal( +export const CandleIntervalSchema = Schema.Literals([ "1m", "3m", "5m", @@ -88,9 +90,9 @@ export const CandleIntervalSchema = Schema.Literal( "3d", "1w", "1M", -); +]); -export class GetCandleSnapshotError extends Schema.TaggedError()( +export class GetCandleSnapshotError extends Schema.TaggedErrorClass()( "GetCandleSnapshotError", { cause: Schema.Unknown, diff --git a/packages/common/src/services/runtime.ts b/packages/common/src/services/runtime.ts index 4a75791..d3ed2ac 100644 --- a/packages/common/src/services/runtime.ts +++ b/packages/common/src/services/runtime.ts @@ -1,6 +1,7 @@ -import { Atom, Registry } from "@effect-atom/atom-react"; -import { Cause, Effect, Layer, Logger, ManagedRuntime, Match } from "effect"; -import { isTruthy } from "effect/Predicate"; +import { Effect, Layer, Logger, ManagedRuntime } from "effect"; +import * as Atom from "effect/unstable/reactivity/Atom"; +import * as Registry from "effect/unstable/reactivity/AtomRegistry"; +import * as Reactivity from "effect/unstable/reactivity/Reactivity"; import { ApiClientService } from "./api-client"; import { ConfigService } from "./config"; import { HttpClientService } from "./http-client"; @@ -10,31 +11,20 @@ import { LedgerSignerLayer } from "./wallet/ledger-signer"; import { isLedgerDappBrowserProvider } from "./wallet/ledger-signer/utils"; import { WalletService } from "./wallet/wallet-service"; -const Signer = Match.value(isLedgerDappBrowserProvider).pipe( - Match.when(isTruthy, () => LedgerSignerLayer.pipe(Layer.orDie)), - Match.orElse(() => - BrowserSignerLayer.pipe(Layer.provide(ConfigService.Default)).pipe( - Layer.orDie, - ), - ), -); +const Signer = isLedgerDappBrowserProvider + ? LedgerSignerLayer.pipe(Layer.orDie) + : BrowserSignerLayer.pipe(Layer.provide(ConfigService.layer), Layer.orDie); const layer = Layer.mergeAll( - WalletService.Default.pipe(Layer.provide(Signer)), - ApiClientService.Default, - HttpClientService.Default, - ConfigService.Default, - HyperliquidService.Default, + WalletService.layer.pipe(Layer.provide(Signer)), + ApiClientService.layer, + HttpClientService.layer, + ConfigService.layer, + HyperliquidService.layer, Registry.layer, - Logger.pretty, -).pipe( - Layer.tapErrorCause((cause) => - Effect.sync(() => { - console.error(Cause.pretty(cause)); - }), - ), - Layer.orDie, -); + Reactivity.layer, + Logger.layer([Logger.consolePretty()]), +).pipe(Layer.orDie); const memoMap = Layer.makeMemoMap.pipe(Effect.runSync); @@ -42,7 +32,7 @@ const atomContext = Atom.context({ memoMap }); export const runtimeAtom = atomContext(layer); -export const managedRuntime = ManagedRuntime.make(layer, memoMap); +export const managedRuntime = ManagedRuntime.make(layer, { memoMap }); /** * Use this instead of Atom.withReactivity to ensure the same Reactivity diff --git a/packages/common/src/services/wallet/browser-signer.ts b/packages/common/src/services/wallet/browser-signer.ts index 695913b..7943c1f 100644 --- a/packages/common/src/services/wallet/browser-signer.ts +++ b/packages/common/src/services/wallet/browser-signer.ts @@ -53,9 +53,8 @@ const hyperLiquidL1 = defineChain({ }); export const BrowserSignerLayer = Effect.gen(function* () { - const projectId = yield* ConfigService.pipe( - Effect.andThen((config) => config.reownProjectId), - ); + const config = yield* ConfigService; + const projectId = Option.getOrThrow(config.reownProjectId); const networks: NonEmptyArray< AppKitNetwork & { skChainName: SupportedSKChains } @@ -90,7 +89,9 @@ export const BrowserSignerLayer = Effect.gen(function* () { const switchChain = (chainId: AppKitNetwork["id"]) => Effect.gen(function* () { - const chain = yield* Record.get(chainsMap, chainId.toString()).pipe( + const chain = yield* Effect.fromOption( + Record.get(chainsMap, chainId.toString()), + ).pipe( Effect.mapError( () => new SwitchChainError({ cause: new ChainNotFoundError() }), ), @@ -130,7 +131,11 @@ export const BrowserSignerLayer = Effect.gen(function* () { }) : sendTransaction(wagmiAdapter.wagmiConfig, transaction), catch: (e) => new SignTransactionError({ cause: e }), - }).pipe(Effect.andThen(Schema.decodeSync(TransactionHash))); + }).pipe( + Effect.andThen((hash) => + Effect.sync(() => Schema.decodeSync(TransactionHash)(hash)), + ), + ); }); const accountsStateRef = yield* SubscriptionRef.make< @@ -148,9 +153,9 @@ export const BrowserSignerLayer = Effect.gen(function* () { SubscriptionRef.update( accountsStateRef, (prevWallet): AccountsState => { - const connection = Option.fromNullable(currentConnectionId).pipe( - Option.flatMapNullable((connectionId) => - nextState.connections.get(connectionId), + const connection = Option.fromNullishOr(currentConnectionId).pipe( + Option.flatMap((connectionId) => + Option.fromNullishOr(nextState.connections.get(connectionId)), ), ); @@ -161,9 +166,11 @@ export const BrowserSignerLayer = Effect.gen(function* () { const currentAccount = Option.some(prevWallet).pipe( Option.filter((accounts) => accounts?.status === "connected"), Option.map((wallet) => wallet.currentAccount), - Option.flatMapNullable((prevAcc) => - connection.value.accounts.find( - (acc) => acc === prevAcc.address, + Option.flatMap((prevAcc) => + Option.fromNullishOr( + connection.value.accounts.find( + (acc) => acc === prevAcc.address, + ), ), ), Option.orElse(() => _Array.head(connection.value.accounts)), @@ -193,7 +200,7 @@ export const BrowserSignerLayer = Effect.gen(function* () { const switchAccount = Effect.fn( function* ({ account }: { account: BrowserWalletAccount }) { - const connection = yield* Option.fromNullable( + const connection = yield* Option.fromNullishOr( wagmiAdapter.wagmiConfig.state.connections.get(account.address), ); @@ -211,7 +218,7 @@ export const BrowserSignerLayer = Effect.gen(function* () { signTransaction, switchAccount, wagmiAdapter, - accountsStream: accountsStateRef.changes, - getAccountState: accountsStateRef.get, + accountsStream: SubscriptionRef.changes(accountsStateRef), + getAccountState: SubscriptionRef.get(accountsStateRef), }); -}).pipe(Layer.scoped(SignerService)); +}).pipe(Layer.effect(SignerService)); diff --git a/packages/common/src/services/wallet/ledger-signer/index.ts b/packages/common/src/services/wallet/ledger-signer/index.ts index f204ee0..16640a8 100644 --- a/packages/common/src/services/wallet/ledger-signer/index.ts +++ b/packages/common/src/services/wallet/ledger-signer/index.ts @@ -83,9 +83,9 @@ export const LedgerSignerLayer = Effect.gen(function* () { [], ); - const accountWithChain = yield* _Array - .head(uniqueByAddressAccounts) - .pipe(Effect.mapError(() => new NoAccountsFoundError())); + const accountWithChain = yield* Effect.fromOption( + _Array.head(uniqueByAddressAccounts), + ).pipe(Effect.mapError(() => new NoAccountsFoundError())); const accountsStateRef = yield* SubscriptionRef.make< AccountsState @@ -102,12 +102,14 @@ export const LedgerSignerLayer = Effect.gen(function* () { account: LedgerWalletAccount; transaction: typeof EIP712Tx.Type; }) => - Effect.try(() => Buffer.from(JSON.stringify(transaction))).pipe( + Effect.sync(() => Buffer.from(JSON.stringify(transaction))).pipe( Effect.andThen((buffer) => - walletApiClient.message.sign(account.id, buffer), + Effect.promise(() => walletApiClient.message.sign(account.id, buffer)), ), Effect.andThen((buffer) => - Schema.decodeSync(TransactionHash)(buffer.toString("hex")), + Effect.sync(() => + Schema.decodeSync(TransactionHash)(buffer.toString("hex")), + ), ), Effect.mapError((error) => new SignTransactionError({ cause: error })), ); @@ -119,15 +121,16 @@ export const LedgerSignerLayer = Effect.gen(function* () { account: LedgerWalletAccount; transaction: typeof EvmTx.Type; }) => - Schema.encode(EvmTx)(transaction).pipe( + Schema.encodeEffect(EvmTx)(transaction).pipe( Effect.andThen((tx) => - Effect.try(() => + Effect.sync(() => deserializeTransaction({ ...tx, family: "ethereum", - amount: tx.value ?? "0", + amount: String(tx.value ?? "0"), recipient: tx.to, data: tx.data.slice(2), + gasLimit: tx.gasLimit.toString(), }), ), ), @@ -136,7 +139,9 @@ export const LedgerSignerLayer = Effect.gen(function* () { walletApiClient.transaction.signAndBroadcast(account.id, tx), ), ), - Effect.andThen(Schema.decodeSync(TransactionHash)), + Effect.andThen((hash) => + Effect.sync(() => Schema.decodeSync(TransactionHash)(hash)), + ), Effect.mapError((error) => new SignTransactionError({ cause: error })), ); @@ -145,10 +150,10 @@ export const LedgerSignerLayer = Effect.gen(function* () { }: { transaction: Transaction; }) { - const currentAccount = yield* accountsStateRef.get; + const currentAccount = yield* SubscriptionRef.get(accountsStateRef); if (currentAccount.status === "disconnected") { - return yield* Effect.dieMessage("Wallet is disconnected"); + return yield* Effect.die(new Error("Wallet is disconnected")); } return yield* Schema.is(EIP712Tx)(transaction) @@ -174,11 +179,11 @@ export const LedgerSignerLayer = Effect.gen(function* () { Effect.mapError((e) => new SwitchAccountError({ cause: e })), ); - return Layer.succeed(SignerService, { + return SignerService.of({ type: "ledger", signTransaction, switchAccount, - accountsStream: accountsStateRef.changes, - getAccountState: accountsStateRef.get, + accountsStream: SubscriptionRef.changes(accountsStateRef), + getAccountState: SubscriptionRef.get(accountsStateRef), }); -}).pipe(Layer.unwrapEffect); +}).pipe(Layer.effect(SignerService)); diff --git a/packages/common/src/services/wallet/ledger-signer/utils.ts b/packages/common/src/services/wallet/ledger-signer/utils.ts index fa6bfcd..6d135e0 100644 --- a/packages/common/src/services/wallet/ledger-signer/utils.ts +++ b/packages/common/src/services/wallet/ledger-signer/utils.ts @@ -19,9 +19,7 @@ export const getFilteredSupportedLedgerFamiliesWithCurrency = ({ enabledChainsMap, }: { accounts: Account[]; - ledgerCurrencies: Effect.Effect.Success< - ReturnType - >; + ledgerCurrencies: Effect.Success>; enabledChainsMap: { evm: Partial }; }) => { const { accountsFamilies, accountsCurrencies } = accounts.reduce( @@ -148,7 +146,7 @@ export const getLedgerAccounts = (walletApiClient: WalletAPIClient) => val.accounts.map((acc) => { if (!acc.parentAccountId) return acc; - return Option.fromNullable( + return Option.fromNullishOr( val.accountsMap.get(acc.parentAccountId), ).pipe( Option.map((parentAcc) => ({ @@ -173,7 +171,7 @@ export class NoAccountsFoundError extends Data.TaggedError( "NoAccountsFoundError", ) {} -export const isLedgerDappBrowserProvider = Option.fromNullable(window).pipe( +export const isLedgerDappBrowserProvider = Option.fromNullishOr(window).pipe( Option.map((w) => { try { const params = new URLSearchParams(w.self.location.search); diff --git a/packages/common/src/services/wallet/signer.ts b/packages/common/src/services/wallet/signer.ts index e178c37..f2287fd 100644 --- a/packages/common/src/services/wallet/signer.ts +++ b/packages/common/src/services/wallet/signer.ts @@ -1,6 +1,6 @@ import { Context } from "effect"; import type { Signer } from "../../domain/signer"; -export class SignerService extends Context.Tag( +export class SignerService extends Context.Service()( "perps/services/wallet/signer/SignerService", -)() {} +) {} diff --git a/packages/common/src/services/wallet/wallet-service.ts b/packages/common/src/services/wallet/wallet-service.ts index aacbbd7..c6d7a9a 100644 --- a/packages/common/src/services/wallet/wallet-service.ts +++ b/packages/common/src/services/wallet/wallet-service.ts @@ -1,8 +1,10 @@ import { Array as _Array, + Context, Data, Duration, Effect, + Layer, Match, Schedule, Schema, @@ -21,11 +23,10 @@ import { ApiClientService } from "../api-client"; import type { ActionDto } from "../api-client/client-factory"; import { SignerService } from "./signer"; -export class WalletService extends Effect.Service()( +export class WalletService extends Context.Service()( "perps/services/wallet-service/WalletService", { - dependencies: [ApiClientService.Default], - scoped: Effect.gen(function* () { + make: Effect.gen(function* () { const apiClient = yield* ApiClientService; const signer = yield* SignerService; @@ -131,14 +132,14 @@ export class WalletService extends Effect.Service()( const startMachine = Effect.gen(function* () { const state = yield* SubscriptionRef.get(ref); - const tx = yield* _Array - .get(state.transactions, state.currentTxIndex) - .pipe(Effect.orDie); + const tx = yield* Effect.fromOption( + _Array.get(state.transactions, state.currentTxIndex), + ).pipe(Effect.orDie); const accountState = yield* signer.getAccountState; if (accountState.status === "disconnected") { - return yield* Effect.dieMessage("Wallet is disconnected"); + return yield* Effect.die(new Error("Wallet is disconnected")); } const signablePayload = tx.signablePayload; @@ -149,7 +150,7 @@ export class WalletService extends Effect.Service()( ); } - const decodedTx = yield* Schema.decodeUnknown(Transaction)( + const decodedTx = yield* Schema.decodeUnknownEffect(Transaction)( signablePayload, ).pipe(Effect.orDie); @@ -174,17 +175,20 @@ export class WalletService extends Effect.Service()( const txHash = yield* SubscriptionRef.get(ref).pipe( Effect.map((state) => state.txHash), - Effect.filterOrDieMessage( - (txHash) => txHash !== null, - "Tx hash is null", + Effect.filterOrFail( + (txHash): txHash is string => txHash !== null, + () => new TransactionFailedError(), ), ); yield* apiClient.TransactionsControllerSubmitTransaction( tx.id, - tx.signingFormat === "EIP712_TYPED_DATA" - ? { signedPayload: txHash } - : { transactionHash: txHash }, + { + payload: + tx.signingFormat === "EIP712_TYPED_DATA" + ? { signedPayload: txHash } + : { transactionHash: txHash }, + }, ); yield* updateState(SignAction.SubmitDone()); @@ -196,43 +200,39 @@ export class WalletService extends Effect.Service()( yield* updateState(SignAction.CheckStart()); const action = yield* apiClient - .ActionsControllerGetAction(state.action.id) + .ActionsControllerGetAction(state.action.id, undefined) .pipe( Effect.andThen((res) => - _Array - .findFirst( + Effect.fromOption( + _Array.findFirst( res.transactions, (newTx) => newTx.id === tx.id, - ) - .pipe( - Effect.catchAll(() => - Effect.dieMessage( - "Transaction not found in response", - ), + ), + ).pipe( + Effect.catch(() => + Effect.die( + new Error("Transaction not found in response"), ), - Effect.andThen((newTx) => - Match.value(newTx.status).pipe( - Match.when( - (res) => - res === "CONFIRMED" || - res === "BROADCASTED", - () => Effect.succeed(newTx), - ), - Match.when( - (res) => - res === "NOT_FOUND" || res === "FAILED", - () => - Effect.fail(new TransactionFailedError()), - ), - Match.orElse(() => - Effect.fail( - new TransactionNotConfirmedError(), - ), - ), + ), + Effect.andThen((newTx) => + Match.value(newTx.status).pipe( + Match.when( + (res) => + res === "CONFIRMED" || res === "BROADCASTED", + () => Effect.succeed(newTx), + ), + Match.when( + (res) => + res === "NOT_FOUND" || res === "FAILED", + () => Effect.fail(new TransactionFailedError()), + ), + Match.orElse(() => + Effect.fail(new TransactionNotConfirmedError()), ), ), - Effect.as(res), ), + Effect.as(res), + ), ), Effect.retry({ while: (e) => e._tag === "TransactionNotConfirmedError", @@ -257,10 +257,10 @@ export class WalletService extends Effect.Service()( Effect.ignore, ); - startMachine.pipe(Effect.runFork); + Effect.runFork(startMachine as Effect.Effect); - const retry = startMachine; - const stream = ref.changes; + const retry = startMachine as Effect.Effect; + const stream = SubscriptionRef.changes(ref); return { stream, retry }; }); @@ -269,16 +269,12 @@ export class WalletService extends Effect.Service()( | { type: BrowserSigner["type"]; signer: BrowserSigner; - accountsState: Effect.Effect.Success< - BrowserSigner["getAccountState"] - >; + accountsState: Effect.Success; } | { type: LedgerSigner["type"]; signer: LedgerSigner; - accountsState: Effect.Effect.Success< - LedgerSigner["getAccountState"] - >; + accountsState: Effect.Success; } >().pipe( Match.withReturnType(), @@ -286,12 +282,15 @@ export class WalletService extends Effect.Service()( Match.value(accountsState).pipe( Match.withReturnType(), Match.when({ status: "connected" }, (connectedState) => { + const state = connectedState as Effect.Success< + BrowserSigner["getAccountState"] + > & { status: "connected" }; return { type: "browser", wagmiAdapter: signer.wagmiAdapter, status: "connected", - accounts: connectedState.accounts, - currentAccount: connectedState.currentAccount, + accounts: state.accounts, + currentAccount: state.currentAccount, signTransactions, switchAccount: signer.switchAccount, }; @@ -309,11 +308,14 @@ export class WalletService extends Effect.Service()( Match.value(accountsState).pipe( Match.withReturnType(), Match.when({ status: "connected" }, (connectedState) => { + const state = connectedState as Effect.Success< + LedgerSigner["getAccountState"] + > & { status: "connected" }; return { type: "ledger", status: "connected", - accounts: connectedState.accounts, - currentAccount: connectedState.currentAccount, + accounts: state.accounts, + currentAccount: state.currentAccount, signTransactions, switchAccount: signer.switchAccount, }; @@ -349,4 +351,8 @@ export class WalletService extends Effect.Service()( return { walletStream }; }), }, -) {} +) { + static readonly layer = Layer.effect(this, this.make).pipe( + Layer.provide(ApiClientService.layer), + ); +} diff --git a/packages/dashboard/package.json b/packages/dashboard/package.json index d5db399..f19802b 100644 --- a/packages/dashboard/package.json +++ b/packages/dashboard/package.json @@ -12,9 +12,6 @@ "dependencies": { "@yieldxyz/perps-common": "workspace:*", "@base-ui/react": "catalog:", - "@effect-atom/atom-react": "catalog:", - "@effect/experimental": "catalog:", - "@effect/platform": "catalog:", "@effect/platform-node": "catalog:", "@ledgerhq/wallet-api-client": "catalog:", "@lucas-barake/effect-form-react": "catalog:", @@ -38,12 +35,12 @@ "tailwindcss": "catalog:", "tw-animate-css": "catalog:", "viem": "catalog:", - "wagmi": "catalog:" + "wagmi": "catalog:", + "@effect/atom-react": "catalog:" }, "devDependencies": { "@tanstack/devtools-vite": "catalog:", "@tanstack/router-cli": "catalog:", - "@tim-smart/openapi-gen": "catalog:", "@types/node": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", @@ -59,6 +56,7 @@ "vite-plugin-node-polyfills": "catalog:", "vitest": "catalog:", "vitest-browser-react": "catalog:", - "@tanstack/router-plugin": "catalog:" + "@tanstack/router-plugin": "catalog:", + "@effect/openapi-generator": "catalog:" } } diff --git a/packages/dashboard/src/atoms/selected-market-atom.ts b/packages/dashboard/src/atoms/selected-market-atom.ts index 6e9b01f..04a8cb1 100644 --- a/packages/dashboard/src/atoms/selected-market-atom.ts +++ b/packages/dashboard/src/atoms/selected-market-atom.ts @@ -1,23 +1,27 @@ -import { Atom, type AtomRef, Result } from "@effect-atom/atom-react"; import { MarketNotFoundError, marketsAtom } from "@yieldxyz/perps-common/atoms"; import { type ApiTypes, runtimeAtom } from "@yieldxyz/perps-common/services"; import { Array as _Array, Effect, Option, Record } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Atom from "effect/unstable/reactivity/Atom"; +import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; const initMarketAtom = runtimeAtom.atom( Effect.fn(function* (ctx) { const markets = yield* ctx.result(marketsAtom); - return yield* Record.findFirst( + const initialMarket = Record.findFirst( markets, (m) => m.value.baseAsset.symbol === "BTC", ).pipe( Option.map((v) => v[1]), Option.orElse(() => _Array.head(Record.values(markets))), - Effect.catchTag( - "NoSuchElementException", - () => new MarketNotFoundError(), - ), ); + + if (initialMarket._tag === "None") { + return yield* new MarketNotFoundError(); + } + + return initialMarket.value; }), ); diff --git a/packages/dashboard/src/components/modules/root/Preload.tsx b/packages/dashboard/src/components/modules/root/Preload.tsx index 00cda45..766e4ed 100644 --- a/packages/dashboard/src/components/modules/root/Preload.tsx +++ b/packages/dashboard/src/components/modules/root/Preload.tsx @@ -1,4 +1,4 @@ -import { Result, useAtomMount, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomMount, useAtomValue } from "@effect/atom-react"; import { marketsAtom, moralisTokenBalancesAtom, @@ -16,6 +16,7 @@ import { type WalletConnected, } from "@yieldxyz/perps-common/domain"; import { TRADING_VIEW_WIDGET_SCRIPT_URL } from "@yieldxyz/perps-common/services"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { preload } from "react-dom"; const PreloadWalletConnectedAtoms = ({ diff --git a/packages/dashboard/src/components/modules/trade/chart.tsx b/packages/dashboard/src/components/modules/trade/chart.tsx index ec9e352..6d9cca2 100644 --- a/packages/dashboard/src/components/modules/trade/chart.tsx +++ b/packages/dashboard/src/components/modules/trade/chart.tsx @@ -1,11 +1,8 @@ -import { - type AtomRef, - Result, - useAtomRef, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomRef, useAtomValue } from "@effect/atom-react"; import { Chart as ChartView, Text } from "@yieldxyz/perps-common/components"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; import { TriangleAlertIcon } from "lucide-react"; import { selectedMarketAtom } from "../../../atoms/selected-market-atom"; diff --git a/packages/dashboard/src/components/modules/trade/market-info/index.tsx b/packages/dashboard/src/components/modules/trade/market-info/index.tsx index 90fe1db..d17fd31 100644 --- a/packages/dashboard/src/components/modules/trade/market-info/index.tsx +++ b/packages/dashboard/src/components/modules/trade/market-info/index.tsx @@ -1,10 +1,4 @@ -import { - type AtomRef, - Result, - useAtomRef, - useAtomSet, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomRef, useAtomSet, useAtomValue } from "@effect/atom-react"; import { Popover, PriceFlash, @@ -20,6 +14,8 @@ import { getTokenLogo, } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; import { ChevronDown } from "lucide-react"; import { useState } from "react"; import { selectedMarketAtom } from "../../../../atoms/selected-market-atom"; diff --git a/packages/dashboard/src/components/modules/trade/market-info/market-selector-popover.tsx b/packages/dashboard/src/components/modules/trade/market-info/market-selector-popover.tsx index 6d35913..6cef934 100644 --- a/packages/dashboard/src/components/modules/trade/market-info/market-selector-popover.tsx +++ b/packages/dashboard/src/components/modules/trade/market-info/market-selector-popover.tsx @@ -1,9 +1,4 @@ -import { - type AtomRef, - Result, - useAtomRef, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomRef, useAtomValue } from "@effect/atom-react"; import { useVirtualizer } from "@tanstack/react-virtual"; import { marketsAtom } from "@yieldxyz/perps-common/atoms"; import { Skeleton, Text, TokenIcon } from "@yieldxyz/perps-common/components"; @@ -18,6 +13,8 @@ import { } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Array as _Array, Option, Order, Record } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; import { ArrowDownUp, ArrowDownWideNarrow, @@ -41,20 +38,20 @@ type MarketRef = AtomRef.AtomRef; const columnOrders: { [Key in SortColumn]: Order.Order; } = { - symbol: Order.mapInput(Order.string, (ref: MarketRef) => + symbol: Order.mapInput(Order.String, (ref: MarketRef) => ref.value.baseAsset.symbol.toLowerCase(), ), - price: Order.mapInput(Order.number, (ref: MarketRef) => ref.value.markPrice), + price: Order.mapInput(Order.Number, (ref: MarketRef) => ref.value.markPrice), change: Order.mapInput( - Order.number, + Order.Number, (ref: MarketRef) => ref.value.priceChangePercent24h, ), - funding: Order.mapInput(Order.number, (ref: MarketRef) => + funding: Order.mapInput(Order.Number, (ref: MarketRef) => Number(ref.value.fundingRate), ), - volume: Order.mapInput(Order.number, (ref: MarketRef) => ref.value.volume24h), + volume: Order.mapInput(Order.Number, (ref: MarketRef) => ref.value.volume24h), oi: Order.mapInput( - Order.number, + Order.Number, (ref: MarketRef) => ref.value.openInterest * ref.value.markPrice, ), }; @@ -216,7 +213,7 @@ export function MarketSelectorContent({ const order = columnOrders[sortState.column]; return _Array.sort( v, - sortState.direction === "asc" ? order : Order.reverse(order), + sortState.direction === "asc" ? order : Order.flip(order), ); }), Result.getOrElse(() => []), diff --git a/packages/dashboard/src/components/modules/trade/order-form/index.tsx b/packages/dashboard/src/components/modules/trade/order-form/index.tsx index da98ed2..39c4683 100644 --- a/packages/dashboard/src/components/modules/trade/order-form/index.tsx +++ b/packages/dashboard/src/components/modules/trade/order-form/index.tsx @@ -1,9 +1,4 @@ -import { - type AtomRef, - Result, - useAtomRef, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomRef, useAtomValue } from "@effect/atom-react"; import { LeverageRangesSchema, orderFormAtom, @@ -45,6 +40,8 @@ import { } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Schema } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; import { ChevronDown, Info } from "lucide-react"; import { selectedMarketAtom } from "../../../../atoms/selected-market-atom"; diff --git a/packages/dashboard/src/components/modules/trade/order-form/sign-dialog.tsx b/packages/dashboard/src/components/modules/trade/order-form/sign-dialog.tsx index 20fac08..d451420 100644 --- a/packages/dashboard/src/components/modules/trade/order-form/sign-dialog.tsx +++ b/packages/dashboard/src/components/modules/trade/order-form/sign-dialog.tsx @@ -1,4 +1,4 @@ -import { Result, useAtomSet, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { actionAtom, signActionAtoms, @@ -10,6 +10,7 @@ import { TransactionProgress, } from "@yieldxyz/perps-common/components"; import { isWalletConnected } from "@yieldxyz/perps-common/domain"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; export function SignTransactionsDialog() { const wallet = useAtomValue(walletAtom).pipe(Result.getOrElse(() => null)); diff --git a/packages/dashboard/src/components/molecules/header/deposit/deposit-dialog.tsx b/packages/dashboard/src/components/molecules/header/deposit/deposit-dialog.tsx index d4f3fe3..d46d4bb 100644 --- a/packages/dashboard/src/components/molecules/header/deposit/deposit-dialog.tsx +++ b/packages/dashboard/src/components/molecules/header/deposit/deposit-dialog.tsx @@ -1,4 +1,4 @@ -import { Result, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import hyperliquidLogo from "@yieldxyz/perps-common/assets/hyperliquid.png"; import { providersAtom, @@ -26,6 +26,7 @@ import { } from "@yieldxyz/perps-common/lib"; import type { ApiSchemas } from "@yieldxyz/perps-common/services"; import { Array as _Array, Option, Record } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { DepositForm, useDepositForm, diff --git a/packages/dashboard/src/components/molecules/header/deposit/state.tsx b/packages/dashboard/src/components/molecules/header/deposit/state.tsx index 7003fb4..9c7cd73 100644 --- a/packages/dashboard/src/components/molecules/header/deposit/state.tsx +++ b/packages/dashboard/src/components/molecules/header/deposit/state.tsx @@ -1,9 +1,4 @@ -import { - Atom, - Result, - useAtomSet, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import type { FormReact } from "@lucas-barake/effect-form-react"; import { EvmNetworks } from "@stakekit/common"; import { @@ -29,6 +24,8 @@ import { } from "@yieldxyz/perps-common/lib"; import { type ApiTypes, runtimeAtom } from "@yieldxyz/perps-common/services"; import { Effect, Option } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Atom from "effect/unstable/reactivity/Atom"; // Selected chain atom (network) type ChainKey = keyof typeof yieldApiNetworkToMoralisChain; diff --git a/packages/dashboard/src/components/molecules/header/index.tsx b/packages/dashboard/src/components/molecules/header/index.tsx index cbf42b3..8ee9269 100644 --- a/packages/dashboard/src/components/molecules/header/index.tsx +++ b/packages/dashboard/src/components/molecules/header/index.tsx @@ -1,4 +1,4 @@ -import { Result, useAtomSet, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { useAppKit } from "@reown/appkit/react"; import { Link } from "@tanstack/react-router"; import hyperliquidLogo from "@yieldxyz/perps-common/assets/hyperliquid.png"; @@ -20,6 +20,7 @@ import { } from "@yieldxyz/perps-common/domain"; import { cn, truncateAddress } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { ChevronRight } from "lucide-react"; import { useState } from "react"; import { Logo } from "../../atoms/logo"; diff --git a/packages/dashboard/src/components/molecules/header/withdraw/state.tsx b/packages/dashboard/src/components/molecules/header/withdraw/state.tsx index 0450d29..45f8dc5 100644 --- a/packages/dashboard/src/components/molecules/header/withdraw/state.tsx +++ b/packages/dashboard/src/components/molecules/header/withdraw/state.tsx @@ -1,9 +1,4 @@ -import { - Atom, - Result, - useAtomSet, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import type { FormReact } from "@lucas-barake/effect-form-react"; import { providersAtom, @@ -21,6 +16,8 @@ import { } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Array as _Array, Option } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Atom from "effect/unstable/reactivity/Atom"; const withdrawSelectedProviderAtom = Atom.writable( (ctx) => diff --git a/packages/dashboard/src/components/molecules/header/withdraw/withdraw-dialog.tsx b/packages/dashboard/src/components/molecules/header/withdraw/withdraw-dialog.tsx index 3ca867c..cb4bace 100644 --- a/packages/dashboard/src/components/molecules/header/withdraw/withdraw-dialog.tsx +++ b/packages/dashboard/src/components/molecules/header/withdraw/withdraw-dialog.tsx @@ -1,4 +1,4 @@ -import { Result, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import hyperliquidLogo from "@yieldxyz/perps-common/assets/hyperliquid.png"; import { providersAtom } from "@yieldxyz/perps-common/atoms"; import { @@ -14,6 +14,7 @@ import type { } from "@yieldxyz/perps-common/domain"; import { formatTokenAmount, round } from "@yieldxyz/perps-common/lib"; import type { ApiSchemas } from "@yieldxyz/perps-common/services"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { useProviderBalance, useProviders, diff --git a/packages/dashboard/src/components/molecules/positions/close-position-dialog.tsx b/packages/dashboard/src/components/molecules/positions/close-position-dialog.tsx index bb6d772..7ffe33c 100644 --- a/packages/dashboard/src/components/molecules/positions/close-position-dialog.tsx +++ b/packages/dashboard/src/components/molecules/positions/close-position-dialog.tsx @@ -1,5 +1,4 @@ import type { DialogRootActions } from "@base-ui/react/dialog"; -import { Result } from "@effect-atom/atom-react"; import { Button, Dialog, @@ -15,6 +14,7 @@ import { } from "@yieldxyz/perps-common/hooks"; import { formatAmount, formatTokenAmount } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { X } from "lucide-react"; import { useRef } from "react"; diff --git a/packages/dashboard/src/components/molecules/positions/index.tsx b/packages/dashboard/src/components/molecules/positions/index.tsx index f5eb1c9..77f24e8 100644 --- a/packages/dashboard/src/components/molecules/positions/index.tsx +++ b/packages/dashboard/src/components/molecules/positions/index.tsx @@ -1,4 +1,4 @@ -import { Result, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import { ordersAtom, positionsAtom, @@ -16,6 +16,7 @@ import { } from "@yieldxyz/perps-common/domain"; import { cn } from "@yieldxyz/perps-common/lib"; import { Option, Record } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { OrdersTabWithWallet } from "./orders-tab"; import { PositionsTabWithWallet } from "./positions-tab"; import { TableDisconnected } from "./shared"; diff --git a/packages/dashboard/src/components/molecules/positions/orders-tab.tsx b/packages/dashboard/src/components/molecules/positions/orders-tab.tsx index 14deb24..815d250 100644 --- a/packages/dashboard/src/components/molecules/positions/orders-tab.tsx +++ b/packages/dashboard/src/components/molecules/positions/orders-tab.tsx @@ -1,4 +1,4 @@ -import { Result, useAtomSet, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { cancelOrderAtom, marketsAtom, @@ -15,7 +15,8 @@ import { formatSnakeCase, } from "@yieldxyz/perps-common/lib"; import type { ApiSchemas } from "@yieldxyz/perps-common/services"; -import { Array as _Array, Option, Record } from "effect"; +import { Array as _Array, Result as _Result, Record } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { OrdersTableSkeleton, tableCellClass, @@ -46,12 +47,14 @@ export function OrdersTabWithWallet({ wallet }: { wallet: WalletConnected }) { const ordersWithMarket = ordersResult.pipe( Result.map((orders) => _Array.filterMap(orders, (o) => - Record.get(marketsMap, o.marketId).pipe( - Option.map((marketRef) => ({ - order: o, - market: marketRef.value, - wallet, - })), + Record.get(marketsMap, o.marketId).pipe((market) => + market._tag === "None" + ? _Result.failVoid + : _Result.succeed({ + order: o, + market: market.value.value, + wallet, + }), ), ), ), diff --git a/packages/dashboard/src/components/molecules/positions/positions-tab.tsx b/packages/dashboard/src/components/molecules/positions/positions-tab.tsx index 5d26d18..abd3d75 100644 --- a/packages/dashboard/src/components/molecules/positions/positions-tab.tsx +++ b/packages/dashboard/src/components/molecules/positions/positions-tab.tsx @@ -1,10 +1,4 @@ -import { - type AtomRef, - Result, - useAtomRef, - useAtomSet, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomRef, useAtomSet, useAtomValue } from "@effect/atom-react"; import { marketsAtom, ordersAtom, @@ -33,7 +27,9 @@ import { getTPOrSLConfigurationFromPosition, } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; -import { Array as _Array, Option, Record } from "effect"; +import { Array as _Array, Result as _Result, Record } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; import { Pencil } from "lucide-react"; import { selectedMarketAtom } from "../../../atoms/selected-market-atom"; import { ClosePositionDialog } from "./close-position-dialog"; @@ -77,11 +73,13 @@ export function PositionsTabWithWallet({ const positionsWithMarket = positionsResult.pipe( Result.map((positions) => _Array.filterMap(Record.values(positions), (positionRef) => - Record.get(marketsMap, positionRef.value.marketId).pipe( - Option.map((marketRef) => ({ - positionRef, - marketRef, - })), + Record.get(marketsMap, positionRef.value.marketId).pipe((market) => + market._tag === "None" + ? _Result.failVoid + : _Result.succeed({ + positionRef, + marketRef: market.value, + }), ), ), ), diff --git a/packages/widget/package.json b/packages/widget/package.json index 01744be..35bb71b 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -12,9 +12,6 @@ "dependencies": { "@yieldxyz/perps-common": "workspace:*", "@base-ui/react": "catalog:", - "@effect-atom/atom-react": "catalog:", - "@effect/experimental": "catalog:", - "@effect/platform": "catalog:", "@effect/platform-node": "catalog:", "@ledgerhq/wallet-api-client": "catalog:", "@lucas-barake/effect-form-react": "catalog:", @@ -38,12 +35,12 @@ "tailwindcss": "catalog:", "tw-animate-css": "catalog:", "viem": "catalog:", - "wagmi": "catalog:" + "wagmi": "catalog:", + "@effect/atom-react": "catalog:" }, "devDependencies": { "@tanstack/devtools-vite": "catalog:", "@tanstack/router-cli": "catalog:", - "@tim-smart/openapi-gen": "catalog:", "@types/node": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", @@ -59,6 +56,7 @@ "vite-plugin-node-polyfills": "catalog:", "vitest": "catalog:", "vitest-browser-react": "catalog:", - "@tanstack/router-plugin": "catalog:" + "@tanstack/router-plugin": "catalog:", + "@effect/openapi-generator": "catalog:" } } diff --git a/packages/widget/src/components/modules/Account/Deposit/index.tsx b/packages/widget/src/components/modules/Account/Deposit/index.tsx index c960ba9..1aeae77 100644 --- a/packages/widget/src/components/modules/Account/Deposit/index.tsx +++ b/packages/widget/src/components/modules/Account/Deposit/index.tsx @@ -1,4 +1,3 @@ -import { Result } from "@effect-atom/atom-react"; import { Navigate } from "@tanstack/react-router"; import { Button, @@ -20,6 +19,7 @@ import { } from "@yieldxyz/perps-common/hooks"; import { formatTokenAmount } from "@yieldxyz/perps-common/lib"; import type { ApiSchemas } from "@yieldxyz/perps-common/services"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { BackButton } from "../../../molecules/navigation/back-button"; import { WalletProtectedRoute } from "../../../molecules/navigation/wallet-protected-route"; import { ProviderSelect } from "../../../molecules/provider-select"; diff --git a/packages/widget/src/components/modules/Account/Deposit/state.tsx b/packages/widget/src/components/modules/Account/Deposit/state.tsx index ecce9f8..5507761 100644 --- a/packages/widget/src/components/modules/Account/Deposit/state.tsx +++ b/packages/widget/src/components/modules/Account/Deposit/state.tsx @@ -1,12 +1,9 @@ -import { - Atom, - Result, - useAtomSet, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { providersAtom } from "@yieldxyz/perps-common/atoms"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Array as _Array, Option } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Atom from "effect/unstable/reactivity/Atom"; const selectedProviderAtom = Atom.writable( (ctx) => diff --git a/packages/widget/src/components/modules/Account/Withdraw/index.tsx b/packages/widget/src/components/modules/Account/Withdraw/index.tsx index 1290be7..0920573 100644 --- a/packages/widget/src/components/modules/Account/Withdraw/index.tsx +++ b/packages/widget/src/components/modules/Account/Withdraw/index.tsx @@ -1,4 +1,3 @@ -import { Result } from "@effect-atom/atom-react"; import { Navigate } from "@tanstack/react-router"; import { Button, @@ -15,6 +14,7 @@ import { } from "@yieldxyz/perps-common/hooks"; import { formatAmount, formatTokenAmount } from "@yieldxyz/perps-common/lib"; import type { ApiSchemas } from "@yieldxyz/perps-common/services"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { BackButton } from "../../../molecules/navigation/back-button"; import { WalletProtectedRoute } from "../../../molecules/navigation/wallet-protected-route"; import { ProviderSelect } from "../../../molecules/provider-select"; diff --git a/packages/widget/src/components/modules/Account/Withdraw/state.tsx b/packages/widget/src/components/modules/Account/Withdraw/state.tsx index ecce9f8..5507761 100644 --- a/packages/widget/src/components/modules/Account/Withdraw/state.tsx +++ b/packages/widget/src/components/modules/Account/Withdraw/state.tsx @@ -1,12 +1,9 @@ -import { - Atom, - Result, - useAtomSet, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { providersAtom } from "@yieldxyz/perps-common/atoms"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Array as _Array, Option } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Atom from "effect/unstable/reactivity/Atom"; const selectedProviderAtom = Atom.writable( (ctx) => diff --git a/packages/widget/src/components/modules/Account/balance.tsx b/packages/widget/src/components/modules/Account/balance.tsx index 899798e..47a775c 100644 --- a/packages/widget/src/components/modules/Account/balance.tsx +++ b/packages/widget/src/components/modules/Account/balance.tsx @@ -1,4 +1,4 @@ -import { Result, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import { useNavigate } from "@tanstack/react-router"; import hyperliquid from "@yieldxyz/perps-common/assets/hyperliquid.png"; import { @@ -9,6 +9,7 @@ import { Button, Text } from "@yieldxyz/perps-common/components"; import type { WalletConnected } from "@yieldxyz/perps-common/domain"; import { formatAmount } from "@yieldxyz/perps-common/lib"; import { Option, Record } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { AccountValueDisplay } from "../../molecules/account-value-display"; import { BackButton } from "../../molecules/navigation/back-button"; import { WalletProtectedRoute } from "../../molecules/navigation/wallet-protected-route"; diff --git a/packages/widget/src/components/modules/Home/AssetList/index.tsx b/packages/widget/src/components/modules/Home/AssetList/index.tsx index 2b2fcda..9a00e77 100644 --- a/packages/widget/src/components/modules/Home/AssetList/index.tsx +++ b/packages/widget/src/components/modules/Home/AssetList/index.tsx @@ -1,8 +1,9 @@ -import { Result, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import { useVirtualizer } from "@tanstack/react-virtual"; import { marketsAtom, walletAtom } from "@yieldxyz/perps-common/atoms"; import { AssetSkeleton, Text } from "@yieldxyz/perps-common/components"; import { Array as _Array, Option, Record } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { ArrowDownUp, ArrowDownWideNarrow, diff --git a/packages/widget/src/components/modules/Home/AssetList/item.tsx b/packages/widget/src/components/modules/Home/AssetList/item.tsx index 37bfca8..a412170 100644 --- a/packages/widget/src/components/modules/Home/AssetList/item.tsx +++ b/packages/widget/src/components/modules/Home/AssetList/item.tsx @@ -1,4 +1,4 @@ -import { type AtomRef, useAtomRef } from "@effect-atom/atom-react"; +import { useAtomRef } from "@effect/atom-react"; import { useNavigate } from "@tanstack/react-router"; import { Text, TokenIcon } from "@yieldxyz/perps-common/components"; import { @@ -8,6 +8,7 @@ import { getTokenLogo, } from "@yieldxyz/perps-common/lib"; import type { ApiSchemas } from "@yieldxyz/perps-common/services"; +import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; export interface AssetItemProps { marketRef: AtomRef.AtomRef; diff --git a/packages/widget/src/components/modules/Home/Positions/index.tsx b/packages/widget/src/components/modules/Home/Positions/index.tsx index b74c453..69982f8 100644 --- a/packages/widget/src/components/modules/Home/Positions/index.tsx +++ b/packages/widget/src/components/modules/Home/Positions/index.tsx @@ -1,4 +1,4 @@ -import { Result, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import { marketsAtom, ordersAtom, @@ -13,8 +13,14 @@ import { } from "@yieldxyz/perps-common/domain"; import { formatAmount, formatPercentage } from "@yieldxyz/perps-common/lib"; import type { ApiSchemas } from "@yieldxyz/perps-common/services"; -import { Array as _Array, Match, Option, Record } from "effect"; -import { isNonEmptyArray } from "effect/Array"; +import { + Array as _Array, + Result as _Result, + Match, + Option, + Record, +} from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { useState } from "react"; import { OrderCard } from "./order-card"; import { PositionCard } from "./position-card"; @@ -92,14 +98,16 @@ function PositionsWithWallet({ wallet }: { wallet: WalletConnected }) { const positionsWithMarketAndOrders = positionsResult.pipe( Result.map((positions) => _Array.filterMap(Record.values(positions), (positionRef) => - Record.get(marketsMap, positionRef.value.marketId).pipe( - Option.map((m) => ({ - marketRef: m, - positionRef, - orders: Record.get(ordersMap, positionRef.value.marketId).pipe( - Option.getOrElse(() => [] as ApiSchemas.OrderDto[]), - ), - })), + Record.get(marketsMap, positionRef.value.marketId).pipe((market) => + market._tag === "None" + ? _Result.failVoid + : _Result.succeed({ + marketRef: market.value, + positionRef, + orders: Record.get(ordersMap, positionRef.value.marketId).pipe( + Option.getOrElse(() => [] as ApiSchemas.OrderDto[]), + ), + }), ), ), ), @@ -109,8 +117,10 @@ function PositionsWithWallet({ wallet }: { wallet: WalletConnected }) { const ordersWithMarket = ordersResult.pipe( Result.map((orders) => _Array.filterMap(orders, (o) => - Record.get(marketsMap, o.marketId).pipe( - Option.map((m) => ({ marketRef: m, order: o })), + Record.get(marketsMap, o.marketId).pipe((market) => + market._tag === "None" + ? _Result.failVoid + : _Result.succeed({ marketRef: market.value, order: o }), ), ), ), @@ -191,7 +201,7 @@ function PositionsWithWallet({ wallet }: { wallet: WalletConnected }) {
{Match.value(activeTab).pipe( Match.when("positions", () => - isNonEmptyArray(positionsWithMarketAndOrders) ? ( + positionsWithMarketAndOrders.length > 0 ? ( positionsWithMarketAndOrders.map( ({ marketRef, positionRef, orders }) => ( - isNonEmptyArray(ordersWithMarket) ? ( + ordersWithMarket.length > 0 ? ( ordersWithMarket.map(({ marketRef, order }, idx) => ( ; wallet: WalletConnected; - side: ApiTypes.PositionSide; + side: PositionSide; mode: OrderMode; }) { const market = useAtomRef(marketRef); @@ -316,7 +314,7 @@ function MarketOrderContent({ mode, }: { wallet: WalletConnected; - side: ApiTypes.PositionSide; + side: PositionSide; mode: OrderMode; }) { const { marketId } = useParams({ strict: false }) as { marketId: string }; @@ -344,7 +342,7 @@ export function MarketOrder({ side, mode = "open", }: { - side: ApiTypes.PositionSide; + side: PositionSide; mode: OrderMode; }) { return ( diff --git a/packages/widget/src/components/modules/PositionDetails/AdjustMargin/index.tsx b/packages/widget/src/components/modules/PositionDetails/AdjustMargin/index.tsx index d83691d..dc0cf81 100644 --- a/packages/widget/src/components/modules/PositionDetails/AdjustMargin/index.tsx +++ b/packages/widget/src/components/modules/PositionDetails/AdjustMargin/index.tsx @@ -1,9 +1,4 @@ -import { - type AtomRef, - Result, - useAtomRef, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomRef, useAtomValue } from "@effect/atom-react"; import { Navigate, useParams, useSearch } from "@tanstack/react-router"; import hyperliquidLogo from "@yieldxyz/perps-common/assets/hyperliquid.png"; import { marketAtom } from "@yieldxyz/perps-common/atoms"; @@ -24,6 +19,8 @@ import { } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Match } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; import { BackButton } from "../../../molecules/navigation/back-button"; import { WalletProtectedRoute } from "../../../molecules/navigation/wallet-protected-route"; import { AdjustMarginLoading } from "./loading"; diff --git a/packages/widget/src/components/modules/PositionDetails/AdjustMargin/state.tsx b/packages/widget/src/components/modules/PositionDetails/AdjustMargin/state.tsx index 25a7319..73230cb 100644 --- a/packages/widget/src/components/modules/PositionDetails/AdjustMargin/state.tsx +++ b/packages/widget/src/components/modules/PositionDetails/AdjustMargin/state.tsx @@ -1,10 +1,4 @@ -import { - Atom, - Registry, - Result, - useAtomSet, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { FormBuilder, FormReact } from "@lucas-barake/effect-form-react"; import { actionAtom, @@ -32,12 +26,15 @@ import { runtimeAtom, } from "@yieldxyz/perps-common/services"; import { Effect, Option, Record, Schema } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import * as Atom from "effect/unstable/reactivity/Atom"; +import * as Registry from "effect/unstable/reactivity/AtomRegistry"; export const AdjustMarginFormKey = Schema.Struct({ walletAddress: WalletAccountAddress, marketId: Schema.String, - mode: Schema.Literal("add", "remove"), -}).pipe(Schema.Data, Schema.brand("AdjustMarginFormKey")); + mode: Schema.Literals(["add", "remove"]), +}).pipe(Schema.brand("AdjustMarginFormKey")); export type AdjustMarginFormKey = typeof AdjustMarginFormKey.Type; @@ -52,7 +49,7 @@ const adjustMarginPositionAtom = Atom.family( const positionRef = Record.get(positions, args.marketId); if (positionRef._tag === "None") { - return yield* Effect.dieMessage("Position not found"); + return yield* Effect.die(new Error("Position not found")); } return positionRef.value.value; @@ -66,14 +63,18 @@ const adjustMarginFormAtom = Atom.family( .addField( "Amount", Schema.NumberFromString.pipe( - Schema.annotations({ message: () => "Invalid amount" }), - Schema.greaterThan(0, { message: () => "Must be greater than 0" }), + Schema.annotate({ issue: "Invalid amount" }), + Schema.check( + Schema.isGreaterThan(0, { + issue: "Must be greater than 0", + }), + ), ), ) .addField( "Mode", - Schema.Literal("add", "remove").pipe( - Schema.annotations({ message: () => "Invalid mode" }), + Schema.Literals(["add", "remove"]).pipe( + Schema.annotate({ issue: "Invalid mode" }), ), ) .refineEffect((values) => @@ -89,17 +90,17 @@ const adjustMarginFormAtom = Atom.family( .pipe(Result.getOrElse(() => null)); if (!providerBalance) { - return { path: ["Amount"], message: "Missing provider balance" }; + return { path: ["Amount"], issue: "Missing provider balance" }; } if (!position) { - return { path: ["Amount"], message: "Missing position" }; + return { path: ["Amount"], issue: "Missing position" }; } if (position.marginMode !== "isolated") { return { path: ["Amount"], - message: "Only isolated positions can adjust margin", + issue: "Only isolated positions can adjust margin", }; } @@ -111,7 +112,7 @@ const adjustMarginFormAtom = Atom.family( if (maxAmount <= 0) { return { path: ["Amount"], - message: + issue: values.Mode === "add" ? "No available balance" : "No margin to remove", @@ -121,7 +122,7 @@ const adjustMarginFormAtom = Atom.family( if (values.Amount > maxAmount) { return { path: ["Amount"], - message: + issue: values.Mode === "add" ? "Insufficient balance" : "Amount exceeds position margin", @@ -154,7 +155,7 @@ const adjustMarginFormAtom = Atom.family( .pipe(Result.getOrElse(() => null)); if (!position) { - return yield* Effect.dieMessage("Position not found"); + return yield* Effect.die(new Error("Position not found")); } const client = yield* ApiClientService; @@ -164,7 +165,7 @@ const adjustMarginFormAtom = Atom.family( .pipe(Result.getOrElse(() => null)); if (!selectedProvider) { - return yield* Effect.dieMessage("No selected provider"); + return yield* Effect.die(new Error("No selected provider")); } const signedAmount = getSignedUpdateMarginAmount({ @@ -173,16 +174,18 @@ const adjustMarginFormAtom = Atom.family( }); if (!signedAmount) { - return yield* Effect.dieMessage("Invalid margin amount"); + return yield* Effect.die(new Error("Invalid margin amount")); } const action = yield* client.ActionsControllerExecuteAction({ - providerId: selectedProvider.id, - address: key.walletAddress, - action: "updateMargin", - args: { - marketId: position.marketId, - amount: signedAmount, + payload: { + providerId: selectedProvider.id, + address: key.walletAddress, + action: "updateMargin", + args: { + marketId: position.marketId, + amount: signedAmount, + }, }, }); diff --git a/packages/widget/src/components/modules/PositionDetails/Close/index.tsx b/packages/widget/src/components/modules/PositionDetails/Close/index.tsx index 4b30a2a..65a4f36 100644 --- a/packages/widget/src/components/modules/PositionDetails/Close/index.tsx +++ b/packages/widget/src/components/modules/PositionDetails/Close/index.tsx @@ -1,4 +1,3 @@ -import { Result } from "@effect-atom/atom-react"; import { Navigate, useParams } from "@tanstack/react-router"; import { SLIDER_STOPS } from "@yieldxyz/perps-common/atoms"; import { @@ -21,6 +20,7 @@ import { getPositionChangePercent, } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { BackButton } from "../../../molecules/navigation/back-button"; import { WalletProtectedRoute } from "../../../molecules/navigation/wallet-protected-route"; import { usePosition } from "./state"; diff --git a/packages/widget/src/components/modules/PositionDetails/Close/state.tsx b/packages/widget/src/components/modules/PositionDetails/Close/state.tsx index 49cdfb3..74eced6 100644 --- a/packages/widget/src/components/modules/PositionDetails/Close/state.tsx +++ b/packages/widget/src/components/modules/PositionDetails/Close/state.tsx @@ -1,8 +1,9 @@ -import { Atom, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import { positionsAtom } from "@yieldxyz/perps-common/atoms"; import type { WalletAccount } from "@yieldxyz/perps-common/domain"; import { type ApiTypes, runtimeAtom } from "@yieldxyz/perps-common/services"; -import { Data, Effect, Record } from "effect"; +import { Effect, Record } from "effect"; +import * as Atom from "effect/unstable/reactivity/Atom"; export type { ApiTypes }; @@ -15,7 +16,7 @@ const closePositionAtom = Atom.family( const positionRef = Record.get(positions, args.marketId); if (positionRef._tag === "None") { - return yield* Effect.dieMessage("Position not found"); + return yield* Effect.die(new Error("Position not found")); } return positionRef.value.value; @@ -27,7 +28,5 @@ export const usePosition = ( walletAddress: WalletAccount["address"], marketId: string, ) => { - return useAtomValue( - closePositionAtom(Data.struct({ walletAddress, marketId })), - ); + return useAtomValue(closePositionAtom({ walletAddress, marketId })); }; diff --git a/packages/widget/src/components/modules/PositionDetails/Overview/Orders/index.tsx b/packages/widget/src/components/modules/PositionDetails/Overview/Orders/index.tsx index 17af430..6910bcc 100644 --- a/packages/widget/src/components/modules/PositionDetails/Overview/Orders/index.tsx +++ b/packages/widget/src/components/modules/PositionDetails/Overview/Orders/index.tsx @@ -1,4 +1,4 @@ -import { Result, useAtomSet, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { Navigate } from "@tanstack/react-router"; import { cancelOrderAtom, @@ -24,6 +24,7 @@ import { formatSnakeCase, } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; function OrderCard({ order, diff --git a/packages/widget/src/components/modules/PositionDetails/Overview/Position/index.tsx b/packages/widget/src/components/modules/PositionDetails/Overview/Position/index.tsx index b091e13..fec402b 100644 --- a/packages/widget/src/components/modules/PositionDetails/Overview/Position/index.tsx +++ b/packages/widget/src/components/modules/PositionDetails/Overview/Position/index.tsx @@ -1,9 +1,4 @@ -import { - type AtomRef, - Result, - useAtomRef, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomRef, useAtomValue } from "@effect/atom-react"; import { Link, Navigate } from "@tanstack/react-router"; import { ordersAtom, @@ -40,6 +35,8 @@ import { } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Option, Record } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; import { AdjustMarginDialog } from "../adjust-margin-dialog"; function PositionCardContent({ diff --git a/packages/widget/src/components/modules/PositionDetails/Overview/index.tsx b/packages/widget/src/components/modules/PositionDetails/Overview/index.tsx index 5e406e7..002cba6 100644 --- a/packages/widget/src/components/modules/PositionDetails/Overview/index.tsx +++ b/packages/widget/src/components/modules/PositionDetails/Overview/index.tsx @@ -1,9 +1,4 @@ -import { - type AtomRef, - Result, - useAtomRef, - useAtomValue, -} from "@effect-atom/atom-react"; +import { useAtomRef, useAtomValue } from "@effect/atom-react"; import { Link, useNavigate, @@ -38,6 +33,8 @@ import { } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Option, Record } from "effect"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; +import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; import { BackButton } from "../../../molecules/navigation/back-button"; import { PositionDetailsLoading } from "./loading"; import { ModifyDialog } from "./modify-dialog"; @@ -191,7 +188,10 @@ function PositionDetailsContent({ onValueChange={(value) => navigate({ replace: true, - search: (prev) => ({ ...prev, tab: value }), + search: (prev: { tab?: PositionDetailsTab }) => ({ + ...prev, + tab: value as PositionDetailsTab, + }), }) } className="gap-2.5" diff --git a/packages/widget/src/components/modules/PositionDetails/Overview/modify-dialog.tsx b/packages/widget/src/components/modules/PositionDetails/Overview/modify-dialog.tsx index 54a8f87..5153d3d 100644 --- a/packages/widget/src/components/modules/PositionDetails/Overview/modify-dialog.tsx +++ b/packages/widget/src/components/modules/PositionDetails/Overview/modify-dialog.tsx @@ -1,6 +1,5 @@ import { Link } from "@tanstack/react-router"; import { Button, Dialog, Text } from "@yieldxyz/perps-common/components"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { ArrowDownRight, ArrowUpRight } from "lucide-react"; const MODIFY_OPTIONS = [ @@ -23,7 +22,7 @@ export function ModifyDialog({ side, }: { marketId: string; - side: ApiTypes.PositionSide; + side: "long" | "short"; }) { return ( diff --git a/packages/widget/src/components/modules/Root/PreloadAtoms.tsx b/packages/widget/src/components/modules/Root/PreloadAtoms.tsx index 16dd355..f6da246 100644 --- a/packages/widget/src/components/modules/Root/PreloadAtoms.tsx +++ b/packages/widget/src/components/modules/Root/PreloadAtoms.tsx @@ -1,4 +1,4 @@ -import { Result, useAtomMount, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomMount, useAtomValue } from "@effect/atom-react"; import { marketsAtom, moralisTokenBalancesAtom, @@ -15,6 +15,7 @@ import { isWalletConnected, type WalletConnected, } from "@yieldxyz/perps-common/domain"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; const PreloadWalletConnectedAtoms = ({ wallet, diff --git a/packages/widget/src/components/molecules/account-value-display.tsx b/packages/widget/src/components/molecules/account-value-display.tsx index 8d2ce7d..9aa5cff 100644 --- a/packages/widget/src/components/molecules/account-value-display.tsx +++ b/packages/widget/src/components/molecules/account-value-display.tsx @@ -1,8 +1,9 @@ -import { Result, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import { selectedProviderBalancesAtom } from "@yieldxyz/perps-common/atoms"; import { Skeleton, Text } from "@yieldxyz/perps-common/components"; import type { WalletConnected } from "@yieldxyz/perps-common/domain"; import { cn, formatAmount, getTokenLogo } from "@yieldxyz/perps-common/lib"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; export function AccountValueDisplay({ wallet }: { wallet: WalletConnected }) { const selectedProviderBalances = useAtomValue( diff --git a/packages/widget/src/components/molecules/navigation/wallet-protected-route.tsx b/packages/widget/src/components/molecules/navigation/wallet-protected-route.tsx index 05d5df1..fe921f1 100644 --- a/packages/widget/src/components/molecules/navigation/wallet-protected-route.tsx +++ b/packages/widget/src/components/molecules/navigation/wallet-protected-route.tsx @@ -1,10 +1,11 @@ -import { Result, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import { Navigate } from "@tanstack/react-router"; import { walletAtom } from "@yieldxyz/perps-common/atoms"; import { isWalletConnected, type WalletConnected, } from "@yieldxyz/perps-common/domain"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; export const WalletProtectedRoute = ({ children, diff --git a/packages/widget/src/components/molecules/provider-select.tsx b/packages/widget/src/components/molecules/provider-select.tsx index 2449ca7..5289076 100644 --- a/packages/widget/src/components/molecules/provider-select.tsx +++ b/packages/widget/src/components/molecules/provider-select.tsx @@ -1,9 +1,10 @@ -import { Result, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import hyperliquidLogo from "@yieldxyz/perps-common/assets/hyperliquid.png"; import { providersAtom } from "@yieldxyz/perps-common/atoms"; import { Button, Dialog, Text } from "@yieldxyz/perps-common/components"; import { cn } from "@yieldxyz/perps-common/lib"; import type { ApiTypes } from "@yieldxyz/perps-common/services"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; import { ChevronDown } from "lucide-react"; import { type ComponentProps, diff --git a/packages/widget/src/components/molecules/sign/sign-content.tsx b/packages/widget/src/components/molecules/sign/sign-content.tsx index 386bdfd..b5337e1 100644 --- a/packages/widget/src/components/molecules/sign/sign-content.tsx +++ b/packages/widget/src/components/molecules/sign/sign-content.tsx @@ -1,4 +1,4 @@ -import { Result, useAtomSet, useAtomValue } from "@effect-atom/atom-react"; +import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { Navigate } from "@tanstack/react-router"; import type { signActionAtoms } from "@yieldxyz/perps-common/atoms"; import { @@ -6,6 +6,7 @@ import { TransactionProgress, } from "@yieldxyz/perps-common/components"; import type { SignTransactionsState } from "@yieldxyz/perps-common/domain"; +import * as Result from "effect/unstable/reactivity/AsyncResult"; interface SignTransactionsProps { state: SignTransactionsState; diff --git a/packages/widget/src/routes/position-details/$marketId/adjust-margin.tsx b/packages/widget/src/routes/position-details/$marketId/adjust-margin.tsx index 1ddbc6e..5132ba9 100644 --- a/packages/widget/src/routes/position-details/$marketId/adjust-margin.tsx +++ b/packages/widget/src/routes/position-details/$marketId/adjust-margin.tsx @@ -6,9 +6,9 @@ export const Route = createFileRoute( "/position-details/$marketId/adjust-margin", )({ component: AdjustMarginRoute, - validateSearch: Schema.standardSchemaV1( + validateSearch: Schema.toStandardSchemaV1( Schema.Struct({ - mode: Schema.optional(Schema.Literal("add", "remove")), + mode: Schema.optional(Schema.Literals(["add", "remove"])), }), ), }); diff --git a/packages/widget/src/routes/position-details/$marketId/index.tsx b/packages/widget/src/routes/position-details/$marketId/index.tsx index a92a4e6..67ab9a9 100644 --- a/packages/widget/src/routes/position-details/$marketId/index.tsx +++ b/packages/widget/src/routes/position-details/$marketId/index.tsx @@ -4,9 +4,9 @@ import PositionDetails from "../../../components/modules/PositionDetails/Overvie export const Route = createFileRoute("/position-details/$marketId/")({ component: PositionDetails, - validateSearch: Schema.standardSchemaV1( + validateSearch: Schema.toStandardSchemaV1( Schema.Struct({ - tab: Schema.optional(Schema.Literal("overview", "position", "orders")), + tab: Schema.optional(Schema.Literals(["overview", "position", "orders"])), }), ), }); diff --git a/patches/@lucas-barake__effect-form-react@0.24.0.patch b/patches/@lucas-barake__effect-form-react@0.24.0.patch new file mode 100644 index 0000000..6d56419 --- /dev/null +++ b/patches/@lucas-barake__effect-form-react@0.24.0.patch @@ -0,0 +1,41 @@ +diff --git a/dist/FormReact.d.ts b/dist/FormReact.d.ts +index 2db278fbbda6d9d0d3aa9ab49353360c8d7d99e4..9533f6e594eb1ba50635ba0830ecbd4eef6e94d0 100644 +--- a/dist/FormReact.d.ts ++++ b/dist/FormReact.d.ts +@@ -1,5 +1,5 @@ +-import * as Atom from "@effect-atom/atom/Atom"; +-import type * as Registry from "@effect-atom/atom/Registry"; ++import * as Atom from "effect/unstable/reactivity/Atom"; ++import type * as Registry from "effect/unstable/reactivity/AtomRegistry"; + import { Field, FormAtoms } from "@lucas-barake/effect-form"; + import type { FieldState as FieldStateModule, Mode } from "@lucas-barake/effect-form"; + import type * as FormBuilder from "@lucas-barake/effect-form/FormBuilder"; +diff --git a/dist/FormReact.js b/dist/FormReact.js +index c6551bcca928a167369d898e5a71d8d0fc5b737c..e2fc5f33151b573c881fd31d519f2e07f4178fd3 100644 +--- a/dist/FormReact.js ++++ b/dist/FormReact.js +@@ -1,6 +1,6 @@ + import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime"; +-import { RegistryContext, useAtom, useAtomMount, useAtomSet, useAtomValue } from "@effect-atom/atom-react"; +-import * as Atom from "@effect-atom/atom/Atom"; ++import { RegistryContext, useAtom, useAtomMount, useAtomSet, useAtomValue } from "@effect/atom-react"; ++import * as Atom from "effect/unstable/reactivity/Atom"; + import { Field, FormAtoms } from "@lucas-barake/effect-form"; + import { getNestedValue } from "@lucas-barake/effect-form/Path"; + import * as Layer from "effect/Layer"; +diff --git a/package.json b/package.json +index 34f7b2fb24ea0ac2a16a5d222ab972e310da687a..dbba9c1863a38361c9748d4959d53a39f0f2b543 100644 +--- a/package.json ++++ b/package.json +@@ -44,9 +44,8 @@ + "@vitejs/plugin-react": "^5.1.1" + }, + "peerDependencies": { +- "@effect-atom/atom": "^0.5.0", +- "@effect-atom/atom-react": "^0.5.0", +- "effect": "^3.19.15", ++ "@effect/atom-react": "^4.0.0-beta.65", ++ "effect": "^4.0.0-beta.65", + "react": "^18.0.0 || ^19.0.0" + }, + "scripts": { diff --git a/patches/@lucas-barake__effect-form@0.23.0.patch b/patches/@lucas-barake__effect-form@0.23.0.patch new file mode 100644 index 0000000..e128b10 --- /dev/null +++ b/patches/@lucas-barake__effect-form@0.23.0.patch @@ -0,0 +1,227 @@ +diff --git a/dist/FormAtoms.d.ts b/dist/FormAtoms.d.ts +index 5db0c109ba8c987db5b292bbc969c9289a051e81..aee21e2ecd1f2e7fb8b07eac68faa1bc3f640e9f 100644 +--- a/dist/FormAtoms.d.ts ++++ b/dist/FormAtoms.d.ts +@@ -1,7 +1,6 @@ +-import * as Atom from "@effect-atom/atom/Atom"; ++import * as Atom from "effect/unstable/reactivity/Atom"; + import * as Effect from "effect/Effect"; + import * as Option from "effect/Option"; +-import * as ParseResult from "effect/ParseResult"; + import * as Schema from "effect/Schema"; + import * as Field from "./Field.ts"; + import * as FormBuilder from "./FormBuilder.ts"; +@@ -14,7 +13,7 @@ export interface FieldAtoms { + readonly touchedAtom: Atom.Writable; + readonly errorAtom: Atom.Atom>; + readonly isDirtyAtom: Atom.Atom; +- readonly validationAtom: Atom.AtomResultFn; ++ readonly validationAtom: Atom.AtomResultFn; + readonly displayErrorAtom: Atom.Atom>; + readonly shouldValidateAtom: Atom.Atom; + readonly triggerValidationAtom: Atom.Atom; +@@ -54,13 +53,13 @@ export interface FormAtoms>>; + readonly changedSinceSubmitFieldsAtom: Atom.Atom>; + readonly hasChangedSinceSubmitAtom: Atom.Atom; +- readonly submitAtom: Atom.AtomResultFn; ++ readonly submitAtom: Atom.AtomResultFn; + readonly validateAtom: Atom.AtomResultFn; + readonly combinedSchema: Schema.Schema, Field.EncodedFromFields, R>; + readonly fieldRefs: FieldRefs; +- readonly validationAtomsRegistry: WeakRegistry>; ++ readonly validationAtomsRegistry: WeakRegistry>; + readonly fieldAtomsRegistry: WeakRegistry; +- readonly getOrCreateValidationAtom: (fieldPath: string, schema: Schema.Schema.Any) => Atom.AtomResultFn; ++ readonly getOrCreateValidationAtom: (fieldPath: string, schema: Schema.Schema.Any) => Atom.AtomResultFn; + readonly getOrCreateFieldAtoms: (fieldPath: string, schema: Schema.Schema.Any) => FieldAtoms; + readonly resetValidationAtoms: (ctx: { + set: (atom: Atom.Writable, value: W) => void; +diff --git a/dist/FormAtoms.js b/dist/FormAtoms.js +index 5d48ed491d6b5d225b0bd83e3994e94c9f2e5e80..4e3988c525c2262e5bd54561497593edffa61cdb 100644 +--- a/dist/FormAtoms.js ++++ b/dist/FormAtoms.js +@@ -1,9 +1,8 @@ +-import * as Atom from "@effect-atom/atom/Atom"; ++import * as Atom from "effect/unstable/reactivity/Atom"; + import * as Cause from "effect/Cause"; + import * as Effect from "effect/Effect"; + import { pipe } from "effect/Function"; + import * as Option from "effect/Option"; +-import * as ParseResult from "effect/ParseResult"; + import * as Schema from "effect/Schema"; + import * as Field from "./Field.js"; + import * as FormBuilder from "./FormBuilder.js"; +@@ -80,7 +79,7 @@ export const make = config => { + const existing = validationAtomsRegistry.get(fieldPath); + const existingSchema = validationSchemaRegistry.get(fieldPath); + if (existing && existingSchema === schema) return existing; +- const validationAtom = runtime.fn()(value => pipe(Schema.decodeUnknown(schema)(value), Effect.asVoid)).pipe(Atom.setIdleTTL(0)); ++ const validationAtom = runtime.fn()(value => pipe(Schema.decodeUnknownEffect(schema)(value), Effect.asVoid)).pipe(Atom.setIdleTTL(0)); + validationAtomsRegistry.set(fieldPath, validationAtom); + validationSchemaRegistry.set(fieldPath, schema); + return validationAtom; +@@ -213,7 +212,7 @@ export const make = config => { + if (Option.isNone(state)) return yield* Effect.die("Form not initialized"); + const values = state.value.values; + get.set(errorsAtom, new Map()); +- const decoded = yield* pipe(Schema.decodeUnknown(combinedSchema, { ++ const decoded = yield* pipe(Schema.decodeUnknownEffect(combinedSchema, { + errors: "all" + })(values), Effect.tapError(parseError => Effect.sync(() => { + const routedErrors = Validation.routeErrorsWithSource(parseError); +@@ -245,7 +244,7 @@ export const make = config => { + if (Option.isNone(state)) return; + const values = state.value.values; + get.set(errorsAtom, new Map()); +- yield* pipe(Schema.decodeUnknown(combinedSchema, { ++ yield* pipe(Schema.decodeUnknownEffect(combinedSchema, { + errors: "all" + })(values), Effect.catchTag("ParseError", parseError => Effect.sync(() => { + const routedErrors = Validation.routeErrorsWithSource(parseError); +diff --git a/dist/FormBuilder.d.ts b/dist/FormBuilder.d.ts +index b22a12d6164995a51233c2ccc101d48f15dfa050..f8f7a93f0e4df8dbef9bd7033d50edc325081701 100644 +--- a/dist/FormBuilder.d.ts ++++ b/dist/FormBuilder.d.ts +@@ -1,4 +1,4 @@ +-import type * as Registry from "@effect-atom/atom/Registry"; ++import type * as Registry from "effect/unstable/reactivity/AtomRegistry"; + import type * as Effect from "effect/Effect"; + import type * as Option from "effect/Option"; + import * as Schema from "effect/Schema"; +diff --git a/dist/FormBuilder.js b/dist/FormBuilder.js +index b7088940b5335e6b40a851842a0220fb2de8ce3a..64c33d8254fa277c9898a979b4b8ca97978cdac0 100644 +--- a/dist/FormBuilder.js ++++ b/dist/FormBuilder.js +@@ -1,5 +1,6 @@ + import * as Predicate from "effect/Predicate"; + import * as Schema from "effect/Schema"; ++import * as SchemaGetter from "effect/SchemaGetter"; + import { isArrayFieldDef, isFieldDef, makeField } from "./Field.js"; + export const FieldTypeId = /*#__PURE__*/Symbol.for("@lucas-barake/effect-form/Field"); + export const makeFieldRef = key => ({ +@@ -68,9 +69,12 @@ export const buildSchema = self => { + let schema = Schema.Struct(schemaFields); + for (const refinement of self.refinements) { + if (refinement._tag === "sync") { +- schema = schema.pipe(Schema.filter(refinement.fn)); ++ schema = schema.pipe(Schema.check(Schema.makeFilter(refinement.fn))); + } else { +- schema = schema.pipe(Schema.filterEffect(refinement.fn)); ++ schema = schema.pipe(Schema.decode({ ++ decode: SchemaGetter.checkEffect(refinement.fn), ++ encode: SchemaGetter.passthrough() ++ })); + } + } + return schema; +diff --git a/dist/Validation.d.ts b/dist/Validation.d.ts +index 940618e2bb77c2dea890b42591e585e34784d2bf..a8532587abb4d2bee10d97e806441c4e06a114b4 100644 +--- a/dist/Validation.d.ts ++++ b/dist/Validation.d.ts +@@ -1,11 +1,10 @@ + import * as Option from "effect/Option"; +-import * as ParseResult from "effect/ParseResult"; + export type ErrorSource = "field" | "refinement"; + export interface ErrorEntry { + readonly message: string; + readonly source: ErrorSource; + } +-export declare const extractFirstError: (error: ParseResult.ParseError) => Option.Option; +-export declare const routeErrors: (error: ParseResult.ParseError) => Map; +-export declare const routeErrorsWithSource: (error: ParseResult.ParseError) => Map; ++export declare const extractFirstError: (error: unknown) => Option.Option; ++export declare const routeErrors: (error: unknown) => Map; ++export declare const routeErrorsWithSource: (error: unknown) => Map; + //# sourceMappingURL=Validation.d.ts.map +\ No newline at end of file +diff --git a/dist/Validation.js b/dist/Validation.js +index ec3abe9f93e2189a081dc0f1ef57e6fad4d3902e..c83f3dda5e93165c8037952ae4db2f9bd2081b29 100644 +--- a/dist/Validation.js ++++ b/dist/Validation.js +@@ -1,6 +1,8 @@ + import * as Option from "effect/Option"; +-import * as ParseResult from "effect/ParseResult"; ++import * as SchemaIssue from "effect/SchemaIssue"; + import { schemaPathToFieldPath } from "./Path.js"; ++const formatIssue = issue => SchemaIssue.makeFormatterStandardSchemaV1()(issue).issues; ++const formatError = error => formatIssue(error?.issue ?? error); + const getBaseAST = ast => { + switch (ast._tag) { + case "Refinement": +@@ -72,11 +74,11 @@ const collectIssueSources = error => { + return entries; + }; + const getIssueMessage = issue => { +- const formatted = ParseResult.ArrayFormatter.formatIssueSync(issue); ++ const formatted = formatIssue(issue); + return formatted[0]?.message; + }; + export const extractFirstError = error => { +- const issues = ParseResult.ArrayFormatter.formatErrorSync(error); ++ const issues = formatError(error); + if (issues.length === 0) { + return Option.none(); + } +@@ -84,7 +86,7 @@ export const extractFirstError = error => { + }; + export const routeErrors = error => { + const result = new Map(); +- const issues = ParseResult.ArrayFormatter.formatErrorSync(error); ++ const issues = formatError(error); + for (const issue of issues) { + const fieldPath = schemaPathToFieldPath(issue.path); + if (fieldPath && !result.has(fieldPath)) { +@@ -95,7 +97,7 @@ export const routeErrors = error => { + }; + export const routeErrorsWithSource = error => { + const result = new Map(); +- const formattedIssues = ParseResult.ArrayFormatter.formatErrorSync(error); ++ const formattedIssues = formatError(error); + const issueSources = collectIssueSources(error); + const messageSources = new Map(); + const refinementPaths = new Set(); +diff --git a/dist/internal/dirty.js b/dist/internal/dirty.js +index 4107e805b6aa67bda4370c388a74d44fd08a31ea..fcec419b4c99f7be93247bbca7bede090c274f9b 100644 +--- a/dist/internal/dirty.js ++++ b/dist/internal/dirty.js +@@ -1,5 +1,4 @@ + import * as Equal from "effect/Equal"; +-import * as Utils from "effect/Utils"; + import { getNestedValue, isPathUnderRoot } from "../Path.js"; + export const recalculateDirtyFieldsForArray = (dirtyFields, initialValues, arrayPath, newItems) => { + const initialItems = getNestedValue(initialValues, arrayPath) ?? []; +@@ -13,8 +12,7 @@ export const recalculateDirtyFieldsForArray = (dirtyFields, initialValues, array + const newItem = newItems[i]; + const initialItem = initialItems[i]; + if (newItem === initialItem) continue; +- const isEqual = Utils.structuralRegion(() => Equal.equals(newItem, initialItem)); +- if (!isEqual) { ++ if (!Equal.equals(newItem, initialItem)) { + nextDirty.add(itemPath); + } + } +@@ -70,8 +68,7 @@ export const recalculateDirtySubtree = (currentDirty, allInitial, allValues, roo + } + } + } else { +- const isEqual = Utils.structuralRegion(() => Equal.equals(current, initial)); +- if (!isEqual && path) nextDirty.add(path); ++ if (!Equal.equals(current, initial) && path) nextDirty.add(path); + } + }; + recurse(targetValue, targetInitial, rootPath); +diff --git a/package.json b/package.json +index cd139498dda38824903f1612193e76c82cf8ccd3..5cb0e44709801d88615d1c0e9d2312e91e2233a8 100644 +--- a/package.json ++++ b/package.json +@@ -36,8 +36,7 @@ + "license": "MIT", + "sideEffects": [], + "peerDependencies": { +- "@effect-atom/atom": "^0.5.0", +- "effect": "^3.19.15" ++ "effect": "^4.0.0-beta.65" + }, + "scripts": { + "build": "tsc -b tsconfig.json && pnpm babel", diff --git a/patches/@tim-smart__openapi-gen.patch b/patches/@tim-smart__openapi-gen.patch deleted file mode 100644 index b45d146..0000000 --- a/patches/@tim-smart__openapi-gen.patch +++ /dev/null @@ -1,32 +0,0 @@ -diff --git a/main.js b/main.js -index b2ad70b09a67207d2beb5eeaa011ff0307dac1ce..8eaf84b56fa17381c0be55253d30a37b527bd26f 100755 ---- a/main.js -+++ b/main.js -@@ -34916,6 +34916,9 @@ var make64 = gen2(function* () { - if ("$ref" in root2) { - addRefs(root2, void 0, false); - return identifier2(root2.$ref.split("/").pop()); -+ } else if ("allOf" in root2) { -+ addRefs(root2, name2) -+ store.set(name2, resolveAllOf(root2, { ...root2, ...context7 })) - } else { - addRefs(root2, "properties" in root2 ? name2 : void 0); - store.set(name2, root2); -@@ -35336,13 +35339,13 @@ export type ${name2} = (typeof ${name2})[keyof typeof ${name2}];` : `${toComment - function mergeSchemas(self, other) { - if ("properties" in self && "properties" in other) { - return { -- ...other, - ...self, -+ ...other, - properties: { -- ...other.properties, -- ...self.properties -+ ...self.properties, -+ ...other.properties - }, -- required: [...other.required || [], ...self.required || []] -+ required: [...self.required || [], ...other.required || []] - }; - } else if ("anyOf" in self && "anyOf" in other) { - return { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a1ec68..47c49ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,7 +1,7 @@ lockfileVersion: '9.0' settings: - autoInstallPeers: true + autoInstallPeers: false excludeLinksFromLockfile: false catalogs: @@ -18,21 +18,18 @@ catalogs: '@commitlint/config-conventional': specifier: ^20.4.1 version: 20.4.1 - '@effect-atom/atom-react': - specifier: ^0.5.0 - version: 0.5.0 - '@effect/experimental': - specifier: ^0.58.0 - version: 0.58.0 + '@effect/atom-react': + specifier: ^4.0.0-beta.65 + version: 4.0.0-beta.65 '@effect/language-service': - specifier: ^0.73.1 - version: 0.73.1 - '@effect/platform': - specifier: ^0.94.4 - version: 0.94.4 + specifier: ^0.85.1 + version: 0.85.1 + '@effect/openapi-generator': + specifier: ^4.0.0-beta.65 + version: 4.0.0-beta.65 '@effect/platform-node': - specifier: ^0.104.1 - version: 0.104.1 + specifier: ^4.0.0-beta.65 + version: 4.0.0-beta.65 '@ledgerhq/wallet-api-client': specifier: ^1.13.0 version: 1.13.0 @@ -78,9 +75,6 @@ catalogs: '@tanstack/router-plugin': specifier: ^1.159.5 version: 1.159.5 - '@tim-smart/openapi-gen': - specifier: ^0.4.13 - version: 0.4.13 '@types/node': specifier: ^25.2.3 version: 25.2.3 @@ -109,8 +103,8 @@ catalogs: specifier: ^2.1.1 version: 2.1.1 effect: - specifier: ^3.19.16 - version: 3.19.16 + specifier: ^4.0.0-beta.65 + version: 4.0.0-beta.65 husky: specifier: ^9.1.7 version: 9.1.7 @@ -169,13 +163,13 @@ catalogs: specifier: ^3.4.3 version: 3.4.3 -overrides: - '@effect-atom/atom': 0.5.1 - patchedDependencies: - '@tim-smart/openapi-gen': - hash: 36720013d0f70c201ce8f233e38a7b93fc9fce74a17f9bc4293c3cf891b4fdc6 - path: patches/@tim-smart__openapi-gen.patch + '@lucas-barake/effect-form-react@0.24.0': + hash: 19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05 + path: patches/@lucas-barake__effect-form-react@0.24.0.patch + '@lucas-barake/effect-form@0.23.0': + hash: 4f4cbbb31f1466c5d108c52532d9dd5b21ce6cff1d6b86b2d96d8eb4e9dbe863 + path: patches/@lucas-barake__effect-form@0.23.0.patch importers: @@ -192,55 +186,61 @@ importers: version: 20.4.1 '@effect/language-service': specifier: 'catalog:' - version: 0.73.1 + version: 0.85.1 husky: specifier: 'catalog:' version: 9.1.7 + json-schema-typed: + specifier: ^8.0.2 + version: 8.0.2 + openapi-typescript: + specifier: ^7.13.0 + version: 7.13.0(typescript@5.9.3) + swagger2openapi: + specifier: ^7.0.8 + version: 7.0.8 turbo: specifier: 'catalog:' version: 2.8.7 + yaml: + specifier: ^2.9.0 + version: 2.9.0 packages/common: dependencies: '@base-ui/react': specifier: 'catalog:' version: 1.2.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@effect-atom/atom-react': + '@effect/atom-react': specifier: 'catalog:' - version: 0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4)(scheduler@0.27.0) - '@effect/experimental': - specifier: 'catalog:' - version: 0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - '@effect/platform': - specifier: 'catalog:' - version: 0.94.4(effect@3.19.16) + version: 4.0.0-beta.65(effect@4.0.0-beta.65)(react@19.2.4)(scheduler@0.27.0) '@effect/platform-node': specifier: 'catalog:' - version: 0.104.1(@effect/cluster@0.56.1(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(bufferutil@4.1.0)(effect@3.19.16)(utf-8-validate@5.0.10) + version: 4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10) '@ledgerhq/wallet-api-client': specifier: 'catalog:' - version: 1.13.0(@ton/crypto@3.3.0) + version: 1.13.0 '@lucas-barake/effect-form-react': specifier: 'catalog:' - version: 0.24.0(@effect-atom/atom-react@0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4)(scheduler@0.27.0))(@effect-atom/atom@0.5.1(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4) + version: 0.24.0(patch_hash=19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05)(effect@4.0.0-beta.65)(react@19.2.4) '@nktkas/hyperliquid': specifier: 'catalog:' version: 0.31.0(typescript@5.9.3) '@reown/appkit': specifier: 'catalog:' - version: 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + version: 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-adapter-wagmi': specifier: 'catalog:' - version: 1.8.18(f99347586472b17ffe6b100465a31bdf) + version: 1.8.18(9ee7863b275c29e516ad5604625576cd) '@stakekit/common': specifier: 'catalog:' version: 0.0.61 '@tailwindcss/vite': specifier: 'catalog:' - version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/react-devtools': specifier: 'catalog:' - version: 0.9.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(solid-js@1.9.11)(utf-8-validate@5.0.10) + version: 0.9.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@5.0.10) '@tanstack/react-query': specifier: 'catalog:' version: 5.90.21(react@19.2.4) @@ -261,7 +261,7 @@ importers: version: 2.1.1 effect: specifier: 'catalog:' - version: 3.19.16 + version: 4.0.0-beta.65 lucide-react: specifier: 'catalog:' version: 0.564.0(react@19.2.4) @@ -290,15 +290,15 @@ importers: specifier: 'catalog:' version: 3.4.3(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.4))(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) devDependencies: + '@effect/openapi-generator': + specifier: 'catalog:' + version: 4.0.0-beta.65(@effect/platform-node@4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10))(effect@4.0.0-beta.65) '@tanstack/devtools-vite': specifier: 'catalog:' - version: 0.5.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 0.5.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/router-cli': specifier: 'catalog:' version: 1.166.25 - '@tim-smart/openapi-gen': - specifier: 'catalog:' - version: 0.4.13(patch_hash=36720013d0f70c201ce8f233e38a7b93fc9fce74a17f9bc4293c3cf891b4fdc6) '@types/node': specifier: 'catalog:' version: 25.2.3 @@ -313,10 +313,10 @@ importers: version: 1.0.2 '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.0.18(bufferutil@4.1.0)(playwright@1.58.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18) babel-plugin-react-compiler: specifier: 'catalog:' version: 1.0.0 @@ -334,13 +334,13 @@ importers: version: 5.9.3 vite: specifier: 'catalog:' - version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) vitest-browser-react: specifier: 'catalog:' version: 2.0.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18) @@ -350,24 +350,18 @@ importers: '@base-ui/react': specifier: 'catalog:' version: 1.2.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@effect-atom/atom-react': - specifier: 'catalog:' - version: 0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4)(scheduler@0.27.0) - '@effect/experimental': - specifier: 'catalog:' - version: 0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - '@effect/platform': + '@effect/atom-react': specifier: 'catalog:' - version: 0.94.4(effect@3.19.16) + version: 4.0.0-beta.65(effect@4.0.0-beta.65)(react@19.2.4)(scheduler@0.27.0) '@effect/platform-node': specifier: 'catalog:' - version: 0.104.1(@effect/cluster@0.56.1(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(bufferutil@4.1.0)(effect@3.19.16)(utf-8-validate@5.0.10) + version: 4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10) '@ledgerhq/wallet-api-client': specifier: 'catalog:' - version: 1.13.0(@ton/crypto@3.3.0) + version: 1.13.0 '@lucas-barake/effect-form-react': specifier: 'catalog:' - version: 0.24.0(@effect-atom/atom-react@0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4)(scheduler@0.27.0))(@effect-atom/atom@0.5.1(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4) + version: 0.24.0(patch_hash=19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05)(effect@4.0.0-beta.65)(react@19.2.4) '@reown/appkit': specifier: 'catalog:' version: 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) @@ -379,10 +373,10 @@ importers: version: 0.0.61 '@tailwindcss/vite': specifier: 'catalog:' - version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/react-devtools': specifier: 'catalog:' - version: 0.9.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(solid-js@1.9.11)(utf-8-validate@5.0.10) + version: 0.9.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@5.0.10) '@tanstack/react-query': specifier: 'catalog:' version: 5.90.21(react@19.2.4) @@ -406,7 +400,7 @@ importers: version: 2.1.1 effect: specifier: 'catalog:' - version: 3.19.16 + version: 4.0.0-beta.65 lucide-react: specifier: 'catalog:' version: 0.564.0(react@19.2.4) @@ -435,18 +429,18 @@ importers: specifier: 'catalog:' version: 3.4.3(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.4))(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) devDependencies: + '@effect/openapi-generator': + specifier: 'catalog:' + version: 4.0.0-beta.65(@effect/platform-node@4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10))(effect@4.0.0-beta.65) '@tanstack/devtools-vite': specifier: 'catalog:' - version: 0.5.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 0.5.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/router-cli': specifier: 'catalog:' version: 1.166.25 '@tanstack/router-plugin': specifier: 'catalog:' - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - '@tim-smart/openapi-gen': - specifier: 'catalog:' - version: 0.4.13(patch_hash=36720013d0f70c201ce8f233e38a7b93fc9fce74a17f9bc4293c3cf891b4fdc6) + version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@types/node': specifier: 'catalog:' version: 25.2.3 @@ -461,10 +455,10 @@ importers: version: 1.0.2 '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.0.18(bufferutil@4.1.0)(playwright@1.58.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18) babel-plugin-react-compiler: specifier: 'catalog:' version: 1.0.0 @@ -482,13 +476,13 @@ importers: version: 5.9.3 vite: specifier: 'catalog:' - version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) vitest-browser-react: specifier: 'catalog:' version: 2.0.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18) @@ -498,24 +492,18 @@ importers: '@base-ui/react': specifier: 'catalog:' version: 1.2.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@effect-atom/atom-react': - specifier: 'catalog:' - version: 0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4)(scheduler@0.27.0) - '@effect/experimental': - specifier: 'catalog:' - version: 0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - '@effect/platform': + '@effect/atom-react': specifier: 'catalog:' - version: 0.94.4(effect@3.19.16) + version: 4.0.0-beta.65(effect@4.0.0-beta.65)(react@19.2.4)(scheduler@0.27.0) '@effect/platform-node': specifier: 'catalog:' - version: 0.104.1(@effect/cluster@0.56.1(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(bufferutil@4.1.0)(effect@3.19.16)(utf-8-validate@5.0.10) + version: 4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10) '@ledgerhq/wallet-api-client': specifier: 'catalog:' - version: 1.13.0(@ton/crypto@3.3.0) + version: 1.13.0 '@lucas-barake/effect-form-react': specifier: 'catalog:' - version: 0.24.0(@effect-atom/atom-react@0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4)(scheduler@0.27.0))(@effect-atom/atom@0.5.1(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4) + version: 0.24.0(patch_hash=19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05)(effect@4.0.0-beta.65)(react@19.2.4) '@reown/appkit': specifier: 'catalog:' version: 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) @@ -527,10 +515,10 @@ importers: version: 0.0.61 '@tailwindcss/vite': specifier: 'catalog:' - version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/react-devtools': specifier: 'catalog:' - version: 0.9.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(solid-js@1.9.11)(utf-8-validate@5.0.10) + version: 0.9.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@5.0.10) '@tanstack/react-query': specifier: 'catalog:' version: 5.90.21(react@19.2.4) @@ -554,7 +542,7 @@ importers: version: 2.1.1 effect: specifier: 'catalog:' - version: 3.19.16 + version: 4.0.0-beta.65 lucide-react: specifier: 'catalog:' version: 0.564.0(react@19.2.4) @@ -583,18 +571,18 @@ importers: specifier: 'catalog:' version: 3.4.3(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.4))(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) devDependencies: + '@effect/openapi-generator': + specifier: 'catalog:' + version: 4.0.0-beta.65(@effect/platform-node@4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10))(effect@4.0.0-beta.65) '@tanstack/devtools-vite': specifier: 'catalog:' - version: 0.5.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 0.5.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/router-cli': specifier: 'catalog:' version: 1.166.25 '@tanstack/router-plugin': specifier: 'catalog:' - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - '@tim-smart/openapi-gen': - specifier: 'catalog:' - version: 0.4.13(patch_hash=36720013d0f70c201ce8f233e38a7b93fc9fce74a17f9bc4293c3cf891b4fdc6) + version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@types/node': specifier: 'catalog:' version: 25.2.3 @@ -609,10 +597,10 @@ importers: version: 1.0.2 '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.0.18(bufferutil@4.1.0)(playwright@1.58.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18) babel-plugin-react-compiler: specifier: 'catalog:' version: 1.0.0 @@ -630,13 +618,13 @@ importers: version: 5.9.3 vite: specifier: 'catalog:' - version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) vitest-browser-react: specifier: 'catalog:' version: 2.0.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18) @@ -948,90 +936,36 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - '@effect-atom/atom-react@0.5.0': - resolution: {integrity: sha512-aFfjWi4rEJCqfM12Oi36/EKaDm/W6n4/N6yM5vL0t/QozKhJhK05rQL/GY4XMxlH2eqkQ4ih8jBQa3Yyp0Fiqw==} + '@effect/atom-react@4.0.0-beta.65': + resolution: {integrity: sha512-QU8U4qXzMcPPd484px7SIFxyt7dybR7KcMqA6xilAvqRVE1O7wzOtayfejw/NPTKTFEvy94z8c1w53Wk6PcIaw==} peerDependencies: - effect: ^3.19 - react: '>=18 <20' + effect: ^4.0.0-beta.65 + react: ^19.2.4 scheduler: '*' - '@effect-atom/atom@0.5.1': - resolution: {integrity: sha512-3GKvEWsM887SXUvHM0t9k+msgAYRG7eGLH0b/AaZ033ozK1qMB69eQxtXnHg+SuJUgv9KCfX0XD6i6UmYXas5Q==} - peerDependencies: - '@effect/experimental': ^0.58.0 - '@effect/platform': ^0.94.2 - '@effect/rpc': ^0.73.0 - effect: ^3.19.15 - - '@effect/cluster@0.56.1': - resolution: {integrity: sha512-gnrsH6kfrUjn+82j/bw1IR4yFqJqV8tc7xZvrbJPRgzANycc6K1hu3LMg548uYbUkTzD8YYyqrSatMO1mkQpzw==} - peerDependencies: - '@effect/platform': ^0.94.1 - '@effect/rpc': ^0.73.0 - '@effect/sql': ^0.49.0 - '@effect/workflow': ^0.16.0 - effect: ^3.19.14 - - '@effect/experimental@0.58.0': - resolution: {integrity: sha512-IEP9sapjF6rFy5TkoqDPc86st/fnqUfjT7Xa3pWJrFGr1hzaMXHo+mWsYOZS9LAOVKnpHuVziDK97EP5qsCHVA==} - peerDependencies: - '@effect/platform': ^0.94.0 - effect: ^3.19.13 - ioredis: ^5 - lmdb: ^3 - peerDependenciesMeta: - ioredis: - optional: true - lmdb: - optional: true - - '@effect/language-service@0.73.1': - resolution: {integrity: sha512-FbOKzXmP1QM6/YMvDFZGTZ0Gk0AjKqRSY48dpAN0zUdVzq5xV/Us/6vZ5FcdmG6GjgSWP2rpESy59OMvfPeylw==} + '@effect/language-service@0.85.1': + resolution: {integrity: sha512-EXnJjIy6zQ3nUO/MZ+ynWUb8B895KZPotd1++oTs9JjDkplwM7cb6zo8Zq2zU6piwq+KflO7amXbEfj1UMpHkw==} hasBin: true - '@effect/platform-node-shared@0.57.1': - resolution: {integrity: sha512-oX/bApMdoKsyrDiNdJxo7U9Rz1RXsjRv+ecfAPp1qGlSdGIo32wVRvJ2XCHqYj0sqaYJS0pU0/GCulRfVGuJag==} - peerDependencies: - '@effect/cluster': ^0.56.1 - '@effect/platform': ^0.94.2 - '@effect/rpc': ^0.73.0 - '@effect/sql': ^0.49.0 - effect: ^3.19.15 - - '@effect/platform-node@0.104.1': - resolution: {integrity: sha512-jT1a/z98niK6fnEU8pWHPPCdJMVDRCIdB65lolcOjse5rsTwVbczMjvKkhVQpF63mNWoOnol7OTRNkw5L54llg==} - peerDependencies: - '@effect/cluster': ^0.56.1 - '@effect/platform': ^0.94.2 - '@effect/rpc': ^0.73.0 - '@effect/sql': ^0.49.0 - effect: ^3.19.15 - - '@effect/platform@0.94.4': - resolution: {integrity: sha512-mK8pbskFAcBRA5Ooyt02kCBuWltZakyaDcM4ByTY0jXQMFC3NUveNK62JVH7XB+f3XZ8OoBBxUnlLben4plEKQ==} - peerDependencies: - effect: ^3.19.16 - - '@effect/rpc@0.73.0': - resolution: {integrity: sha512-iMPf6tTriz8sK0l5x4koFId8Hz5nFptHYg8WqyjHGIIVLTpZxuiSqhmXZG7FnAs5N2n6uCEws4wWGcIgXNUrFg==} + '@effect/openapi-generator@4.0.0-beta.65': + resolution: {integrity: sha512-LrBwafVP3Acn/ypll11VPUGoN5y3f1QQ+sRXyPvBr7bCSggnL8fkWSt4wHOhxJun2SobLT84VXQlOhvfgEJbfA==} + hasBin: true peerDependencies: - '@effect/platform': ^0.94.0 - effect: ^3.19.13 + '@effect/platform-node': ^4.0.0-beta.65 + effect: ^4.0.0-beta.65 - '@effect/sql@0.49.0': - resolution: {integrity: sha512-9UEKR+z+MrI/qMAmSvb/RiD9KlgIazjZUCDSpwNgm0lEK9/Q6ExEyfziiYFVCPiptp52cBw8uBHRic8hHnwqXA==} + '@effect/platform-node-shared@4.0.0-beta.65': + resolution: {integrity: sha512-3rY8F3WLEax6Hj08GI/OvDIH+KqjfxH7RM2bAMfgR75NgRmwDtny1P49PtPkoRjH5dcdtThThtsvE4X9OTZkpQ==} + engines: {node: '>=18.0.0'} peerDependencies: - '@effect/experimental': ^0.58.0 - '@effect/platform': ^0.94.0 - effect: ^3.19.13 + effect: ^4.0.0-beta.65 - '@effect/workflow@0.16.0': - resolution: {integrity: sha512-MiAdlxx3TixkgHdbw+Yf1Z3tHAAE0rOQga12kIydJqj05Fnod+W/I+kQGRMY/XWRg+QUsVxhmh1qTr7Ype6lrw==} + '@effect/platform-node@4.0.0-beta.65': + resolution: {integrity: sha512-QQy3KRcMwP0TngQdfQGl2u1zp03B7k7DuF5SNS8aZhD0dDBpKZpCwFad1ODY5qdY3ycPgMwBwKRRK7y/aw0C9w==} + engines: {node: '>=18.0.0'} peerDependencies: - '@effect/experimental': ^0.58.0 - '@effect/platform': ^0.94.0 - '@effect/rpc': ^0.73.0 - effect: ^3.19.13 + effect: ^4.0.0-beta.65 + ioredis: ^5.7.0 '@emnapi/runtime@1.8.1': resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} @@ -1201,6 +1135,9 @@ packages: '@noble/hashes': optional: true + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + '@floating-ui/core@1.7.4': resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} @@ -1381,7 +1318,7 @@ packages: '@lucas-barake/effect-form-react@0.24.0': resolution: {integrity: sha512-R56dOtTLL5a6pZ9QK8AkDtsPZWC/ZbaDpcMU8BvvcdW8f50ufvbiloOpBy+KwqjVH/MsmQkjm9RFWVg9Uj79/Q==} peerDependencies: - '@effect-atom/atom': 0.5.1 + '@effect-atom/atom': ^0.5.0 '@effect-atom/atom-react': ^0.5.0 effect: ^3.19.15 react: ^18.0.0 || ^19.0.0 @@ -1389,7 +1326,7 @@ packages: '@lucas-barake/effect-form@0.23.0': resolution: {integrity: sha512-USH/P45v/xlCSVXx5xhlsAlEYlxUxLwwrFp14Kvs0v0VaLY1SJOI3VBVtX3NGDXv5VMMEHV7lDgL3xtpyMwj8g==} peerDependencies: - '@effect-atom/atom': 0.5.1 + '@effect-atom/atom': ^0.5.0 effect: ^3.19.15 '@msgpack/msgpack@3.1.2': @@ -1477,94 +1414,6 @@ packages: '@noble/secp256k1@1.7.1': resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} - '@parcel/watcher-android-arm64@2.5.6': - resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - - '@parcel/watcher-darwin-arm64@2.5.6': - resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - - '@parcel/watcher-darwin-x64@2.5.6': - resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - - '@parcel/watcher-freebsd-x64@2.5.6': - resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - - '@parcel/watcher-linux-arm-glibc@2.5.6': - resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@parcel/watcher-linux-arm-musl@2.5.6': - resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - libc: [musl] - - '@parcel/watcher-linux-arm64-glibc@2.5.6': - resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@parcel/watcher-linux-arm64-musl@2.5.6': - resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@parcel/watcher-linux-x64-glibc@2.5.6': - resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@parcel/watcher-linux-x64-musl@2.5.6': - resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@parcel/watcher-win32-arm64@2.5.6': - resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - - '@parcel/watcher-win32-ia32@2.5.6': - resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - - '@parcel/watcher-win32-x64@2.5.6': - resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - - '@parcel/watcher@2.5.6': - resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} - engines: {node: '>= 10.0.0'} - '@phosphor-icons/webcomponents@2.1.5': resolution: {integrity: sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q==} @@ -1574,6 +1423,16 @@ packages: '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/config@0.22.0': + resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} + + '@redocly/openapi-core@1.34.14': + resolution: {integrity: sha512-y+xFx+Zz54Xhr8jUdnLENYnt7Y7GEDL6Q03ga7rTtX8DVwefX9H+hQEPgJp1nda7vdH+wJ9/HBVvyfBuW9x6rA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@reown/appkit-adapter-wagmi@1.8.18': resolution: {integrity: sha512-6FaSRG6I7GBFzqsLrVDs8369B9SgC3rw+zz+CEjfw4o+I1zeOoIt/MupO7dv1FkxM48wgeCrTD/hGSDPKv0vtw==} peerDependencies: @@ -1601,8 +1460,6 @@ packages: '@reown/appkit-utils@1.8.18': resolution: {integrity: sha512-wB49IwYrhon7ZnLIA70Af9E2zV2U3aUm8fZWDwnU9Sx8cagHCXoMPXt6/SH/plvU3EKgplkiOXqfwc7QmV5UEQ==} - peerDependencies: - valtio: 2.1.7 '@reown/appkit-wallet@1.8.18': resolution: {integrity: sha512-1FWTkh269iBm2XzN0plHFIgIM1wMUmXrdeNmQK3NcJvGHpZ1YO1z2zFHTkWCPFVMZCHoQH28fcP6Aobq1FuFbA==} @@ -2339,8 +2196,6 @@ packages: '@tanstack/devtools-ui@0.4.4': resolution: {integrity: sha512-5xHXFyX3nom0UaNfiOM92o6ziaHjGo3mcSGe2HD5Xs8dWRZNpdZ0Smd0B9ddEhy0oB+gXyMzZgUJb9DmrZV0Mg==} engines: {node: '>=18'} - peerDependencies: - solid-js: '>=1.9.7' '@tanstack/devtools-vite@0.5.1': resolution: {integrity: sha512-5dXxMznSxx8NNpO9IbDC011sIdvTVvsoLaLAxm69dgDAX0+2OB8gdXrQp8dnzeNMvszKCgRxI2cgr/pjPgmnNw==} @@ -2351,8 +2206,6 @@ packages: '@tanstack/devtools@0.10.6': resolution: {integrity: sha512-STB3pS49gPoe7UHgDshOMkWPXPZmezsQBLkCrh6l+mcsRs+/Jk1OvfVF8HspiMA1RTuNRkTeGXZDA8LoGWmxyQ==} engines: {node: '>=18'} - peerDependencies: - solid-js: '>=1.9.7' '@tanstack/history@1.154.14': resolution: {integrity: sha512-xyIfof8eHBuub1CkBnbKNKQXeRZC4dClhmzePHVOEel4G7lk/dW+TQ16da7CFdeNLv6u6Owf5VoBQxoo6DFTSA==} @@ -2486,21 +2339,11 @@ packages: engines: {node: '>=20.19'} hasBin: true - '@tim-smart/openapi-gen@0.4.13': - resolution: {integrity: sha512-yn/4Tp6Or5JA2/VNPLKtm9ib17PZxmJGyEq+vtcmAch5qG2PAJLvuzuoAwYRBMN9GR8Cb/W5qO6eIHg0AdYL0Q==} - hasBin: true - '@ton/core@0.62.1': resolution: {integrity: sha512-RaEGBo9gCf6ZHyS8SKq1K53pswvYW9E5A6vwUuzFBTRX14g4qMDlB9F+fq4aBE5kN7XyVr8ScQtOJfQj41usCw==} peerDependencies: '@ton/crypto': '>=3.2.0' - '@ton/crypto-primitives@2.1.0': - resolution: {integrity: sha512-PQesoyPgqyI6vzYtCXw4/ZzevePc4VGcJtFwf08v10OevVJHVfW238KBdpj1kEDQkxWLeuNHEpTECNFKnP6tow==} - - '@ton/crypto@3.3.0': - resolution: {integrity: sha512-/A6CYGgA/H36OZ9BbTaGerKtzWp50rg67ZCH2oIjV1NcrBaCK9Z343M+CxedvM7Haf3f/Ee9EhxyeTp0GKMUpA==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2772,6 +2615,10 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2833,6 +2680,9 @@ packages: babel-plugin-react-compiler@1.0.0: resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} @@ -2874,6 +2724,9 @@ packages: borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + brace-expansion@2.1.0: + resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -2951,6 +2804,9 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2970,6 +2826,9 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} @@ -3017,6 +2876,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -3215,8 +3077,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - effect@3.19.16: - resolution: {integrity: sha512-7+XC3vGrbAhCHd8LTFHvnZjRpZKZ8YHRZqJTkpNoxcJ2mCyNs2SwI+6VkV/ij8Y3YW7wfBN4EbU06/F5+m/wkQ==} + effect@4.0.0-beta.65: + resolution: {integrity: sha512-QYKvQPAj3CmtsvWkHQww15wX4KG2gNsszDWEcOO5sZCMknp66u6Si/Opmt3wwWCwsyvRmDAdIg+JIz5qzbbFIw==} electron-to-chromium@1.5.286: resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} @@ -3267,6 +3129,9 @@ packages: es-toolkit@1.39.3: resolution: {integrity: sha512-Qb/TCFCldgOy8lZ5uC7nLGdqJwSabkQiYQShmw4jyiPk1pZzaYWTwaYKYP7EgLccWYgZocMrtItrwh683voaww==} + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} @@ -3311,13 +3176,16 @@ packages: resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} engines: {node: '> 0.1.90'} - fast-check@3.23.2: - resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} - engines: {node: '>=8.0.0'} + fast-check@4.7.0: + resolution: {integrity: sha512-NsZRtqvSSoCP0HbNjUD+r1JH8zqZalyp6gLY9e7OYs7NK9b6AHOs2baBFeBG7bVNsuoukh89x2Yg3rPsul8ziQ==} + engines: {node: '>=12.17.0'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-stable-stringify@1.0.0: resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} @@ -3365,11 +3233,6 @@ packages: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3466,6 +3329,9 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} @@ -3500,6 +3366,10 @@ packages: import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3507,6 +3377,10 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -3618,6 +3492,10 @@ packages: jose@6.1.3: resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3645,6 +3523,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -3653,9 +3534,6 @@ packages: engines: {node: '>=6'} hasBin: true - jssha@3.2.0: - resolution: {integrity: sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q==} - keyvaluestorage-interface@1.0.0: resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} @@ -3840,9 +3718,9 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} + mime@4.1.0: + resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} + engines: {node: '>=16'} hasBin: true minimalistic-assert@1.0.1: @@ -3851,6 +3729,10 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -3873,8 +3755,8 @@ packages: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true - msgpackr@1.11.8: - resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==} + msgpackr@1.11.12: + resolution: {integrity: sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg==} multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} @@ -3887,8 +3769,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} @@ -3913,6 +3796,9 @@ packages: node-mock-http@1.0.4: resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -3924,6 +3810,22 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + + oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + + oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + + oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + + oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -3954,6 +3856,12 @@ packages: resolution: {integrity: sha512-P1CtNLgN3trqm/Y0TYMS33gjGaDvip81z5wtxwUhGDym9jV46F9jDX0VG9mqjg+zJIF2JBm9yDB4oljzwSndDA==} hasBin: true + openapi-typescript@7.13.0: + resolution: {integrity: sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==} + hasBin: true + peerDependencies: + typescript: ^5.x + os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} @@ -4016,6 +3924,10 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + parse5@8.0.0: resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} @@ -4065,15 +3977,9 @@ packages: resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} engines: {node: '>=10'} - playwright-core@1.58.0: - resolution: {integrity: sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==} - engines: {node: '>=18'} - hasBin: true - - playwright@1.58.0: - resolution: {integrity: sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==} - engines: {node: '>=18'} - hasBin: true + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} @@ -4125,8 +4031,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pure-rand@8.4.0: + resolution: {integrity: sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A==} qrcode@1.5.3: resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} @@ -4311,6 +4217,24 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} + should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + + should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + + should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + + should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + + should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + + should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -4404,10 +4328,18 @@ packages: resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} engines: {node: '>=14.0.0'} + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -4473,6 +4405,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toml@4.1.1: + resolution: {integrity: sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw==} + engines: {node: '>=20'} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -4539,8 +4475,9 @@ packages: tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} - tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} @@ -4575,14 +4512,14 @@ packages: undici-types@7.21.0: resolution: {integrity: sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==} - undici@7.19.2: - resolution: {integrity: sha512-4VQSpGEGsWzk0VYxyB/wVX/Q7qf9t5znLRgs0dzszr9w9Fej/8RVNQ+S20vdXSAyra/bJ7ZQfGv6ZMj7UEbzSg==} - engines: {node: '>=20.18.1'} - undici@7.20.0: resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==} engines: {node: '>=20.18.1'} + undici@8.2.0: + resolution: {integrity: sha512-Z+4Hx9GE26Lh9Upwfnc8C7SsrpBPGaM/Gm6kMFtiG7c+5IvQKlXi/t+9x9DrrCh29cww5TSP9YdVaBcnLDs5fQ==} + engines: {node: '>=22.19.0'} + unplugin@2.3.11: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} @@ -4655,6 +4592,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + url@0.11.4: resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} engines: {node: '>= 0.4'} @@ -4679,12 +4619,13 @@ packages: util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + uuid@13.0.2: + resolution: {integrity: sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==} hasBin: true uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@9.0.1: @@ -4907,6 +4848,18 @@ packages: utf-8-validate: optional: true + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -4928,12 +4881,19 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + yaml@2.2.2: resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} engines: {node: '>= 14'} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true @@ -5044,7 +5004,7 @@ snapshots: '@babel/types': 7.29.0 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -5138,7 +5098,7 @@ snapshots: '@babel/parser': 7.29.0 '@babel/template': 7.28.6 '@babel/types': 7.29.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -5152,31 +5112,6 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@base-org/account@2.4.0(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@coinbase/cdp-sdk': 1.44.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@noble/hashes': 1.4.0 - clsx: 1.2.1 - eventemitter3: 5.0.1 - idb-keyval: 6.2.1 - ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) - preact: 10.24.2 - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zustand: 5.0.3(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) - transitivePeerDependencies: - - '@types/react' - - bufferutil - - debug - - encoding - - fastestsmallesttextencoderdecoder - - immer - - react - - typescript - - use-sync-external-store - - utf-8-validate - - zod - optional: true - '@base-org/account@2.4.0(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@coinbase/cdp-sdk': 1.44.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -5417,97 +5352,38 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} - '@effect-atom/atom-react@0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4)(scheduler@0.27.0)': + '@effect/atom-react@4.0.0-beta.65(effect@4.0.0-beta.65)(react@19.2.4)(scheduler@0.27.0)': dependencies: - '@effect-atom/atom': 0.5.1(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16) - effect: 3.19.16 + effect: 4.0.0-beta.65 react: 19.2.4 scheduler: 0.27.0 - transitivePeerDependencies: - - '@effect/experimental' - - '@effect/platform' - - '@effect/rpc' - '@effect-atom/atom@0.5.1(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)': - dependencies: - '@effect/experimental': 0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - '@effect/platform': 0.94.4(effect@3.19.16) - '@effect/rpc': 0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - effect: 3.19.16 - - '@effect/cluster@0.56.1(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)': - dependencies: - '@effect/platform': 0.94.4(effect@3.19.16) - '@effect/rpc': 0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - '@effect/sql': 0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - '@effect/workflow': 0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16) - effect: 3.19.16 - kubernetes-types: 1.30.0 + '@effect/language-service@0.85.1': {} - '@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16)': + '@effect/openapi-generator@4.0.0-beta.65(@effect/platform-node@4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10))(effect@4.0.0-beta.65)': dependencies: - '@effect/platform': 0.94.4(effect@3.19.16) - effect: 3.19.16 - uuid: 11.1.0 + '@effect/platform-node': 4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10) + effect: 4.0.0-beta.65 - '@effect/language-service@0.73.1': {} - - '@effect/platform-node-shared@0.57.1(@effect/cluster@0.56.1(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(bufferutil@4.1.0)(effect@3.19.16)(utf-8-validate@5.0.10)': + '@effect/platform-node-shared@4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10)': dependencies: - '@effect/cluster': 0.56.1(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16) - '@effect/platform': 0.94.4(effect@3.19.16) - '@effect/rpc': 0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - '@effect/sql': 0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - '@parcel/watcher': 2.5.6 - effect: 3.19.16 - multipasta: 0.2.7 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@types/ws': 8.18.1 + effect: 4.0.0-beta.65 + ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node@0.104.1(@effect/cluster@0.56.1(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(bufferutil@4.1.0)(effect@3.19.16)(utf-8-validate@5.0.10)': + '@effect/platform-node@4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10)': dependencies: - '@effect/cluster': 0.56.1(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16) - '@effect/platform': 0.94.4(effect@3.19.16) - '@effect/platform-node-shared': 0.57.1(@effect/cluster@0.56.1(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(bufferutil@4.1.0)(effect@3.19.16)(utf-8-validate@5.0.10) - '@effect/rpc': 0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - '@effect/sql': 0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - effect: 3.19.16 - mime: 3.0.0 - undici: 7.19.2 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@effect/platform-node-shared': 4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10) + effect: 4.0.0-beta.65 + mime: 4.1.0 + undici: 8.2.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform@0.94.4(effect@3.19.16)': - dependencies: - effect: 3.19.16 - find-my-way-ts: 0.1.6 - msgpackr: 1.11.8 - multipasta: 0.2.7 - - '@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16)': - dependencies: - '@effect/platform': 0.94.4(effect@3.19.16) - effect: 3.19.16 - msgpackr: 1.11.8 - - '@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16)': - dependencies: - '@effect/experimental': 0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - '@effect/platform': 0.94.4(effect@3.19.16) - effect: 3.19.16 - uuid: 11.1.0 - - '@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)': - dependencies: - '@effect/experimental': 0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - '@effect/platform': 0.94.4(effect@3.19.16) - '@effect/rpc': 0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16) - effect: 3.19.16 - '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 @@ -5595,6 +5471,8 @@ snapshots: optionalDependencies: '@noble/hashes': 2.0.1 + '@exodus/schemasafe@1.3.0': {} + '@floating-ui/core@1.7.4': dependencies: '@floating-ui/utils': 0.2.10 @@ -5724,20 +5602,20 @@ snapshots: '@ledgerhq/logs@6.14.0': {} - '@ledgerhq/wallet-api-client@1.13.0(@ton/crypto@3.3.0)': + '@ledgerhq/wallet-api-client@1.13.0': dependencies: '@ledgerhq/hw-transport': 6.32.0 - '@ledgerhq/wallet-api-core': 1.28.0(@ton/crypto@3.3.0) + '@ledgerhq/wallet-api-core': 1.28.0 bignumber.js: 9.3.1 transitivePeerDependencies: - '@ton/crypto' - encoding - '@ledgerhq/wallet-api-core@1.28.0(@ton/crypto@3.3.0)': + '@ledgerhq/wallet-api-core@1.28.0': dependencies: '@ledgerhq/errors': 6.29.0 '@stacks/transactions': 6.17.0 - '@ton/core': 0.62.1(@ton/crypto@3.3.0) + '@ton/core': 0.62.1 bignumber.js: 9.3.1 uuid: 9.0.1 zod: 3.25.76 @@ -5756,18 +5634,15 @@ snapshots: dependencies: '@lit-labs/ssr-dom-shim': 1.5.1 - '@lucas-barake/effect-form-react@0.24.0(@effect-atom/atom-react@0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4)(scheduler@0.27.0))(@effect-atom/atom@0.5.1(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4)': + '@lucas-barake/effect-form-react@0.24.0(patch_hash=19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05)(effect@4.0.0-beta.65)(react@19.2.4)': dependencies: - '@effect-atom/atom': 0.5.1(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16) - '@effect-atom/atom-react': 0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)(react@19.2.4)(scheduler@0.27.0) - '@lucas-barake/effect-form': 0.23.0(@effect-atom/atom@0.5.1(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16) - effect: 3.19.16 + '@lucas-barake/effect-form': 0.23.0(patch_hash=4f4cbbb31f1466c5d108c52532d9dd5b21ce6cff1d6b86b2d96d8eb4e9dbe863)(effect@4.0.0-beta.65) + effect: 4.0.0-beta.65 react: 19.2.4 - '@lucas-barake/effect-form@0.23.0(@effect-atom/atom@0.5.1(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16))(effect@3.19.16)': + '@lucas-barake/effect-form@0.23.0(patch_hash=4f4cbbb31f1466c5d108c52532d9dd5b21ce6cff1d6b86b2d96d8eb4e9dbe863)(effect@4.0.0-beta.65)': dependencies: - '@effect-atom/atom': 0.5.1(@effect/experimental@0.58.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(@effect/platform@0.94.4(effect@3.19.16))(@effect/rpc@0.73.0(@effect/platform@0.94.4(effect@3.19.16))(effect@3.19.16))(effect@3.19.16) - effect: 3.19.16 + effect: 4.0.0-beta.65 '@msgpack/msgpack@3.1.2': {} @@ -5831,66 +5706,6 @@ snapshots: '@noble/secp256k1@1.7.1': {} - '@parcel/watcher-android-arm64@2.5.6': - optional: true - - '@parcel/watcher-darwin-arm64@2.5.6': - optional: true - - '@parcel/watcher-darwin-x64@2.5.6': - optional: true - - '@parcel/watcher-freebsd-x64@2.5.6': - optional: true - - '@parcel/watcher-linux-arm-glibc@2.5.6': - optional: true - - '@parcel/watcher-linux-arm-musl@2.5.6': - optional: true - - '@parcel/watcher-linux-arm64-glibc@2.5.6': - optional: true - - '@parcel/watcher-linux-arm64-musl@2.5.6': - optional: true - - '@parcel/watcher-linux-x64-glibc@2.5.6': - optional: true - - '@parcel/watcher-linux-x64-musl@2.5.6': - optional: true - - '@parcel/watcher-win32-arm64@2.5.6': - optional: true - - '@parcel/watcher-win32-ia32@2.5.6': - optional: true - - '@parcel/watcher-win32-x64@2.5.6': - optional: true - - '@parcel/watcher@2.5.6': - dependencies: - detect-libc: 2.1.2 - is-glob: 4.0.3 - node-addon-api: 7.1.1 - picomatch: 4.0.3 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.6 - '@parcel/watcher-darwin-arm64': 2.5.6 - '@parcel/watcher-darwin-x64': 2.5.6 - '@parcel/watcher-freebsd-x64': 2.5.6 - '@parcel/watcher-linux-arm-glibc': 2.5.6 - '@parcel/watcher-linux-arm-musl': 2.5.6 - '@parcel/watcher-linux-arm64-glibc': 2.5.6 - '@parcel/watcher-linux-arm64-musl': 2.5.6 - '@parcel/watcher-linux-x64-glibc': 2.5.6 - '@parcel/watcher-linux-x64-musl': 2.5.6 - '@parcel/watcher-win32-arm64': 2.5.6 - '@parcel/watcher-win32-ia32': 2.5.6 - '@parcel/watcher-win32-x64': 2.5.6 - '@phosphor-icons/webcomponents@2.1.5': dependencies: lit: 3.3.0 @@ -5901,78 +5716,45 @@ snapshots: dependencies: quansync: 1.0.0 - '@reown/appkit-adapter-wagmi@1.8.18(9ee7863b275c29e516ad5604625576cd)': + '@redocly/ajv@8.11.2': dependencies: - '@reown/appkit': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-polyfills': 1.8.18 - '@reown/appkit-scaffold-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) - '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) - '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@wagmi/core': 3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - valtio: 2.1.7(@types/react@19.2.14)(react@19.2.4) - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - wagmi: 3.4.3(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.4))(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - optionalDependencies: - '@wagmi/connectors': 7.1.7(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/config@0.22.0': {} + + '@redocly/openapi-core@1.34.14(supports-color@10.2.2)': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.0 + colorette: 1.4.0 + https-proxy-agent: 7.0.6(supports-color@10.2.2) + js-levenshtein: 1.1.6 + js-yaml: 4.1.1 + minimatch: 5.1.9 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@base-org/account' - - '@capacitor/preferences' - - '@coinbase/wallet-sdk' - - '@deno/kv' - - '@gemini-wallet/core' - - '@metamask/sdk' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@safe-global/safe-apps-provider' - - '@safe-global/safe-apps-sdk' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - '@walletconnect/ethereum-provider' - - aws4fetch - - bufferutil - - db0 - - debug - - encoding - - fastestsmallesttextencoderdecoder - - immer - - ioredis - - porto - - react - - typescript - - uploadthing - - use-sync-external-store - - utf-8-validate - - zod + - supports-color - '@reown/appkit-adapter-wagmi@1.8.18(f99347586472b17ffe6b100465a31bdf)': + '@reown/appkit-adapter-wagmi@1.8.18(9ee7863b275c29e516ad5604625576cd)': dependencies: - '@reown/appkit': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-polyfills': 1.8.18 - '@reown/appkit-scaffold-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) - '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-scaffold-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@wagmi/core': 3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/core': 3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 2.1.7(@types/react@19.2.14)(react@19.2.4) viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: 3.4.3(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.4))(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) optionalDependencies: - '@wagmi/connectors': 7.1.7(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/connectors': 7.1.7(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6070,52 +5852,12 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-pay@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) - lit: 3.3.0 - valtio: 2.1.7(@types/react@19.2.14)(react@19.2.4) - 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 - - debug - - encoding - - fastestsmallesttextencoderdecoder - - immer - - ioredis - - react - - typescript - - uploadthing - - use-sync-external-store - - utf-8-validate - - zod - '@reown/appkit-pay@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) lit: 3.3.0 valtio: 2.1.7(@types/react@19.2.14)(react@19.2.4) transitivePeerDependencies: @@ -6154,55 +5896,13 @@ snapshots: dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76)': - dependencies: - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-pay': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) - '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - lit: 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' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - debug - - encoding - - fastestsmallesttextencoderdecoder - - immer - - ioredis - - react - - typescript - - uploadthing - - use-sync-external-store - - utf-8-validate - - valtio - - zod - - '@reown/appkit-scaffold-ui@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76)': + '@reown/appkit-scaffold-ui@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-pay': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) lit: 3.3.0 transitivePeerDependencies: @@ -6235,7 +5935,6 @@ snapshots: - uploadthing - use-sync-external-store - utf-8-validate - - valtio - zod '@reown/appkit-ui@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': @@ -6274,54 +5973,7 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76)': - dependencies: - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-polyfills': 1.8.18 - '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@wallet-standard/wallet': 1.1.0 - '@walletconnect/logger': 3.0.2 - '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - valtio: 2.1.7(@types/react@19.2.14)(react@19.2.4) - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - optionalDependencies: - '@base-org/account': 2.4.0(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - 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 - - debug - - encoding - - fastestsmallesttextencoderdecoder - - immer - - ioredis - - react - - typescript - - uploadthing - - use-sync-external-store - - utf-8-validate - - zod - - '@reown/appkit-utils@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76)': + '@reown/appkit-utils@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -6379,64 +6031,15 @@ snapshots: - typescript - utf-8-validate - '@reown/appkit@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-pay': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-polyfills': 1.8.18 - '@reown/appkit-scaffold-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) - '@reown/appkit-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) - '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - bs58: 6.0.0 - semver: 7.7.2 - valtio: 2.1.7(@types/react@19.2.14)(react@19.2.4) - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - optionalDependencies: - '@lit/react': 1.0.8(@types/react@19.2.14) - 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 - - debug - - encoding - - fastestsmallesttextencoderdecoder - - immer - - ioredis - - react - - typescript - - uploadthing - - use-sync-external-store - - utf-8-validate - - zod - '@reown/appkit@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-pay': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-polyfills': 1.8.18 - '@reown/appkit-scaffold-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-scaffold-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) bs58: 6.0.0 @@ -7259,12 +6862,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) '@tanstack/devtools-client@0.0.5': dependencies: @@ -7279,7 +6882,7 @@ snapshots: '@tanstack/devtools-event-client@0.4.0': {} - '@tanstack/devtools-ui@0.4.4(csstype@3.2.3)(solid-js@1.9.11)': + '@tanstack/devtools-ui@0.4.4(csstype@3.2.3)': dependencies: clsx: 2.1.1 goober: 2.1.18(csstype@3.2.3) @@ -7287,7 +6890,7 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/devtools-vite@0.5.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/devtools-vite@0.5.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 @@ -7299,20 +6902,20 @@ snapshots: chalk: 5.6.2 launch-editor: 2.12.0 picomatch: 4.0.3 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@tanstack/devtools@0.10.6(bufferutil@4.1.0)(csstype@3.2.3)(solid-js@1.9.11)(utf-8-validate@5.0.10)': + '@tanstack/devtools@0.10.6(bufferutil@4.1.0)(csstype@3.2.3)(utf-8-validate@5.0.10)': dependencies: '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.11) '@solid-primitives/resize-observer': 2.1.3(solid-js@1.9.11) '@tanstack/devtools-client': 0.0.5 '@tanstack/devtools-event-bus': 0.4.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tanstack/devtools-ui': 0.4.4(csstype@3.2.3)(solid-js@1.9.11) + '@tanstack/devtools-ui': 0.4.4(csstype@3.2.3) clsx: 2.1.1 goober: 2.1.18(csstype@3.2.3) solid-js: 1.9.11 @@ -7327,9 +6930,9 @@ snapshots: '@tanstack/query-core@5.90.20': {} - '@tanstack/react-devtools@0.9.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(solid-js@1.9.11)(utf-8-validate@5.0.10)': + '@tanstack/react-devtools@0.9.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@5.0.10)': dependencies: - '@tanstack/devtools': 0.10.6(bufferutil@4.1.0)(csstype@3.2.3)(solid-js@1.9.11)(utf-8-validate@5.0.10) + '@tanstack/devtools': 0.10.6(bufferutil@4.1.0)(csstype@3.2.3)(utf-8-validate@5.0.10) '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) react: 19.2.4 @@ -7337,7 +6940,6 @@ snapshots: transitivePeerDependencies: - bufferutil - csstype - - solid-js - utf-8-validate '@tanstack/react-query@5.90.21(react@19.2.4)': @@ -7440,7 +7042,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -7457,7 +7059,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -7497,23 +7099,7 @@ snapshots: '@tanstack/virtual-file-routes@1.161.7': {} - '@tim-smart/openapi-gen@0.4.13(patch_hash=36720013d0f70c201ce8f233e38a7b93fc9fce74a17f9bc4293c3cf891b4fdc6)': - dependencies: - yaml: 2.8.2 - - '@ton/core@0.62.1(@ton/crypto@3.3.0)': - dependencies: - '@ton/crypto': 3.3.0 - - '@ton/crypto-primitives@2.1.0': - dependencies: - jssha: 3.2.0 - - '@ton/crypto@3.3.0': - dependencies: - '@ton/crypto-primitives': 2.1.0 - jssha: 3.2.0 - tweetnacl: 1.0.3 + '@ton/core@0.62.1': {} '@types/babel__core@7.20.5': dependencies: @@ -7586,7 +7172,6 @@ snapshots: '@types/ws@8.18.1': dependencies: '@types/node': 25.2.3 - optional: true '@vite-pwa/assets-generator@1.0.2': dependencies: @@ -7597,7 +7182,7 @@ snapshots: sharp-ico: 0.1.5 unconfig: 7.4.2 - '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -7605,33 +7190,32 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@vitest/browser-playwright@4.0.18(bufferutil@4.1.0)(playwright@1.58.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18)': + '@vitest/browser-playwright@4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18)': dependencies: - '@vitest/browser': 4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - playwright: 1.58.0 + '@vitest/browser': 4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18)': + '@vitest/browser@4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18)': dependencies: - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/utils': 4.0.18 magic-string: 0.30.21 pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -7648,13 +7232,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) '@vitest/pretty-format@4.0.18': dependencies: @@ -7678,15 +7262,6 @@ snapshots: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 - '@wagmi/connectors@7.1.7(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': - dependencies: - '@wagmi/core': 3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - optionalDependencies: - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - typescript: 5.9.3 - '@wagmi/connectors@7.1.7(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: '@wagmi/core': 3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) @@ -7695,7 +7270,6 @@ snapshots: '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) typescript: 5.9.3 - optional: true '@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: @@ -8071,6 +7645,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-colors@4.1.3: {} + ansi-regex@5.0.1: {} ansi-styles@4.3.0: @@ -8145,6 +7721,8 @@ snapshots: dependencies: '@babel/types': 7.28.6 + balanced-match@1.0.2: {} + base-x@3.0.11: dependencies: safe-buffer: 5.2.1 @@ -8181,6 +7759,10 @@ snapshots: text-encoding-utf-8: 1.0.2 optional: true + brace-expansion@2.1.0: + dependencies: + balanced-match: 1.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -8295,6 +7877,8 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + call-me-maybe@1.0.2: {} + callsites@3.1.0: {} camelcase@5.3.1: {} @@ -8305,6 +7889,8 @@ snapshots: chalk@5.6.2: {} + change-case@5.4.4: {} + charenc@0.0.2: optional: true @@ -8367,6 +7953,8 @@ snapshots: color-convert: 2.0.1 color-string: 1.9.1 + colorette@1.4.0: {} + colorette@2.0.20: {} combined-stream@1.0.8: @@ -8507,9 +8095,11 @@ snapshots: dayjs@1.11.13: {} - debug@4.4.3: + debug@4.4.3(supports-color@10.2.2): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 10.2.2 decamelize@1.2.0: {} @@ -8579,10 +8169,18 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - effect@3.19.16: + effect@4.0.0-beta.65: dependencies: '@standard-schema/spec': 1.1.0 - fast-check: 3.23.2 + fast-check: 4.7.0 + find-my-way-ts: 0.1.6 + ini: 6.0.0 + kubernetes-types: 1.30.0 + msgpackr: 1.11.12 + multipasta: 0.2.7 + toml: 4.1.1 + uuid: 13.0.2 + yaml: 2.9.0 electron-to-chromium@1.5.286: {} @@ -8633,6 +8231,8 @@ snapshots: es-toolkit@1.39.3: {} + es6-promise@3.3.1: {} + es6-promise@4.2.8: optional: true @@ -8694,12 +8294,14 @@ snapshots: eyes@0.1.8: optional: true - fast-check@3.23.2: + fast-check@4.7.0: dependencies: - pure-rand: 6.1.0 + pure-rand: 8.4.0 fast-deep-equal@3.1.3: {} + fast-safe-stringify@2.1.1: {} + fast-stable-stringify@1.0.0: optional: true @@ -8741,9 +8343,6 @@ snapshots: mime-types: 2.1.35 optional: true - fsevents@2.3.2: - optional: true - fsevents@2.3.3: optional: true @@ -8857,16 +8456,18 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color + http2-client@1.3.5: {} + https-browserify@1.0.0: {} - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@10.2.2): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -8893,10 +8494,14 @@ snapshots: import-meta-resolve@4.2.0: {} + index-to-position@1.2.0: {} + inherits@2.0.4: {} ini@4.1.1: {} + ini@6.0.0: {} + iron-webcrypto@1.2.1: {} is-arguments@1.2.0: @@ -9005,6 +8610,8 @@ snapshots: jose@6.1.3: optional: true + js-levenshtein@1.1.6: {} + js-tokens@4.0.0: {} js-yaml@4.1.1: @@ -9021,7 +8628,7 @@ snapshots: decimal.js: 10.6.0 html-encoding-sniffer: 6.0.0(@noble/hashes@2.0.1) http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + https-proxy-agent: 7.0.6(supports-color@10.2.2) is-potential-custom-element-name: 1.0.1 parse5: 8.0.0 saxes: 6.0.0 @@ -9043,13 +8650,13 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema-typed@8.0.2: {} + json-stringify-safe@5.0.1: optional: true json5@2.2.3: {} - jssha@3.2.0: {} - keyvaluestorage-interface@1.0.0: {} kubernetes-types@1.30.0: {} @@ -9208,12 +8815,16 @@ snapshots: mime-db: 1.52.0 optional: true - mime@3.0.0: {} + mime@4.1.0: {} minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.0 + minimist@1.2.8: {} mipd@0.0.7(typescript@5.9.3): @@ -9236,7 +8847,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 optional: true - msgpackr@1.11.8: + msgpackr@1.11.12: optionalDependencies: msgpackr-extract: 3.0.3 @@ -9246,7 +8857,9 @@ snapshots: nanoid@3.3.11: {} - node-addon-api@7.1.1: {} + node-fetch-h2@2.3.0: + dependencies: + http2-client: 1.3.5 node-fetch-native@1.6.7: {} @@ -9264,6 +8877,10 @@ snapshots: node-mock-http@1.0.4: {} + node-readfiles@0.2.0: + dependencies: + es6-promise: 3.3.1 + node-releases@2.0.27: {} node-stdlib-browser@1.3.1: @@ -9298,6 +8915,37 @@ snapshots: normalize-path@3.0.0: {} + oas-kit-common@1.0.8: + dependencies: + fast-safe-stringify: 2.1.1 + + oas-linter@3.2.2: + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.3 + + oas-resolver@2.5.6: + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.7.2 + + oas-schema-walker@1.1.5: {} + + oas-validator@5.0.8: + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.3 + object-inspect@1.13.4: {} object-is@1.1.6: @@ -9332,6 +8980,16 @@ snapshots: yaml: 2.2.2 yargs: 17.7.2 + openapi-typescript@7.13.0(typescript@5.9.3): + dependencies: + '@redocly/openapi-core': 1.34.14(supports-color@10.2.2) + ansi-colors: 4.1.3 + change-case: 5.4.4 + parse-json: 8.3.0 + supports-color: 10.2.2 + typescript: 5.9.3 + yargs-parser: 21.1.1 + os-browserify@0.3.0: {} ox@0.12.1(typescript@5.9.3)(zod@3.22.4): @@ -9433,6 +9091,12 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.29.0 + index-to-position: 1.2.0 + type-fest: 4.41.0 + parse5@8.0.0: dependencies: entities: 6.0.1 @@ -9488,13 +9152,7 @@ snapshots: dependencies: find-up: 5.0.0 - playwright-core@1.58.0: {} - - playwright@1.58.0: - dependencies: - playwright-core: 1.58.0 - optionalDependencies: - fsevents: 2.3.2 + pluralize@8.0.0: {} pngjs@5.0.0: {} @@ -9537,7 +9195,7 @@ snapshots: punycode@2.3.1: {} - pure-rand@6.1.0: {} + pure-rand@8.4.0: {} qrcode@1.5.3: dependencies: @@ -9767,6 +9425,32 @@ snapshots: shell-quote@1.8.3: {} + should-equal@2.0.0: + dependencies: + should-type: 1.4.0 + + should-format@3.0.3: + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + + should-type-adaptors@1.1.0: + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + + should-type@1.4.0: {} + + should-util@1.0.1: {} + + should@13.2.3: + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -9877,8 +9561,26 @@ snapshots: superstruct@2.0.2: optional: true + supports-color@10.2.2: {} + supports-preserve-symlinks-flag@1.0.0: {} + swagger2openapi@7.0.8: + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + symbol-tree@3.2.4: {} tabbable@6.4.0: {} @@ -9933,6 +9635,8 @@ snapshots: dependencies: is-number: 7.0.0 + toml@4.1.1: {} + totalist@3.0.1: {} tough-cookie@6.0.0: @@ -9987,7 +9691,7 @@ snapshots: tw-animate-css@1.4.0: {} - tweetnacl@1.0.3: {} + type-fest@4.41.0: {} typed-array-buffer@1.0.3: dependencies: @@ -10025,10 +9729,10 @@ snapshots: undici-types@7.21.0: optional: true - undici@7.19.2: {} - undici@7.20.0: {} + undici@8.2.0: {} + unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 @@ -10055,6 +9759,8 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + uri-js-replace@1.0.1: {} + url@0.11.4: dependencies: punycode: 1.4.1 @@ -10083,7 +9789,7 @@ snapshots: is-typed-array: 1.1.15 which-typed-array: 1.1.20 - uuid@11.1.0: {} + uuid@13.0.2: {} uuid@8.3.2: optional: true @@ -10135,15 +9841,15 @@ snapshots: - utf-8-validate - zod - vite-plugin-node-polyfills@0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-node-polyfills@0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.57.1) node-stdlib-browser: 1.3.1 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - rollup - vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -10157,21 +9863,21 @@ snapshots: jiti: 2.6.1 lightningcss: 1.30.2 tsx: 4.21.0 - yaml: 2.8.2 + yaml: 2.9.0 vitest-browser-react@2.0.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18): dependencies: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - vitest@4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -10188,11 +9894,11 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.2.3 - '@vitest/browser-playwright': 4.0.18(bufferutil@4.1.0)(playwright@1.58.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) + '@vitest/browser-playwright': 4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18) jsdom: 28.0.0(@noble/hashes@2.0.1) transitivePeerDependencies: - jiti @@ -10216,7 +9922,7 @@ snapshots: wagmi@3.4.3(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.4))(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)): dependencies: '@tanstack/react-query': 5.90.21(react@19.2.4) - '@wagmi/connectors': 7.1.7(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/connectors': 7.1.7(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) '@wagmi/core': 3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) react: 19.2.4 use-sync-external-store: 1.4.0(react@19.2.4) @@ -10302,6 +10008,11 @@ snapshots: bufferutil: 4.1.0 utf-8-validate: 5.0.10 + ws@8.20.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} @@ -10314,9 +10025,13 @@ snapshots: yallist@3.1.1: {} + yaml-ast-parser@0.0.43: {} + + yaml@1.10.3: {} + yaml@2.2.2: {} - yaml@2.8.2: {} + yaml@2.9.0: {} yargs-parser@18.1.3: dependencies: @@ -10367,13 +10082,6 @@ snapshots: react: 19.2.4 use-sync-external-store: 1.6.0(react@19.2.4) - zustand@5.0.3(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)): - optionalDependencies: - '@types/react': 19.2.14 - react: 19.2.4 - use-sync-external-store: 1.4.0(react@19.2.4) - optional: true - zustand@5.0.3(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): optionalDependencies: '@types/react': 19.2.14 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index bb660c0..bfc8131 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,11 +7,10 @@ catalog: '@biomejs/biome': ^2.3.15 '@commitlint/cli': ^20.4.1 '@commitlint/config-conventional': ^20.4.1 - '@effect-atom/atom-react': ^0.5.0 - '@effect/experimental': ^0.58.0 - '@effect/language-service': ^0.73.1 - '@effect/platform': ^0.94.4 - '@effect/platform-node': ^0.104.1 + '@effect/atom-react': ^4.0.0-beta.65 + '@effect/language-service': ^0.85.1 + '@effect/openapi-generator': ^4.0.0-beta.65 + '@effect/platform-node': ^4.0.0-beta.65 '@ledgerhq/wallet-api-client': ^1.13.0 '@lucas-barake/effect-form-react': ^0.24.0 '@nktkas/hyperliquid': ^0.31.0 @@ -27,7 +26,6 @@ catalog: '@tanstack/react-virtual': ^3.13.18 '@tanstack/router-cli': ^1.159.5 '@tanstack/router-plugin': ^1.159.5 - '@tim-smart/openapi-gen': ^0.4.13 '@types/node': ^25.2.3 '@types/react': ^19.2.14 '@types/react-dom': ^19.2.0 @@ -37,7 +35,7 @@ catalog: babel-plugin-react-compiler: ^1.0.0 class-variance-authority: ^0.7.1 clsx: ^2.1.1 - effect: ^3.19.16 + effect: ^4.0.0-beta.65 husky: ^9.1.7 jsdom: ^28.0.0 lucide-react: ^0.564.0 @@ -59,9 +57,7 @@ catalog: wagmi: ^3.4.3 nodeLinker: hoisted - -overrides: - '@effect-atom/atom': 0.5.1 - +autoInstallPeers: false patchedDependencies: - '@tim-smart/openapi-gen': patches/@tim-smart__openapi-gen.patch + '@lucas-barake/effect-form-react@0.24.0': patches/@lucas-barake__effect-form-react@0.24.0.patch + '@lucas-barake/effect-form@0.23.0': patches/@lucas-barake__effect-form@0.23.0.patch From 04aa9a51d99b0be93cdfeb5e596c09a2fd0f9024 Mon Sep 17 00:00:00 2001 From: Petar Todorovic Date: Fri, 15 May 2026 16:48:11 +0200 Subject: [PATCH 2/4] feat(embed): add embeddable perps packages --- .gitignore | 3 +- apps/dashboard-react-example/.env.example | 4 + apps/dashboard-react-example/index.html | 12 + apps/dashboard-react-example/package.json | 22 + apps/dashboard-react-example/src/main.tsx | 19 + apps/dashboard-react-example/src/styles.css | 14 + apps/dashboard-react-example/tsconfig.json | 7 + apps/dashboard-react-example/vite.config.ts | 6 + apps/dashboard-vanilla-example/.env.example | 4 + apps/dashboard-vanilla-example/index.html | 12 + apps/dashboard-vanilla-example/package.json | 16 + apps/dashboard-vanilla-example/src/main.js | 16 + apps/dashboard-vanilla-example/src/styles.css | 14 + apps/dashboard-vanilla-example/vite.config.js | 3 + apps/widget-react-example/.env.example | 4 + apps/widget-react-example/index.html | 12 + apps/widget-react-example/package.json | 22 + apps/widget-react-example/src/main.tsx | 20 + apps/widget-react-example/src/styles.css | 24 + apps/widget-react-example/tsconfig.json | 7 + apps/widget-react-example/vite.config.ts | 6 + apps/widget-vanilla-example/.env.example | 4 + apps/widget-vanilla-example/index.html | 12 + apps/widget-vanilla-example/package.json | 16 + apps/widget-vanilla-example/src/main.js | 17 + apps/widget-vanilla-example/src/styles.css | 24 + apps/widget-vanilla-example/vite.config.js | 3 + mise.lock | 37 + mise.toml | 4 +- package.json | 2 +- packages/common/package.json | 4 +- packages/common/src/atoms/actions-atoms.ts | 65 +- .../common/src/atoms/close-position-atoms.ts | 11 +- packages/common/src/atoms/config-atom.ts | 3 +- .../common/src/atoms/edit-position-atoms.ts | 27 +- .../external-lifecycle-event-listener.ts | 7 + .../src/atoms/external-wallet-source.ts | 6 + packages/common/src/atoms/index.ts | 6 + packages/common/src/atoms/markets-atoms.ts | 21 +- packages/common/src/atoms/order-form-atoms.ts | 21 +- .../src/atoms/orders-pending-actions-atom.ts | 4 +- .../common/src/atoms/perps-config-atom.ts | 4 + packages/common/src/atoms/portfolio-atoms.ts | 75 +- .../atoms/position-pending-actions-atom.ts | 8 +- packages/common/src/atoms/providers-atoms.ts | 10 +- packages/common/src/atoms/reactivity-keys.ts | 10 + .../src/atoms/transaction-execution-atoms.ts | 288 + .../common/src/atoms/wallet-adapter-atoms.ts | 40 + packages/common/src/atoms/wallet-atom.ts | 79 +- .../components/molecules/address-switcher.tsx | 99 +- .../molecules/sign-transactions/index.tsx | 40 +- packages/common/src/components/ui/card.tsx | 2 +- .../common/src/components/ui/skeleton.tsx | 2 +- packages/common/src/components/ui/slider.tsx | 6 +- packages/common/src/components/ui/tabs.tsx | 2 +- packages/common/src/context/appkit.tsx | 23 +- packages/common/src/context/index.tsx | 83 +- .../common/src/domain/action-transaction.ts | 14 + packages/common/src/domain/action.ts | 25 + packages/common/src/domain/api-event.ts | 50 + packages/common/src/domain/chains/index.ts | 1 - packages/common/src/domain/chains/ledger.ts | 54 - packages/common/src/domain/ids.ts | 34 + packages/common/src/domain/index.ts | 16 +- packages/common/src/domain/internal-event.ts | 62 + packages/common/src/domain/market.ts | 37 + packages/common/src/domain/model-updates.ts | 18 + packages/common/src/domain/pending-action.ts | 22 + packages/common/src/domain/portfolio.ts | 26 + packages/common/src/domain/provider.ts | 9 + packages/common/src/domain/scalars.ts | 20 + packages/common/src/domain/signer.ts | 75 - packages/common/src/domain/token.ts | 17 + packages/common/src/domain/transactions.ts | 3 + packages/common/src/domain/types.ts | 8 +- packages/common/src/domain/wallet-adapter.ts | 100 + packages/common/src/domain/wallet-errors.ts | 31 + packages/common/src/domain/wallet-source.ts | 30 + packages/common/src/domain/wallet.ts | 94 +- .../common/src/hooks/use-close-position.ts | 4 +- packages/common/src/hooks/use-deposit-form.ts | 3 +- .../common/src/hooks/use-order-actions.ts | 4 +- packages/common/src/hooks/use-order-form.ts | 10 +- .../common/src/hooks/use-position-actions.ts | 6 +- packages/common/src/hooks/use-tp-sl-orders.ts | 4 +- .../common/src/hooks/use-withdraw-form.ts | 3 +- packages/common/src/lib/math.ts | 17 +- packages/common/src/lib/utils.ts | 4 +- .../src/services/api-client/api-schemas.ts | 4 +- .../src/services/api-client/client-factory.ts | 2 +- .../common/src/services/api-client/index.ts | 2 +- packages/common/src/services/config.ts | 46 +- packages/common/src/services/events.ts | 65 + .../common/src/services/hyperliquid/index.ts | 4 +- packages/common/src/services/index.ts | 10 +- packages/common/src/services/runtime.ts | 62 +- .../common/src/services/wallet-adapter.ts | 7 + .../src/services/wallet/browser-signer.ts | 224 - .../services/wallet/browser-wallet-adapter.ts | 238 + .../wallet/external-wallet-adapter.ts | 79 + .../services/wallet/ledger-signer/index.ts | 189 - .../services/wallet/ledger-signer/utils.ts | 185 - packages/common/src/services/wallet/signer.ts | 6 - .../src/services/wallet/wallet-service.ts | 358 -- packages/common/src/vite.config.ts | 36 +- packages/common/tests/adjust-margin.test.ts | 6 +- packages/common/tests/domain-models.test.ts | 215 + packages/common/tests/events.test.ts | 85 + .../tests/transaction-execution.test.ts | 291 + packages/common/tests/wallet-adapter.test.ts | 144 + packages/common/vite.config.ts | 13 +- packages/dashboard/package.json | 82 +- packages/dashboard/src/app.tsx | 30 +- .../src/atoms/selected-market-atom.ts | 11 +- .../src/components/modules/trade/chart.tsx | 4 +- .../modules/trade/market-info/index.tsx | 8 +- .../market-info/market-selector-popover.tsx | 10 +- .../modules/trade/order-form/index.tsx | 6 +- .../modules/trade/order-form/sign-dialog.tsx | 27 +- .../header/deposit/deposit-dialog.tsx | 4 +- .../molecules/header/deposit/state.tsx | 10 +- .../src/components/molecules/header/index.tsx | 6 +- .../molecules/header/withdraw/state.tsx | 12 +- .../header/withdraw/withdraw-dialog.tsx | 4 +- .../positions/close-position-dialog.tsx | 7 +- .../molecules/positions/orders-tab.tsx | 11 +- .../molecules/positions/positions-tab.tsx | 22 +- packages/dashboard/src/index.ts | 14 + packages/dashboard/src/main.tsx | 11 +- packages/dashboard/src/styles-entry.ts | 1 + packages/dashboard/src/vanilla.tsx | 37 + packages/dashboard/vite.react.config.ts | 50 + packages/dashboard/vite.vanilla.config.ts | 33 + packages/widget/package.json | 82 +- packages/widget/src/app.tsx | 35 +- .../modules/Account/Deposit/index.tsx | 8 +- .../modules/Account/Deposit/state.tsx | 9 +- .../modules/Account/Withdraw/index.tsx | 15 +- .../modules/Account/Withdraw/state.tsx | 9 +- .../modules/Home/AssetList/item.tsx | 4 +- .../modules/Home/Positions/index.tsx | 4 +- .../modules/Home/Positions/order-card.tsx | 6 +- .../modules/Home/Positions/position-card.tsx | 8 +- .../src/components/modules/Home/index.tsx | 4 +- .../modules/Order/Overview/index.tsx | 5 +- .../PositionDetails/AdjustMargin/index.tsx | 11 +- .../PositionDetails/AdjustMargin/state.tsx | 53 +- .../modules/PositionDetails/Close/index.tsx | 5 +- .../modules/PositionDetails/Close/state.tsx | 18 +- .../PositionDetails/Overview/Orders/index.tsx | 13 +- .../Overview/Position/index.tsx | 16 +- .../PositionDetails/Overview/index.tsx | 13 +- .../Overview/overview-tab-content.tsx | 4 +- .../components/molecules/provider-select.tsx | 29 +- .../src/components/molecules/sign/index.tsx | 24 +- .../molecules/sign/sign-content.tsx | 27 +- packages/widget/src/index.ts | 14 + packages/widget/src/main.tsx | 11 +- packages/widget/src/styles-entry.ts | 1 + packages/widget/src/vanilla.tsx | 37 + packages/widget/vite.react.config.ts | 50 + packages/widget/vite.vanilla.config.ts | 33 + .../vite-plugin-node-polyfills@0.26.0.patch | 63 + pnpm-lock.yaml | 5644 ++++++++--------- pnpm-workspace.yaml | 70 +- tsconfig.base.json | 2 - vercel.json | 8 - 167 files changed, 6359 insertions(+), 4760 deletions(-) create mode 100644 apps/dashboard-react-example/.env.example create mode 100644 apps/dashboard-react-example/index.html create mode 100644 apps/dashboard-react-example/package.json create mode 100644 apps/dashboard-react-example/src/main.tsx create mode 100644 apps/dashboard-react-example/src/styles.css create mode 100644 apps/dashboard-react-example/tsconfig.json create mode 100644 apps/dashboard-react-example/vite.config.ts create mode 100644 apps/dashboard-vanilla-example/.env.example create mode 100644 apps/dashboard-vanilla-example/index.html create mode 100644 apps/dashboard-vanilla-example/package.json create mode 100644 apps/dashboard-vanilla-example/src/main.js create mode 100644 apps/dashboard-vanilla-example/src/styles.css create mode 100644 apps/dashboard-vanilla-example/vite.config.js create mode 100644 apps/widget-react-example/.env.example create mode 100644 apps/widget-react-example/index.html create mode 100644 apps/widget-react-example/package.json create mode 100644 apps/widget-react-example/src/main.tsx create mode 100644 apps/widget-react-example/src/styles.css create mode 100644 apps/widget-react-example/tsconfig.json create mode 100644 apps/widget-react-example/vite.config.ts create mode 100644 apps/widget-vanilla-example/.env.example create mode 100644 apps/widget-vanilla-example/index.html create mode 100644 apps/widget-vanilla-example/package.json create mode 100644 apps/widget-vanilla-example/src/main.js create mode 100644 apps/widget-vanilla-example/src/styles.css create mode 100644 apps/widget-vanilla-example/vite.config.js create mode 100644 mise.lock create mode 100644 packages/common/src/atoms/external-lifecycle-event-listener.ts create mode 100644 packages/common/src/atoms/external-wallet-source.ts create mode 100644 packages/common/src/atoms/perps-config-atom.ts create mode 100644 packages/common/src/atoms/reactivity-keys.ts create mode 100644 packages/common/src/atoms/transaction-execution-atoms.ts create mode 100644 packages/common/src/atoms/wallet-adapter-atoms.ts create mode 100644 packages/common/src/domain/action-transaction.ts create mode 100644 packages/common/src/domain/action.ts create mode 100644 packages/common/src/domain/api-event.ts delete mode 100644 packages/common/src/domain/chains/ledger.ts create mode 100644 packages/common/src/domain/ids.ts create mode 100644 packages/common/src/domain/internal-event.ts create mode 100644 packages/common/src/domain/market.ts create mode 100644 packages/common/src/domain/model-updates.ts create mode 100644 packages/common/src/domain/pending-action.ts create mode 100644 packages/common/src/domain/portfolio.ts create mode 100644 packages/common/src/domain/provider.ts create mode 100644 packages/common/src/domain/scalars.ts delete mode 100644 packages/common/src/domain/signer.ts create mode 100644 packages/common/src/domain/token.ts create mode 100644 packages/common/src/domain/wallet-adapter.ts create mode 100644 packages/common/src/domain/wallet-errors.ts create mode 100644 packages/common/src/domain/wallet-source.ts create mode 100644 packages/common/src/services/events.ts create mode 100644 packages/common/src/services/wallet-adapter.ts delete mode 100644 packages/common/src/services/wallet/browser-signer.ts create mode 100644 packages/common/src/services/wallet/browser-wallet-adapter.ts create mode 100644 packages/common/src/services/wallet/external-wallet-adapter.ts delete mode 100644 packages/common/src/services/wallet/ledger-signer/index.ts delete mode 100644 packages/common/src/services/wallet/ledger-signer/utils.ts delete mode 100644 packages/common/src/services/wallet/signer.ts delete mode 100644 packages/common/src/services/wallet/wallet-service.ts create mode 100644 packages/common/tests/domain-models.test.ts create mode 100644 packages/common/tests/events.test.ts create mode 100644 packages/common/tests/transaction-execution.test.ts create mode 100644 packages/common/tests/wallet-adapter.test.ts create mode 100644 packages/dashboard/src/index.ts create mode 100644 packages/dashboard/src/styles-entry.ts create mode 100644 packages/dashboard/src/vanilla.tsx create mode 100644 packages/dashboard/vite.react.config.ts create mode 100644 packages/dashboard/vite.vanilla.config.ts create mode 100644 packages/widget/src/index.ts create mode 100644 packages/widget/src/styles-entry.ts create mode 100644 packages/widget/src/vanilla.tsx create mode 100644 packages/widget/vite.react.config.ts create mode 100644 packages/widget/vite.vanilla.config.ts create mode 100644 patches/vite-plugin-node-polyfills@0.26.0.patch delete mode 100644 vercel.json diff --git a/.gitignore b/.gitignore index c2283c8..a4df2dc 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,5 @@ dist-ssr opensrc/ .turbo -*.tsbuildinfo \ No newline at end of file +*.tsbuildinfo +.pnpm-store/ \ No newline at end of file diff --git a/apps/dashboard-react-example/.env.example b/apps/dashboard-react-example/.env.example new file mode 100644 index 0000000..1398a4d --- /dev/null +++ b/apps/dashboard-react-example/.env.example @@ -0,0 +1,4 @@ +VITE_PERPS_BASE_URL= +VITE_PERPS_API_KEY= +VITE_REOWN_PROJECT_ID= +VITE_MORALIS_API_KEY= diff --git a/apps/dashboard-react-example/index.html b/apps/dashboard-react-example/index.html new file mode 100644 index 0000000..7724a0c --- /dev/null +++ b/apps/dashboard-react-example/index.html @@ -0,0 +1,12 @@ + + + + + + Perps Dashboard React Example + + +
+ + + diff --git a/apps/dashboard-react-example/package.json b/apps/dashboard-react-example/package.json new file mode 100644 index 0000000..f3dea79 --- /dev/null +++ b/apps/dashboard-react-example/package.json @@ -0,0 +1,22 @@ +{ + "name": "@yieldxyz/perps-dashboard-react-example", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port 3102", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@yieldxyz/perps-dashboard": "workspace:*", + "react": "catalog:", + "react-dom": "catalog:" + }, + "devDependencies": { + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "@vitejs/plugin-react": "catalog:", + "typescript": "catalog:", + "vite": "catalog:" + } +} diff --git a/apps/dashboard-react-example/src/main.tsx b/apps/dashboard-react-example/src/main.tsx new file mode 100644 index 0000000..7f1ec9e --- /dev/null +++ b/apps/dashboard-react-example/src/main.tsx @@ -0,0 +1,19 @@ +import { Dashboard, type PerpsConfig } from "@yieldxyz/perps-dashboard"; +import "@yieldxyz/perps-dashboard/styles.css"; +import { createRoot } from "react-dom/client"; +import "./styles.css"; + +const config: PerpsConfig = { + perpsBaseUrl: import.meta.env.VITE_PERPS_BASE_URL, + perpsApiKey: import.meta.env.VITE_PERPS_API_KEY, + reownProjectId: import.meta.env.VITE_REOWN_PROJECT_ID || undefined, + moralisApiKey: import.meta.env.VITE_MORALIS_API_KEY, +}; + +const rootElement = document.getElementById("root"); + +if (!rootElement) { + throw new Error("Root element not found"); +} + +createRoot(rootElement).render(); diff --git a/apps/dashboard-react-example/src/styles.css b/apps/dashboard-react-example/src/styles.css new file mode 100644 index 0000000..cc764a9 --- /dev/null +++ b/apps/dashboard-react-example/src/styles.css @@ -0,0 +1,14 @@ +html { + background: #121314; +} + +body { + margin: 0; + min-width: 320px; + background: #121314; +} + +#root { + min-height: 100vh; + background: #121314; +} diff --git a/apps/dashboard-react-example/tsconfig.json b/apps/dashboard-react-example/tsconfig.json new file mode 100644 index 0000000..772e4bf --- /dev/null +++ b/apps/dashboard-react-example/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "noEmit": true + }, + "include": ["src", "vite.config.ts"] +} diff --git a/apps/dashboard-react-example/vite.config.ts b/apps/dashboard-react-example/vite.config.ts new file mode 100644 index 0000000..58676f7 --- /dev/null +++ b/apps/dashboard-react-example/vite.config.ts @@ -0,0 +1,6 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [react()], +}); diff --git a/apps/dashboard-vanilla-example/.env.example b/apps/dashboard-vanilla-example/.env.example new file mode 100644 index 0000000..1398a4d --- /dev/null +++ b/apps/dashboard-vanilla-example/.env.example @@ -0,0 +1,4 @@ +VITE_PERPS_BASE_URL= +VITE_PERPS_API_KEY= +VITE_REOWN_PROJECT_ID= +VITE_MORALIS_API_KEY= diff --git a/apps/dashboard-vanilla-example/index.html b/apps/dashboard-vanilla-example/index.html new file mode 100644 index 0000000..d30459a --- /dev/null +++ b/apps/dashboard-vanilla-example/index.html @@ -0,0 +1,12 @@ + + + + + + Perps Dashboard Vanilla Example + + +
+ + + diff --git a/apps/dashboard-vanilla-example/package.json b/apps/dashboard-vanilla-example/package.json new file mode 100644 index 0000000..7680a90 --- /dev/null +++ b/apps/dashboard-vanilla-example/package.json @@ -0,0 +1,16 @@ +{ + "name": "@yieldxyz/perps-dashboard-vanilla-example", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port 3103", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@yieldxyz/perps-dashboard": "workspace:*" + }, + "devDependencies": { + "vite": "catalog:" + } +} diff --git a/apps/dashboard-vanilla-example/src/main.js b/apps/dashboard-vanilla-example/src/main.js new file mode 100644 index 0000000..f881073 --- /dev/null +++ b/apps/dashboard-vanilla-example/src/main.js @@ -0,0 +1,16 @@ +import { mountDashboard } from "@yieldxyz/perps-dashboard/vanilla"; +import "@yieldxyz/perps-dashboard/styles.css"; +import "./styles.css"; + +const config = { + perpsBaseUrl: import.meta.env.VITE_PERPS_BASE_URL, + perpsApiKey: import.meta.env.VITE_PERPS_API_KEY, + reownProjectId: import.meta.env.VITE_REOWN_PROJECT_ID || undefined, + moralisApiKey: import.meta.env.VITE_MORALIS_API_KEY, +}; + +const dashboard = mountDashboard("#app", { config }); + +if (import.meta.hot) { + import.meta.hot.dispose(() => dashboard.unmount()); +} diff --git a/apps/dashboard-vanilla-example/src/styles.css b/apps/dashboard-vanilla-example/src/styles.css new file mode 100644 index 0000000..86521f5 --- /dev/null +++ b/apps/dashboard-vanilla-example/src/styles.css @@ -0,0 +1,14 @@ +html { + background: #121314; +} + +body { + margin: 0; + min-width: 320px; + background: #121314; +} + +#app { + min-height: 100vh; + background: #121314; +} diff --git a/apps/dashboard-vanilla-example/vite.config.js b/apps/dashboard-vanilla-example/vite.config.js new file mode 100644 index 0000000..6150f9a --- /dev/null +++ b/apps/dashboard-vanilla-example/vite.config.js @@ -0,0 +1,3 @@ +import { defineConfig } from "vite"; + +export default defineConfig({}); diff --git a/apps/widget-react-example/.env.example b/apps/widget-react-example/.env.example new file mode 100644 index 0000000..1398a4d --- /dev/null +++ b/apps/widget-react-example/.env.example @@ -0,0 +1,4 @@ +VITE_PERPS_BASE_URL= +VITE_PERPS_API_KEY= +VITE_REOWN_PROJECT_ID= +VITE_MORALIS_API_KEY= diff --git a/apps/widget-react-example/index.html b/apps/widget-react-example/index.html new file mode 100644 index 0000000..1f8080e --- /dev/null +++ b/apps/widget-react-example/index.html @@ -0,0 +1,12 @@ + + + + + + Perps Widget React Example + + +
+ + + diff --git a/apps/widget-react-example/package.json b/apps/widget-react-example/package.json new file mode 100644 index 0000000..7359d1d --- /dev/null +++ b/apps/widget-react-example/package.json @@ -0,0 +1,22 @@ +{ + "name": "@yieldxyz/perps-widget-react-example", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port 3100", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@yieldxyz/perps-widget": "workspace:*", + "react": "catalog:", + "react-dom": "catalog:" + }, + "devDependencies": { + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "@vitejs/plugin-react": "catalog:", + "typescript": "catalog:", + "vite": "catalog:" + } +} diff --git a/apps/widget-react-example/src/main.tsx b/apps/widget-react-example/src/main.tsx new file mode 100644 index 0000000..debf9b8 --- /dev/null +++ b/apps/widget-react-example/src/main.tsx @@ -0,0 +1,20 @@ +import { type PerpsConfig, Widget } from "@yieldxyz/perps-widget"; +import "@yieldxyz/perps-widget/styles.css"; +import { createRoot } from "react-dom/client"; +import "./styles.css"; + +const config: PerpsConfig = { + perpsBaseUrl: "https://perps.yield.xyz", + perpsApiKey: "e2d627cf-2ae3-4775-9fbc-76819c7cae38", + reownProjectId: "29e1b718ad16983a0705cf24d5b5b747", + moralisApiKey: + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJub25jZSI6IjhlNTk0NDE0LTg3NGMtNDZlMC1iMWNlLWU5ZjYzMjY1YWExMiIsIm9yZ0lkIjoiNDI2Nzk1IiwidXNlcklkIjoiNDM4OTk2IiwidHlwZSI6IlBST0pFQ1QiLCJ0eXBlSWQiOiI2YzMwMDY3Yi1kNDEyLTQwYjYtYTQ4OS0zYjEwM2ExNThjOGMiLCJpYXQiOjE3Mzc0NTA4NzcsImV4cCI6NDg5MzIxMDg3N30.pd8sKdRHdtlqoZVS7wb8Jyy2GLhhr95X8yW64W_gSC0", +}; + +const rootElement = document.getElementById("root"); + +if (!rootElement) { + throw new Error("Root element not found"); +} + +createRoot(rootElement).render(); diff --git a/apps/widget-react-example/src/styles.css b/apps/widget-react-example/src/styles.css new file mode 100644 index 0000000..582501e --- /dev/null +++ b/apps/widget-react-example/src/styles.css @@ -0,0 +1,24 @@ +html { + background: #131517; +} + +body { + margin: 0; + min-width: 320px; + background: #131517; +} + +#root { + min-height: 100vh; + display: flex; + justify-content: center; + align-items: flex-start; + padding: 30px 16px; + box-sizing: border-box; +} + +@media (min-width: 768px) { + #root { + padding: 32px; + } +} diff --git a/apps/widget-react-example/tsconfig.json b/apps/widget-react-example/tsconfig.json new file mode 100644 index 0000000..772e4bf --- /dev/null +++ b/apps/widget-react-example/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "noEmit": true + }, + "include": ["src", "vite.config.ts"] +} diff --git a/apps/widget-react-example/vite.config.ts b/apps/widget-react-example/vite.config.ts new file mode 100644 index 0000000..58676f7 --- /dev/null +++ b/apps/widget-react-example/vite.config.ts @@ -0,0 +1,6 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [react()], +}); diff --git a/apps/widget-vanilla-example/.env.example b/apps/widget-vanilla-example/.env.example new file mode 100644 index 0000000..1398a4d --- /dev/null +++ b/apps/widget-vanilla-example/.env.example @@ -0,0 +1,4 @@ +VITE_PERPS_BASE_URL= +VITE_PERPS_API_KEY= +VITE_REOWN_PROJECT_ID= +VITE_MORALIS_API_KEY= diff --git a/apps/widget-vanilla-example/index.html b/apps/widget-vanilla-example/index.html new file mode 100644 index 0000000..88efde6 --- /dev/null +++ b/apps/widget-vanilla-example/index.html @@ -0,0 +1,12 @@ + + + + + + Perps Widget Vanilla Example + + +
+ + + diff --git a/apps/widget-vanilla-example/package.json b/apps/widget-vanilla-example/package.json new file mode 100644 index 0000000..032c5f4 --- /dev/null +++ b/apps/widget-vanilla-example/package.json @@ -0,0 +1,16 @@ +{ + "name": "@yieldxyz/perps-widget-vanilla-example", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port 3101", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@yieldxyz/perps-widget": "workspace:*" + }, + "devDependencies": { + "vite": "catalog:" + } +} diff --git a/apps/widget-vanilla-example/src/main.js b/apps/widget-vanilla-example/src/main.js new file mode 100644 index 0000000..1aa0457 --- /dev/null +++ b/apps/widget-vanilla-example/src/main.js @@ -0,0 +1,17 @@ +import { mountWidget } from "@yieldxyz/perps-widget/vanilla"; +import "@yieldxyz/perps-widget/styles.css"; +import "./styles.css"; + +const config = { + perpsBaseUrl: "https://perps.yield.xyz", + perpsApiKey: "e2d627cf-2ae3-4775-9fbc-76819c7cae38", + reownProjectId: "29e1b718ad16983a0705cf24d5b5b747" || undefined, + moralisApiKey: + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJub25jZSI6IjhlNTk0NDE0LTg3NGMtNDZlMC1iMWNlLWU5ZjYzMjY1YWExMiIsIm9yZ0lkIjoiNDI2Nzk1IiwidXNlcklkIjoiNDM4OTk2IiwidHlwZSI6IlBST0pFQ1QiLCJ0eXBlSWQiOiI2YzMwMDY3Yi1kNDEyLTQwYjYtYTQ4OS0zYjEwM2ExNThjOGMiLCJpYXQiOjE3Mzc0NTA4NzcsImV4cCI6NDg5MzIxMDg3N30.pd8sKdRHdtlqoZVS7wb8Jyy2GLhhr95X8yW64W_gSC0", +}; + +const widget = mountWidget("#app", { config }); + +if (import.meta.hot) { + import.meta.hot.dispose(() => widget.unmount()); +} diff --git a/apps/widget-vanilla-example/src/styles.css b/apps/widget-vanilla-example/src/styles.css new file mode 100644 index 0000000..943f19e --- /dev/null +++ b/apps/widget-vanilla-example/src/styles.css @@ -0,0 +1,24 @@ +html { + background: #131517; +} + +body { + margin: 0; + min-width: 320px; + background: #131517; +} + +#app { + min-height: 100vh; + display: flex; + justify-content: center; + align-items: flex-start; + padding: 30px 16px; + box-sizing: border-box; +} + +@media (min-width: 768px) { + #app { + padding: 32px; + } +} diff --git a/apps/widget-vanilla-example/vite.config.js b/apps/widget-vanilla-example/vite.config.js new file mode 100644 index 0000000..6150f9a --- /dev/null +++ b/apps/widget-vanilla-example/vite.config.js @@ -0,0 +1,3 @@ +import { defineConfig } from "vite"; + +export default defineConfig({}); diff --git a/mise.lock b/mise.lock new file mode 100644 index 0000000..2d16fd4 --- /dev/null +++ b/mise.lock @@ -0,0 +1,37 @@ +# @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html + +[[tools.node]] +version = "24.15.0" +backend = "core:node" + +[tools.node."platforms.linux-arm64"] +checksum = "sha256:73afc234d558c24919875f51c2d1ea002a2ada4ea6f83601a383869fefa64eed" +url = "https://nodejs.org/dist/v24.15.0/node-v24.15.0-linux-arm64.tar.gz" + +[tools.node."platforms.linux-arm64-musl"] +checksum = "sha256:31e98aa960a067da91edffd5d93bc46657b5d2a8029612c359f5f2ac0060152a" +url = "https://unofficial-builds.nodejs.org/download/release/v24.15.0/node-v24.15.0-linux-arm64-musl.tar.gz" + +[tools.node."platforms.linux-x64"] +checksum = "sha256:44836872d9aec49f1e6b52a9a922872db9a2b02d235a616a5681b6a85fec8d89" +url = "https://nodejs.org/dist/v24.15.0/node-v24.15.0-linux-x64.tar.gz" + +[tools.node."platforms.linux-x64-musl"] +checksum = "sha256:f55af5bd489c5347b113ca6594cae00a54b30ba57ac5875324311bfc6f4762e3" +url = "https://unofficial-builds.nodejs.org/download/release/v24.15.0/node-v24.15.0-linux-x64-musl.tar.gz" + +[tools.node."platforms.macos-arm64"] +checksum = "sha256:372331b969779ab5d15b949884fc6eaf88d5afe87bde8ba881d6400b9100ffc4" +url = "https://nodejs.org/dist/v24.15.0/node-v24.15.0-darwin-arm64.tar.gz" + +[tools.node."platforms.macos-x64"] +checksum = "sha256:ffd5ee293467927f3ee731a553eb88fd1f48cf74eebc2d74a6babe4af228673b" +url = "https://nodejs.org/dist/v24.15.0/node-v24.15.0-darwin-x64.tar.gz" + +[tools.node."platforms.windows-x64"] +checksum = "sha256:cc5149eabd53779ce1e7bdc5401643622d0c7e6800ade18928a767e940bb0e62" +url = "https://nodejs.org/dist/v24.15.0/node-v24.15.0-win-x64.zip" + +[[tools."npm:pnpm"]] +version = "10.33.2" +backend = "npm:pnpm" diff --git a/mise.toml b/mise.toml index 3f1baa1..921b2eb 100644 --- a/mise.toml +++ b/mise.toml @@ -1,4 +1,4 @@ [tools] -node="24" -pnpm="10" \ No newline at end of file +node="24.15.0" +"npm:pnpm"="10.33.2" \ No newline at end of file diff --git a/package.json b/package.json index df49ec6..73198b1 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,6 @@ "openapi-typescript": "^7.13.0", "swagger2openapi": "^7.0.8", "turbo": "catalog:", - "yaml": "^2.9.0" + "yaml": "^2.8.4" } } diff --git a/packages/common/package.json b/packages/common/package.json index afb07af..f04af27 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -10,7 +10,7 @@ "test": "vitest run", "copy-assets": "cp -r src/assets dist/src && cp -r src/styles dist/src/styles", "lint": "biome check . && tsc -b", - "format": "biome format --write .", + "format": "biome check --write .", "generate-client-factory": "tsx --env-file .env scripts/generate-client-factory.ts", "generate-tradingview-symbols": "tsx --env-file .env scripts/generate-tradingview-symbols/index.ts" }, @@ -56,7 +56,6 @@ "dependencies": { "@base-ui/react": "catalog:", "@effect/platform-node": "catalog:", - "@ledgerhq/wallet-api-client": "catalog:", "@lucas-barake/effect-form-react": "catalog:", "@nktkas/hyperliquid": "catalog:", "@reown/appkit": "catalog:", @@ -83,6 +82,7 @@ "@effect/atom-react": "catalog:" }, "devDependencies": { + "@rolldown/plugin-babel": "catalog:", "@tanstack/devtools-vite": "catalog:", "@tanstack/router-cli": "catalog:", "@types/node": "catalog:", diff --git a/packages/common/src/atoms/actions-atoms.ts b/packages/common/src/atoms/actions-atoms.ts index 45b9b34..d26eccd 100644 --- a/packages/common/src/atoms/actions-atoms.ts +++ b/packages/common/src/atoms/actions-atoms.ts @@ -1,64 +1,7 @@ -import { type Cause, Effect, Stream } from "effect"; -import type * as Result from "effect/unstable/reactivity/AsyncResult"; +import { Schema } from "effect"; import * as Atom from "effect/unstable/reactivity/Atom"; -import * as Reactivity from "effect/unstable/reactivity/Reactivity"; -import type { SignTransactionsState, WalletConnected } from "../domain/wallet"; -import type { ActionDto } from "../services/api-client/client-factory"; -import { runtimeAtom } from "../services/runtime"; -import { portfolioReactivityKeysArray } from "./portfolio-atoms"; +import { Action } from "../domain"; -export const actionAtom = Atom.make(null); +export const decodeAction = Schema.decodeSync(Action); -const getActionAtom = Atom.make( - Effect.fn(function* (ctx) { - const action = ctx.get(actionAtom); - if (!action) { - return yield* Effect.die(new Error("No action found")); - } - return action; - }), -); - -type SignActionAtoms = ( - arg: (action: ActionDto) => Effect.Effect< - { - stream: Stream.Stream; - retry: Effect.Effect; - }, - never, - never - >, -) => { - machineStreamAtom: Atom.Atom< - Result.AsyncResult - >; - retryMachineAtom: Atom.AtomResultFn; -}; - -export const signActionAtoms: SignActionAtoms = Atom.family( - (signTransactions: WalletConnected["signTransactions"]) => { - const machineAtom = runtimeAtom.atom((ctx) => - ctx - .result(getActionAtom) - .pipe(Effect.andThen((action) => signTransactions(action))), - ); - - const machineStreamAtom = runtimeAtom.atom((ctx) => - ctx.result(machineAtom).pipe( - Effect.map((val) => val.stream), - Stream.unwrap, - Stream.takeUntil((v) => v.isDone), - Stream.ensuring(Reactivity.invalidate(portfolioReactivityKeysArray)), - ), - ); - - const retryMachineAtom = runtimeAtom.fn((_, ctx) => - ctx.result(machineAtom).pipe(Effect.andThen((val) => val.retry)), - ); - - return { - machineStreamAtom, - retryMachineAtom, - }; - }, -); +export const actionAtom = Atom.make(null); diff --git a/packages/common/src/atoms/close-position-atoms.ts b/packages/common/src/atoms/close-position-atoms.ts index c97d090..102b14c 100644 --- a/packages/common/src/atoms/close-position-atoms.ts +++ b/packages/common/src/atoms/close-position-atoms.ts @@ -2,12 +2,12 @@ import { Number as _Number, Effect } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import * as Atom from "effect/unstable/reactivity/Atom"; import * as Registry from "effect/unstable/reactivity/AtomRegistry"; +import type { Position } from "../domain"; import type { WalletConnected } from "../domain/wallet"; import { getCloseCalculations } from "../lib/math"; import { ApiClientService } from "../services/api-client"; -import type { PositionDto } from "../services/api-client/api-schemas"; import { runtimeAtom } from "../services/runtime"; -import { actionAtom } from "./actions-atoms"; +import { actionAtom, decodeAction } from "./actions-atoms"; import { selectedProviderAtom } from "./providers-atoms"; export const SLIDER_STOPS = [0, 25, 50, 75, 100]; @@ -19,10 +19,7 @@ export const closePercentageAtom = Atom.writable( ); export const submitCloseAtom = runtimeAtom.fn( - Effect.fn(function* (args: { - position: PositionDto; - wallet: WalletConnected; - }) { + Effect.fn(function* (args: { position: Position; wallet: WalletConnected }) { const client = yield* ApiClientService; const registry = yield* Registry.AtomRegistry; @@ -55,6 +52,6 @@ export const submitCloseAtom = runtimeAtom.fn( }, }); - registry.set(actionAtom, action); + registry.set(actionAtom, decodeAction(action)); }), ); diff --git a/packages/common/src/atoms/config-atom.ts b/packages/common/src/atoms/config-atom.ts index 96da85d..f81d1de 100644 --- a/packages/common/src/atoms/config-atom.ts +++ b/packages/common/src/atoms/config-atom.ts @@ -1,7 +1,6 @@ -import { Effect } from "effect"; import { ConfigService } from "../services/config"; import { runtimeAtom } from "../services/runtime"; export const configAtom = runtimeAtom.atom( - ConfigService.use((config) => Effect.succeed(config)), + ConfigService.useSync((config) => config), ); diff --git a/packages/common/src/atoms/edit-position-atoms.ts b/packages/common/src/atoms/edit-position-atoms.ts index e99230d..4943f40 100644 --- a/packages/common/src/atoms/edit-position-atoms.ts +++ b/packages/common/src/atoms/edit-position-atoms.ts @@ -6,14 +6,11 @@ import type { TPOrSLConfiguration, TPOrSLSettings, } from "../components/molecules/tp-sl-dialog"; +import type { Position } from "../domain"; import type { WalletConnected } from "../domain/wallet"; import { ApiClientService } from "../services/api-client"; -import type { - ActionRequestDto, - PositionDto, -} from "../services/api-client/api-schemas"; import { runtimeAtom } from "../services/runtime"; -import { actionAtom } from "./actions-atoms"; +import { actionAtom, decodeAction } from "./actions-atoms"; import { selectedProviderAtom } from "./providers-atoms"; export const tpSlArgument = flow( @@ -35,7 +32,7 @@ export const editSLTPAtom = runtimeAtom.fn( stopLossOrderId, takeProfitOrderId, }: { - position: PositionDto; + position: Position; wallet: WalletConnected; tpOrSLSettings: TPOrSLSettings; stopLossOrderId?: string; @@ -52,11 +49,17 @@ export const editSLTPAtom = runtimeAtom.fn( return yield* Effect.die(new Error("No selected provider")); } - const newStopLossPrice: ActionRequestDto["args"]["stopLossPrice"] = - tpSlArgument(tpOrSLSettings.stopLoss); + type TpSlActionArgs = { + stopLossPrice?: number; + takeProfitPrice?: number; + stopLossOrderId?: string; + takeProfitOrderId?: string; + orderId?: string; + }; + + const newStopLossPrice = tpSlArgument(tpOrSLSettings.stopLoss); - const newTakeProfitPrice: ActionRequestDto["args"]["takeProfitPrice"] = - tpSlArgument(tpOrSLSettings.takeProfit); + const newTakeProfitPrice = tpSlArgument(tpOrSLSettings.takeProfit); const actionArgs = Match.value({ newStopLossPrice, @@ -64,7 +67,7 @@ export const editSLTPAtom = runtimeAtom.fn( }).pipe( Match.withReturnType<{ action: "setTpAndSl" | "takeProfit" | "stopLoss"; - args: ActionRequestDto["args"]; + args: TpSlActionArgs; } | null>(), Match.when( { newStopLossPrice: defined, newTakeProfitPrice: defined }, @@ -111,6 +114,6 @@ export const editSLTPAtom = runtimeAtom.fn( }, }); - registry.set(actionAtom, action); + registry.set(actionAtom, decodeAction(action)); }), ); diff --git a/packages/common/src/atoms/external-lifecycle-event-listener.ts b/packages/common/src/atoms/external-lifecycle-event-listener.ts new file mode 100644 index 0000000..4fe252c --- /dev/null +++ b/packages/common/src/atoms/external-lifecycle-event-listener.ts @@ -0,0 +1,7 @@ +import { Stream } from "effect"; +import { EventsService } from "../services/events"; +import { runtimeAtom } from "../services/runtime"; + +export const lifecycleEventAtom = runtimeAtom.atom( + Stream.unwrap(EventsService.useSync((service) => service.stream)), +); diff --git a/packages/common/src/atoms/external-wallet-source.ts b/packages/common/src/atoms/external-wallet-source.ts new file mode 100644 index 0000000..65b066c --- /dev/null +++ b/packages/common/src/atoms/external-wallet-source.ts @@ -0,0 +1,6 @@ +import * as Atom from "effect/unstable/reactivity/Atom"; +import type { ExternalWalletSource } from "../domain"; + +export const externalWalletSourceAtom = Atom.make( + null, +); diff --git a/packages/common/src/atoms/index.ts b/packages/common/src/atoms/index.ts index 8eec338..dd1af2a 100644 --- a/packages/common/src/atoms/index.ts +++ b/packages/common/src/atoms/index.ts @@ -2,12 +2,18 @@ export * from "./actions-atoms"; export * from "./close-position-atoms"; export * from "./config-atom"; export * from "./edit-position-atoms"; +export * from "./external-lifecycle-event-listener"; +export * from "./external-wallet-source"; export * from "./hyperliquid-atoms"; export * from "./markets-atoms"; export * from "./order-form-atoms"; export * from "./orders-pending-actions-atom"; +export * from "./perps-config-atom"; export * from "./portfolio-atoms"; export * from "./position-pending-actions-atom"; export * from "./providers-atoms"; +export * from "./reactivity-keys"; export * from "./tokens-atoms"; +export * from "./transaction-execution-atoms"; +export * from "./wallet-adapter-atoms"; export * from "./wallet-atom"; diff --git a/packages/common/src/atoms/markets-atoms.ts b/packages/common/src/atoms/markets-atoms.ts index d6d995a..b4ea7ed 100644 --- a/packages/common/src/atoms/markets-atoms.ts +++ b/packages/common/src/atoms/markets-atoms.ts @@ -6,19 +6,25 @@ import { pipe, Record, Schedule, + Schema, Stream, } from "effect"; import * as Atom from "effect/unstable/reactivity/Atom"; import * as AtomRef from "effect/unstable/reactivity/AtomRef"; +import { + Market, + MarketId, + type Provider, + updateMarketMarkPrice, +} from "../domain"; import { ApiClientService } from "../services/api-client"; -import type { ProviderDto } from "../services/api-client/api-schemas"; import { runtimeAtom } from "../services/runtime"; import { midPriceAtom } from "./hyperliquid-atoms"; import { selectedProviderAtom } from "./providers-atoms"; const DEFAULT_LIMIT = 50; -const getAllMarkets = Effect.fn(function* (selectedProvider: ProviderDto) { +const getAllMarkets = Effect.fn(function* (selectedProvider: Provider) { const client = yield* ApiClientService; const firstPage = yield* client.MarketsControllerGetMarkets({ @@ -50,10 +56,10 @@ const getAllMarkets = Effect.fn(function* (selectedProvider: ProviderDto) { { concurrency: "unbounded" }, ).pipe(Effect.map(_Array.getSomes)); - return [ + return yield* Schema.decodeEffect(Schema.Array(Market))([ ...(firstPage.items ?? []), ...restPages.flatMap((page) => page.items ?? []), - ]; + ]); }); export const marketsAtom = runtimeAtom.atom( @@ -91,7 +97,7 @@ export const marketAtom = Atom.family((marketId: string) => runtimeAtom.atom( Effect.fn(function* (ctx) { const markets = yield* ctx.result(marketsAtom); - const record = Record.get(markets, marketId); + const record = Record.get(markets, Schema.decodeSync(MarketId)(marketId)); if (record._tag === "None") { return yield* new MarketNotFoundError(); @@ -159,10 +165,7 @@ export const updateMarketsMidPriceAtom = runtimeAtom.atom((ctx) => return; } - marketRef.value.update((market) => ({ - ...market, - markPrice: parsed, - })); + marketRef.value.update((market) => updateMarketMarkPrice(market, parsed)); }); }), ); diff --git a/packages/common/src/atoms/order-form-atoms.ts b/packages/common/src/atoms/order-form-atoms.ts index 7c03c82..342e05a 100644 --- a/packages/common/src/atoms/order-form-atoms.ts +++ b/packages/common/src/atoms/order-form-atoms.ts @@ -4,7 +4,11 @@ import * as Result from "effect/unstable/reactivity/AsyncResult"; import * as Atom from "effect/unstable/reactivity/Atom"; import * as Registry from "effect/unstable/reactivity/AtomRegistry"; import { AmountField, type TPOrSLSettings } from "../components"; -import { isWalletConnected, type WalletConnected } from "../domain"; +import { + isWalletConnected, + type Market, + type WalletConnected, +} from "../domain"; import { calcBaseAmountFromUsd, calculateMargin, @@ -17,8 +21,8 @@ import { round, valueFromPercent, } from "../lib"; -import { ApiClientService, ApiSchemas, runtimeAtom } from "../services"; -import { actionAtom } from "./actions-atoms"; +import { ApiClientService, runtimeAtom } from "../services"; +import { actionAtom, decodeAction } from "./actions-atoms"; import { tpSlArgument } from "./edit-position-atoms"; import { selectedProviderBalancesAtom } from "./portfolio-atoms"; import { selectedProviderAtom } from "./providers-atoms"; @@ -32,8 +36,9 @@ export type OrderType = "market" | "limit"; export type OrderSide = "long" | "short"; // Schemas -export const LeverageRangesSchema = - ApiSchemas.MarketDto.fields.leverageRange.pipe(Schema.brand("LeverageRange")); +export const LeverageRangesSchema = Schema.Array(Schema.Number).pipe( + Schema.brand("LeverageRange"), +); // Order Type Atom export const orderTypeAtom = Atom.make("market"); @@ -132,7 +137,7 @@ export const orderFormAtom = Atom.family( side, }: { wallet: WalletConnected; - market: ApiSchemas.MarketDto; + market: Market; side: OrderSide; }, { decoded }, @@ -177,7 +182,7 @@ export const orderFormAtom = Atom.family( }, }); - registry.set(actionAtom, action); + registry.set(actionAtom, decodeAction(action)); }), }); @@ -196,7 +201,7 @@ export const orderFormAtom = Atom.family( export const getOrderCalculations = ( amount: number, leverage: number, - market: ApiSchemas.MarketDto, + market: Market, side: OrderSide, ) => { const cryptoAmount = calcBaseAmountFromUsd({ diff --git a/packages/common/src/atoms/orders-pending-actions-atom.ts b/packages/common/src/atoms/orders-pending-actions-atom.ts index 3555751..009ec88 100644 --- a/packages/common/src/atoms/orders-pending-actions-atom.ts +++ b/packages/common/src/atoms/orders-pending-actions-atom.ts @@ -5,7 +5,7 @@ import * as Registry from "effect/unstable/reactivity/AtomRegistry"; import type { WalletAccount } from "../domain/wallet"; import { ApiClientService } from "../services/api-client"; import { runtimeAtom } from "../services/runtime"; -import { actionAtom } from "./actions-atoms"; +import { actionAtom, decodeAction } from "./actions-atoms"; import { selectedProviderAtom } from "./providers-atoms"; export const cancelOrderAtom = Atom.family((orderId: string) => @@ -37,7 +37,7 @@ export const cancelOrderAtom = Atom.family((orderId: string) => }, }); - registry.set(actionAtom, action); + registry.set(actionAtom, decodeAction(action)); }), ), ); diff --git a/packages/common/src/atoms/perps-config-atom.ts b/packages/common/src/atoms/perps-config-atom.ts new file mode 100644 index 0000000..454f52f --- /dev/null +++ b/packages/common/src/atoms/perps-config-atom.ts @@ -0,0 +1,4 @@ +import * as Atom from "effect/unstable/reactivity/Atom"; +import type { PerpsConfig } from "../services/config"; + +export const perpsConfigAtom = Atom.make(null); diff --git a/packages/common/src/atoms/portfolio-atoms.ts b/packages/common/src/atoms/portfolio-atoms.ts index 634a3e3..12aa4f0 100644 --- a/packages/common/src/atoms/portfolio-atoms.ts +++ b/packages/common/src/atoms/portfolio-atoms.ts @@ -8,24 +8,21 @@ import { } from "effect"; import * as Atom from "effect/unstable/reactivity/Atom"; import * as AtomRef from "effect/unstable/reactivity/AtomRef"; -import { WalletAccountAddress } from "../domain"; +import { + Balance, + MarketId, + Order, + Position, + updatePositionMarkPrice, + WalletAddress, +} from "../domain"; import type { WalletAccount } from "../domain/wallet"; import { ApiClientService } from "../services/api-client"; import { runtimeAtom, withReactivity } from "../services/runtime"; import { midPriceAtom } from "./hyperliquid-atoms"; import { marketsBySymbolAtom } from "./markets-atoms"; import { providersAtom, selectedProviderAtom } from "./providers-atoms"; - -export const portfolioReactivityKeys = { - positions: "positions", - orders: "orders", - providersBalances: "providersBalances", - selectedProviderBalances: "selectedProviderBalances", -} as const; - -export const portfolioReactivityKeysArray = Object.values( - portfolioReactivityKeys, -); +import { portfolioReactivityKeys } from "./reactivity-keys"; export const positionsAtom = Atom.family( (walletAddress: WalletAccount["address"]) => @@ -35,12 +32,14 @@ export const positionsAtom = Atom.family( const client = yield* ApiClientService; const selectedProvider = yield* ctx.result(selectedProviderAtom); - const positions = yield* client.PortfolioControllerGetPositions({ - payload: { - address: walletAddress, - providerId: selectedProvider.id, - }, - }); + const positions = yield* client + .PortfolioControllerGetPositions({ + payload: { + address: walletAddress, + providerId: selectedProvider.id, + }, + }) + .pipe(Effect.andThen(Schema.decodeEffect(Schema.Array(Position)))); return Record.fromIterableBy( positions.map((position) => AtomRef.make(position)), @@ -63,12 +62,14 @@ export const ordersAtom = Atom.family( const client = yield* ApiClientService; const selectedProvider = yield* ctx.result(selectedProviderAtom); - return yield* client.PortfolioControllerGetOrders({ - payload: { - address: walletAddress, - providerId: selectedProvider.id, - }, - }); + return yield* client + .PortfolioControllerGetOrders({ + payload: { + address: walletAddress, + providerId: selectedProvider.id, + }, + }) + .pipe(Effect.andThen(Schema.decodeEffect(Schema.Array(Order)))); }), ) .pipe( @@ -95,6 +96,7 @@ export const providersBalancesAtom = Atom.family( providerId: provider.id, }, }) + .pipe(Effect.andThen(Schema.decodeEffect(Balance))) .pipe(Effect.option), ), { concurrency: "unbounded" }, @@ -116,12 +118,14 @@ export const selectedProviderBalancesAtom = Atom.family( const selectedProvider = yield* ctx.result(selectedProviderAtom); const client = yield* ApiClientService; - return yield* client.PortfolioControllerGetBalances({ - payload: { - address: walletAddress, - providerId: selectedProvider.id, - }, - }); + return yield* client + .PortfolioControllerGetBalances({ + payload: { + address: walletAddress, + providerId: selectedProvider.id, + }, + }) + .pipe(Effect.andThen(Schema.decodeEffect(Balance))); }), ) .pipe( @@ -150,18 +154,17 @@ export const updatePositionsMidPriceAtom = Atom.family( const positionRef = Record.get(positions, marketRef.value.value.id); if (positionRef._tag === "None") return; - positionRef.value.update((position) => ({ - ...position, - markPrice: Number(price), - })); + positionRef.value.update((position) => + updatePositionMarkPrice(position, Number(price)), + ); }); }), ), ); export const GetCurrentPositionRefArgs = Schema.Struct({ - marketId: Schema.String, - address: WalletAccountAddress, + marketId: MarketId, + address: WalletAddress, }).pipe(Schema.brand("GetCurrentPositionRefArgs")); export const makeGetCurrentPositionRefArgs = Schema.decodeSync( diff --git a/packages/common/src/atoms/position-pending-actions-atom.ts b/packages/common/src/atoms/position-pending-actions-atom.ts index f102ce9..bd0baf5 100644 --- a/packages/common/src/atoms/position-pending-actions-atom.ts +++ b/packages/common/src/atoms/position-pending-actions-atom.ts @@ -1,11 +1,11 @@ import { Effect } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import * as Registry from "effect/unstable/reactivity/AtomRegistry"; +import type { Position } from "../domain"; import type { WalletConnected } from "../domain/wallet"; import { ApiClientService } from "../services/api-client"; -import type { PositionDto } from "../services/api-client/api-schemas"; import { runtimeAtom } from "../services/runtime"; -import { actionAtom } from "./actions-atoms"; +import { actionAtom, decodeAction } from "./actions-atoms"; import { selectedProviderAtom } from "./providers-atoms"; export type UpdateMarginMode = "add" | "remove"; @@ -16,7 +16,7 @@ export const updateLeverageAtom = runtimeAtom.fn( wallet, newLeverage, }: { - position: PositionDto; + position: Position; wallet: WalletConnected; newLeverage: number; }) { @@ -44,6 +44,6 @@ export const updateLeverageAtom = runtimeAtom.fn( }, }); - registry.set(actionAtom, action); + registry.set(actionAtom, decodeAction(action)); }), ); diff --git a/packages/common/src/atoms/providers-atoms.ts b/packages/common/src/atoms/providers-atoms.ts index 3543093..6a953e6 100644 --- a/packages/common/src/atoms/providers-atoms.ts +++ b/packages/common/src/atoms/providers-atoms.ts @@ -1,8 +1,8 @@ -import { Array as _Array, Data, Effect } from "effect"; +import { Array as _Array, Data, Effect, Schema } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import * as Atom from "effect/unstable/reactivity/Atom"; +import { Provider } from "../domain"; import { ApiClientService } from "../services/api-client"; -import type { ProviderDto } from "../services/api-client/api-schemas"; import { runtimeAtom, withReactivity } from "../services/runtime"; export const providersReactivityKeys = { @@ -16,7 +16,9 @@ export const providersReactivityKeysArray = Object.values( export const providersAtom = runtimeAtom .atom( ApiClientService.use((client) => - client.ProvidersControllerGetProviders(undefined), + client + .ProvidersControllerGetProviders(undefined) + .pipe(Effect.andThen(Schema.decodeEffect(Schema.Array(Provider)))), ), ) .pipe(withReactivity([providersReactivityKeys.providers]), Atom.keepAlive); @@ -41,5 +43,5 @@ const initialProviderAtom = runtimeAtom.atom( export const selectedProviderAtom = Atom.writable( (ctx) => ctx.get(initialProviderAtom), - (ctx, value: ProviderDto) => ctx.setSelf(Result.success(value)), + (ctx, value: Provider) => ctx.setSelf(Result.success(value)), ).pipe(Atom.keepAlive); diff --git a/packages/common/src/atoms/reactivity-keys.ts b/packages/common/src/atoms/reactivity-keys.ts new file mode 100644 index 0000000..6b48e1f --- /dev/null +++ b/packages/common/src/atoms/reactivity-keys.ts @@ -0,0 +1,10 @@ +export const portfolioReactivityKeys = { + positions: "positions", + orders: "orders", + providersBalances: "providersBalances", + selectedProviderBalances: "selectedProviderBalances", +} as const; + +export const portfolioReactivityKeysArray = Object.values( + portfolioReactivityKeys, +); diff --git a/packages/common/src/atoms/transaction-execution-atoms.ts b/packages/common/src/atoms/transaction-execution-atoms.ts new file mode 100644 index 0000000..95027fb --- /dev/null +++ b/packages/common/src/atoms/transaction-execution-atoms.ts @@ -0,0 +1,288 @@ +import { + Array as _Array, + Cause, + Duration, + Effect, + Match, + Option, + Ref, + Schedule, + Schema, + Stream, +} from "effect"; +import * as Atom from "effect/unstable/reactivity/Atom"; +import { + Action, + makeLifecycleActionContext, + makeLifecycleTransactionContext, +} from "../domain"; +import { EIP712Tx, Transaction } from "../domain/transactions"; +import { + type SignTransactionsState, + TransactionFailedError, + TransactionNotConfirmedError, +} from "../domain/wallet"; +import { ApiClientService } from "../services/api-client"; +import { EventsService } from "../services/events"; +import { runtimeAtom } from "../services/runtime"; +import { WalletAdapterService } from "../services/wallet-adapter"; + +const makeInitialState = (action: Action): SignTransactionsState => ({ + action, + transactions: action.transactions, + currentTxIndex: 0, + step: null, + error: null, + txHash: null, + isDone: false, +}); + +const advanceToNextTransaction = ( + state: SignTransactionsState, + updatedAction: Action, +): SignTransactionsState => { + const isDone = + updatedAction.status === "SUCCESS" || + state.currentTxIndex === state.transactions.length - 1; + + const transactions = _Array.map(state.transactions, (tx) => + _Array + .findFirst(updatedAction.transactions, (newTx) => newTx.id === tx.id) + .pipe(Option.getOrElse(() => tx)), + ); + + if (isDone) { + return { + ...state, + action: updatedAction, + isDone: true, + transactions, + error: null, + step: null, + txHash: null, + }; + } + + return { + ...state, + action: updatedAction, + currentTxIndex: state.currentTxIndex + 1, + transactions, + isDone: false, + error: null, + step: "sign" as const, + txHash: null, + }; +}; + +export const makeTransactionExecution = (action: Action) => + Effect.gen(function* () { + const apiClient = yield* ApiClientService; + const events = yield* EventsService; + const walletAdapter = yield* WalletAdapterService; + const stateRef = yield* Ref.make(makeInitialState(action)); + + return Effect.gen(function* () { + const state = yield* Ref.get(stateRef); + const tx = yield* Effect.fromOption( + _Array.get(state.transactions, state.currentTxIndex), + ).pipe(Effect.orDie); + + const walletState = walletAdapter.getState(); + + if (walletState.status === "disconnected") { + return yield* Effect.die(new Error("Wallet is disconnected")); + } + + if (!tx.signablePayload) { + const result = advanceToNextTransaction(state, state.action); + + yield* Ref.set(stateRef, result); + + if (result.isDone) { + yield* events.publish({ + type: "action.completed", + action: makeLifecycleActionContext(result.action), + }); + } + + return result; + } + + const result: SignTransactionsState = yield* Match.value(state.step).pipe( + Match.when(null, () => + Effect.succeed({ + ...state, + error: null, + step: "sign" as const, + txHash: null, + }), + ), + Match.when("sign", () => + Effect.gen(function* () { + yield* events.publish({ + type: "transaction.signing_started", + action: makeLifecycleActionContext(state.action), + transaction: makeLifecycleTransactionContext(tx), + }); + + const decodedTx = yield* Schema.decodeUnknownEffect(Transaction)( + tx.signablePayload, + ).pipe(Effect.orDie); + + const signPayload = Schema.is(EIP712Tx)(decodedTx) + ? walletAdapter.signTypedData({ + account: walletState.currentAccount.address, + transaction: decodedTx, + }) + : walletAdapter.sendTransaction({ + account: walletState.currentAccount.address, + transaction: decodedTx, + }); + + const payload = yield* signPayload; + + yield* events.publish({ + type: "transaction.submitted", + action: makeLifecycleActionContext(state.action), + transaction: makeLifecycleTransactionContext(tx), + result: + tx.signingFormat === "EIP712_TYPED_DATA" + ? { type: "signedPayload", signedPayload: payload } + : { type: "transactionHash", transactionHash: payload }, + }); + + return { + ...state, + error: null, + step: "submit" as const, + txHash: payload, + }; + }), + ), + Match.when("submit", () => { + const payload = state.txHash; + + if (!payload) { + return Effect.fail(new TransactionFailedError()); + } + + return apiClient + .TransactionsControllerSubmitTransaction(tx.id, { + payload: + tx.signingFormat === "EIP712_TYPED_DATA" + ? { signedPayload: payload } + : { transactionHash: payload }, + }) + .pipe( + Effect.map(() => ({ + ...state, + error: null, + step: "check" as const, + txHash: payload, + })), + ); + }), + Match.when("check", () => + Effect.gen(function* () { + const updatedAction = yield* apiClient + .ActionsControllerGetAction(state.action.id, undefined) + .pipe( + Effect.andThen((res) => + Schema.decodeUnknownEffect(Action)(res), + ), + Effect.andThen((res) => + res.status === "SUCCESS" + ? Effect.succeed(res) + : Effect.fromOption( + _Array.findFirst( + res.transactions, + (newTx) => newTx.id === tx.id, + ), + ).pipe( + Effect.catch(() => + Effect.die( + new Error("Transaction not found in response"), + ), + ), + Effect.andThen((newTx) => + Match.value(newTx.status).pipe( + Match.when( + (status) => + status === "CONFIRMED" || + status === "BROADCASTED", + () => Effect.void, + ), + Match.when( + (status) => + status === "NOT_FOUND" || status === "FAILED", + () => Effect.fail(new TransactionFailedError()), + ), + Match.orElse(() => + Effect.fail(new TransactionNotConfirmedError()), + ), + ), + ), + Effect.as(res), + ), + ), + Effect.retry({ + while: (error) => + error._tag === "TransactionNotConfirmedError", + times: 20, + schedule: Schedule.spaced(Duration.seconds(2)), + }), + ); + + return advanceToNextTransaction(state, updatedAction); + }), + ), + Match.exhaustive, + ); + + yield* Ref.set(stateRef, result); + + if (result.isDone) { + yield* events.publish({ + type: "action.completed", + action: makeLifecycleActionContext(result.action), + }); + } + + return result; + }).pipe( + Effect.catch((error) => + Effect.gen(function* () { + const failedState = yield* Ref.updateAndGet(stateRef, (state) => ({ + ...state, + error, + })); + + yield* events.publish({ + type: "action.failed", + action: makeLifecycleActionContext(failedState.action), + error: Cause.pretty(Cause.fail(error)), + }); + + return failedState; + }), + ), + ); + }); + +export const transactionExecutionAtoms = Atom.family((action: Action) => { + const machineAtom = runtimeAtom.atom(makeTransactionExecution(action)); + + const machineStreamAtom = runtimeAtom.atom((ctx) => + ctx.result(machineAtom).pipe( + Effect.flatten, + Stream.fromEffect, + Stream.repeat(Schedule.forever), + Stream.takeUntil((state) => state.isDone), + ), + ); + + return { + machineStreamAtom, + }; +}); diff --git a/packages/common/src/atoms/wallet-adapter-atoms.ts b/packages/common/src/atoms/wallet-adapter-atoms.ts new file mode 100644 index 0000000..9c8c2bc --- /dev/null +++ b/packages/common/src/atoms/wallet-adapter-atoms.ts @@ -0,0 +1,40 @@ +import { Effect, Option, Stream } from "effect"; +import { AsyncResult, Atom } from "effect/unstable/reactivity"; +import type { ChainId, WalletAddress } from "../domain"; +import { WalletAdapterService } from "../services"; +import { runtimeAtom } from "../services/runtime"; + +export const walletAdapterAtom = runtimeAtom.atom( + Effect.gen(function* () { + return yield* WalletAdapterService; + }), +); + +export const walletAdapterStateAtom = runtimeAtom.atom( + Stream.unwrap(WalletAdapterService.useSync((service) => service.changes)), +); + +export const walletAdapterModeAtom = Atom.make((context) => { + const walletAdapter = context.get(walletAdapterAtom); + + return AsyncResult.value(walletAdapter).pipe( + Option.map((adapter) => adapter.mode), + Option.getOrElse(() => "browser" as const), + ); +}); + +export const switchWalletAdapterAccountAtom = runtimeAtom.fn( + Effect.fn(function* (address: WalletAddress) { + const walletAdapter = yield* WalletAdapterService; + + return yield* walletAdapter.switchAccount(address); + }), +); + +export const switchWalletAdapterChainAtom = runtimeAtom.fn( + Effect.fn(function* (chainId: ChainId) { + const walletAdapter = yield* WalletAdapterService; + + return yield* walletAdapter.switchChain(chainId); + }), +); diff --git a/packages/common/src/atoms/wallet-atom.ts b/packages/common/src/atoms/wallet-atom.ts index 7120cf2..1232aa6 100644 --- a/packages/common/src/atoms/wallet-atom.ts +++ b/packages/common/src/atoms/wallet-atom.ts @@ -1,34 +1,67 @@ -import { Effect, Stream } from "effect"; +import { Stream } from "effect"; import * as Atom from "effect/unstable/reactivity/Atom"; +import type { Wallet, WalletConnected } from "../domain/wallet"; import type { - BrowserWalletConnected, - LedgerWalletConnected, -} from "../domain/wallet"; + PerpsWalletAdapter, + WalletAdapterState, +} from "../domain/wallet-adapter"; import { runtimeAtom } from "../services/runtime"; -import { WalletService } from "../services/wallet/wallet-service"; +import { WalletAdapterService } from "../services/wallet-adapter"; + +const makeWallet = ( + adapter: PerpsWalletAdapter, + state: WalletAdapterState, +): Wallet => { + if (state.status === "disconnected") { + return { + type: adapter.mode, + status: "disconnected", + }; + } + + return { + type: adapter.mode, + status: "connected", + currentAccount: state.currentAccount, + accounts: state.accounts, + switchAccount: ({ account }) => adapter.switchAccount(account.address), + }; +}; + +const accountsAreEqual = ( + a: WalletConnected["accounts"], + b: WalletConnected["accounts"], +) => + a.length === b.length && + a.every((account, index) => { + const other = b[index]; + + return ( + other && + account.address === other.address && + account.id === other.id && + account.label === other.label + ); + }); export const walletAtom = runtimeAtom.atom( Stream.unwrap( - WalletService.use((ws) => Effect.succeed(ws.walletStream)), + WalletAdapterService.useSync((adapter) => + adapter.changes.pipe(Stream.map((state) => makeWallet(adapter, state))), + ), ).pipe( Stream.changesWith((a, b) => { - if (a.status !== b.status) { + if (a.type !== b.type || a.status !== b.status) { return false; } if (a.status === "connected" && b.status === "connected") { - const addressMatch = - a.currentAccount.address === b.currentAccount.address; - - if (a.type === "ledger" && b.type === "ledger") { - const aAccount = a.currentAccount; - const bAccount = b.currentAccount; - return addressMatch && aAccount.id === bAccount.id; - } - - if (a.type === "browser") { - return addressMatch; - } + return ( + a.currentAccount.address === b.currentAccount.address && + a.currentAccount.id === b.currentAccount.id && + a.currentAccount.label === b.currentAccount.label && + accountsAreEqual(a.accounts, b.accounts) + ); } return true; @@ -36,10 +69,6 @@ export const walletAtom = runtimeAtom.atom( ), ); -export const switchLedgerAccountAtom = Atom.family( - (wallet: LedgerWalletConnected) => runtimeAtom.fn(wallet.switchAccount), -); - -export const switchBrowserAccountAtom = Atom.family( - (wallet: BrowserWalletConnected) => runtimeAtom.fn(wallet.switchAccount), +export const switchWalletAccountAtom = Atom.family((wallet: WalletConnected) => + runtimeAtom.fn(wallet.switchAccount), ); diff --git a/packages/common/src/components/molecules/address-switcher.tsx b/packages/common/src/components/molecules/address-switcher.tsx index a80c773..226c850 100644 --- a/packages/common/src/components/molecules/address-switcher.tsx +++ b/packages/common/src/components/molecules/address-switcher.tsx @@ -1,39 +1,26 @@ import { useAtomSet } from "@effect/atom-react"; import { useDisconnect } from "@reown/appkit/react"; -import { Match } from "effect"; import { Check, ChevronDown, Copy, LogOut, Wallet } from "lucide-react"; import type React from "react"; import { useEffect, useRef, useState } from "react"; -import { - switchBrowserAccountAtom, - switchLedgerAccountAtom, -} from "../../atoms/wallet-atom"; -import type { - BrowserWalletConnected, - LedgerWalletConnected, -} from "../../domain/wallet"; -import { - isBrowserWalletConnected, - isLedgerWalletConnected, - type WalletConnected, -} from "../../domain/wallet"; +import { switchWalletAccountAtom } from "../../atoms/wallet-atom"; +import type { WalletAccount, WalletConnected } from "../../domain/wallet"; +import { isBrowserWalletConnected } from "../../domain/wallet"; import { cn, truncateAddress } from "../../lib/utils"; import { Button } from "../ui/button"; import { Dialog } from "../ui/dialog"; import { Text } from "../ui/text"; -const LedgerAccountList = ({ +const WalletAccountList = ({ wallet, onAccountSwitch, }: { - wallet: LedgerWalletConnected; + wallet: WalletConnected; onAccountSwitch: () => void; }) => { - const switchAccount = useAtomSet(switchLedgerAccountAtom(wallet)); + const switchAccount = useAtomSet(switchWalletAccountAtom(wallet)); - const handleAccountSwitch = ( - account: LedgerWalletConnected["accounts"][number], - ) => { + const handleAccountSwitch = (account: WalletAccount) => { switchAccount({ account }); onAccountSwitch(); }; @@ -47,57 +34,7 @@ const LedgerAccountList = ({ return ( - ); - }); -}; - -const BrowserAccountList = ({ - wallet, - onAccountSwitch, -}: { - wallet: BrowserWalletConnected; - onAccountSwitch: () => void; -}) => { - const switchAccount = useAtomSet(switchBrowserAccountAtom(wallet)); - - const handleAccountSwitch = ( - account: BrowserWalletConnected["accounts"][number], - ) => { - switchAccount({ account }); - onAccountSwitch(); - }; - - return wallet.accounts.map((account) => { - const isCurrentAccount = account.address === wallet.currentAccount.address; - - return ( -
- {truncateAddress(account.address)} + {account.label ?? truncateAddress(account.address)} {isCurrentAccount && } @@ -264,20 +201,10 @@ export const AddressSwitcher = ({ wallet, trigger }: AddressSwitcherProps) => {
- {Match.value(wallet).pipe( - Match.when(isLedgerWalletConnected, (w) => ( - setOpen(false)} - /> - )), - Match.orElse((w) => ( - setOpen(false)} - /> - )), - )} + setOpen(false)} + />
= { - TransactionNotConfirmedError: "Transaction not confirmed", - TransactionFailedError: "Transaction failed", - DeserializeTransactionError: "Failed to deserialize transaction", - SignTransactionError: "Failed to sign transaction", - ResponseError: "Network request failed", - RequestError: "Failed to send request", - ParseError: "Failed to parse response", - }; + const errorDescriptions: Record = { + TransactionNotConfirmedError: "Transaction not confirmed", + TransactionFailedError: "Transaction failed", + WalletMissingCapabilityError: "Wallet capability is unavailable", + WalletSendTransactionError: "Failed to send transaction", + WalletSignTypedDataError: "Failed to sign typed data", + WalletSwitchChainError: "Failed to switch chain", + SignTransactionError: "Failed to sign transaction", + ResponseError: "Network request failed", + RequestError: "Failed to send request", + ParseError: "Failed to parse response", + }; - return errorDescriptions[error._tag] || "An error occurred"; - } + return errorDescriptions[error._tag] || "An error occurred"; +} + +function getErrorReason(error: NonNullable) { + if ("reason" in error) return error.reason; + if ("cause" in error) return error.cause; - return "An error occurred"; + return error; } diff --git a/packages/common/src/components/ui/card.tsx b/packages/common/src/components/ui/card.tsx index 052a0b1..724783a 100644 --- a/packages/common/src/components/ui/card.tsx +++ b/packages/common/src/components/ui/card.tsx @@ -36,4 +36,4 @@ function CardSection({ className, position, ...props }: CardSectionProps) { ); } -export { Card, CardSection, cardVariants, cardSectionVariants }; +export { Card, CardSection, cardSectionVariants, cardVariants }; diff --git a/packages/common/src/components/ui/skeleton.tsx b/packages/common/src/components/ui/skeleton.tsx index 96fd951..0a63fa0 100644 --- a/packages/common/src/components/ui/skeleton.tsx +++ b/packages/common/src/components/ui/skeleton.tsx @@ -43,4 +43,4 @@ function AssetSkeleton({ className }: AssetSkeletonProps) { ); } -export { Skeleton, AssetSkeleton }; +export { AssetSkeleton, Skeleton }; diff --git a/packages/common/src/components/ui/slider.tsx b/packages/common/src/components/ui/slider.tsx index 4a8a1f4..753105b 100644 --- a/packages/common/src/components/ui/slider.tsx +++ b/packages/common/src/components/ui/slider.tsx @@ -159,13 +159,13 @@ const SliderThumb = SliderPrimitive.Thumb; export { Slider, - SliderRoot, SliderControl, - SliderTrack, SliderIndicator, + SliderRoot, SliderThumb, + SliderTrack, sliderControlVariants, - sliderTrackVariants, sliderIndicatorVariants, sliderThumbVariants, + sliderTrackVariants, }; diff --git a/packages/common/src/components/ui/tabs.tsx b/packages/common/src/components/ui/tabs.tsx index 86ef6f8..1f34e00 100644 --- a/packages/common/src/components/ui/tabs.tsx +++ b/packages/common/src/components/ui/tabs.tsx @@ -93,4 +93,4 @@ function TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) { ); } -export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }; +export { Tabs, TabsContent, TabsList, TabsTrigger, tabsListVariants }; diff --git a/packages/common/src/context/appkit.tsx b/packages/common/src/context/appkit.tsx index 6408784..fa9f357 100644 --- a/packages/common/src/context/appkit.tsx +++ b/packages/common/src/context/appkit.tsx @@ -1,25 +1,18 @@ import { useAtomValue } from "@effect/atom-react"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import { WagmiProvider } from "wagmi"; -import { configAtom } from "../atoms/config-atom"; -import { walletAtom } from "../atoms/wallet-atom"; - -const qc = new QueryClient(); +import { walletAdapterAtom } from "../atoms/wallet-adapter-atoms"; export const AppKit = ({ children }: { children: React.ReactNode }) => { - const config = useAtomValue(configAtom); - const wallet = useAtomValue(walletAtom); - - const result = Result.all({ - config, - wallet, - }); + const walletAdapter = useAtomValue(walletAdapterAtom); - if (Result.isSuccess(result) && result.value.wallet.type === "browser") { + if ( + Result.isSuccess(walletAdapter) && + walletAdapter.value.mode === "browser" + ) { return ( - - {children} + + {children} ); } diff --git a/packages/common/src/context/index.tsx b/packages/common/src/context/index.tsx index 8105a5f..595a32c 100644 --- a/packages/common/src/context/index.tsx +++ b/packages/common/src/context/index.tsx @@ -1,18 +1,89 @@ +import { RegistryProvider, useAtomSubscribe } from "@effect/atom-react"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { AsyncResult } from "effect/unstable/reactivity"; import { StrictMode } from "react"; +import { + externalWalletSourceAtom, + lifecycleEventAtom, + perpsConfigAtom, +} from "../atoms"; import { Toaster } from "../components/ui/toaster"; +import type { ExternalWalletSource, LifecycleEvent } from "../domain"; +import type { PerpsConfig } from "../services"; import { AppKit } from "./appkit"; import { RootContainerProvider } from "./root-container"; -export const Providers = ({ children }: { children: React.ReactNode }) => { +const queryClient = new QueryClient(); + +type ProvidersProps = { + children: React.ReactNode; + config: PerpsConfig; + externalWalletSource?: ExternalWalletSource; + onLifecycleEvent?: (event: LifecycleEvent) => void; +}; + +const ExternalLifecycleEventBridge = ({ + onLifecycleEvent, +}: { + onLifecycleEvent: NonNullable; +}) => { + useAtomSubscribe(lifecycleEventAtom, (event) => { + if (AsyncResult.isSuccess(event)) { + onLifecycleEvent(event.value); + } + }); + + return null; +}; + +const CommonProviders = ({ children }: { children: React.ReactNode }) => ( + + + + + {children} + + + +); + +export const Providers = ({ + children, + config, + externalWalletSource, + onLifecycleEvent, +}: ProvidersProps) => { + const initialValues = [ + [perpsConfigAtom, config] as const, + ...(externalWalletSource + ? ([[externalWalletSourceAtom, externalWalletSource]] as const) + : []), + ]; + + if (externalWalletSource) { + return ( + + + {children} + {onLifecycleEvent && ( + + )} + + + ); + } + return ( - + - - + {children} - + {onLifecycleEvent && ( + + )} + - + ); }; diff --git a/packages/common/src/domain/action-transaction.ts b/packages/common/src/domain/action-transaction.ts new file mode 100644 index 0000000..2590855 --- /dev/null +++ b/packages/common/src/domain/action-transaction.ts @@ -0,0 +1,14 @@ +import { Schema } from "effect"; +import * as ApiSchemas from "../services/api-client/api-schemas"; +import { ChainId, TransactionId } from "./ids"; +import { PendingAction } from "./pending-action"; + +export class ActionTransaction extends Schema.Class( + "ActionTransaction", +)({ + ...ApiSchemas.TransactionDto.fields, + id: TransactionId, + chainId: ChainId, + address: Schema.String, + args: Schema.optionalKey(PendingAction.fields.args), +}) {} diff --git a/packages/common/src/domain/action.ts b/packages/common/src/domain/action.ts new file mode 100644 index 0000000..9221e53 --- /dev/null +++ b/packages/common/src/domain/action.ts @@ -0,0 +1,25 @@ +import { Schema } from "effect"; +import * as ApiSchemas from "../services/api-client/api-schemas"; +import { ActionTransaction } from "./action-transaction"; +import { ActionId, ProviderId } from "./ids"; +import { NumberFromString } from "./scalars"; +import { TokenIdentifier } from "./token"; + +class ActionSummary extends Schema.Class("ActionSummary")({ + ...ApiSchemas.ActionDto.fields.summary.members[0].fields, + size: Schema.optionalKey(NumberFromString), + amount: Schema.optionalKey(NumberFromString), + pnl: Schema.optionalKey(NumberFromString), + margin: Schema.optionalKey(NumberFromString), + fee: Schema.optionalKey(NumberFromString), + collateral: Schema.optionalKey(NumberFromString), + fromToken: Schema.optionalKey(TokenIdentifier), +}) {} + +export class Action extends Schema.Class("Action")({ + ...ApiSchemas.ActionDto.fields, + id: ActionId, + providerId: ProviderId, + summary: Schema.NullOr(ActionSummary), + transactions: Schema.Array(ActionTransaction), +}) {} diff --git a/packages/common/src/domain/api-event.ts b/packages/common/src/domain/api-event.ts new file mode 100644 index 0000000..d5968f5 --- /dev/null +++ b/packages/common/src/domain/api-event.ts @@ -0,0 +1,50 @@ +import { Schema } from "effect"; +import * as ApiSchemas from "../services/api-client/api-schemas"; +import { Action } from "./action"; +import { + ActionId, + EventId, + MarketId, + ProviderId, + ProviderOrderId, +} from "./ids"; +import { NumberFromString } from "./scalars"; + +class ApiEventOrder extends Schema.Class("ApiEventOrder")({ + ...ApiSchemas.EventDto.fields.order.fields, + orderId: ProviderOrderId, + marketId: MarketId, + originalSizeBase: NumberFromString, + remainingSizeBase: NumberFromString, + closedPnl: Schema.optionalKey(NumberFromString), +}) {} + +export class ApiEvent extends Schema.Class("ApiEvent")({ + ...ApiSchemas.EventDto.fields, + id: EventId, + providerId: ProviderId, + marketId: Schema.optionalKey(Schema.NullOr(MarketId)), + perpActionId: Schema.optionalKey(ActionId), + providerOrderId: Schema.optionalKey(Schema.NullOr(ProviderOrderId)), + order: ApiEventOrder, +}) {} + +export class ActivityActionItem extends Schema.Class( + "ActivityActionItem", +)({ + type: Schema.Literal("action"), + action: Action, +}) {} + +export class ActivityEventItem extends Schema.Class( + "ActivityEventItem", +)({ + type: Schema.Literal("event"), + event: ApiEvent, +}) {} + +export const ActivityItem = Schema.Union([ + ActivityActionItem, + ActivityEventItem, +]); +export type ActivityItem = typeof ActivityItem.Type; diff --git a/packages/common/src/domain/chains/index.ts b/packages/common/src/domain/chains/index.ts index 22d91bc..bd74516 100644 --- a/packages/common/src/domain/chains/index.ts +++ b/packages/common/src/domain/chains/index.ts @@ -3,4 +3,3 @@ import type { SupportedEvmChain } from "./evm"; export type SupportedSKChains = SupportedEvmChain; export * from "./evm"; -export * from "./ledger"; diff --git a/packages/common/src/domain/chains/ledger.ts b/packages/common/src/domain/chains/ledger.ts deleted file mode 100644 index a2f53d6..0000000 --- a/packages/common/src/domain/chains/ledger.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { Currency, Families } from "@ledgerhq/wallet-api-client"; -import { EvmNetworks } from "@stakekit/common"; -import type { SupportedSKChains } from "./index"; - -export type SupportedLedgerLiveFamilies = Extract; - -export const supportedLedgerFamiliesWithCurrency = { - ethereum: { - ethereum: { - currencyId: "ethereum", - family: "ethereum", - skChainName: EvmNetworks.Ethereum, - }, - base: { - currencyId: "base", - family: "ethereum", - skChainName: EvmNetworks.Base, - }, - arbitrum: { - currencyId: "arbitrum", - family: "ethereum", - skChainName: EvmNetworks.Arbitrum, - }, - optimism: { - currencyId: "optimism", - family: "ethereum", - skChainName: EvmNetworks.Optimism, - }, - monad: { - currencyId: "monad", - family: "ethereum", - skChainName: EvmNetworks.Monad, - }, - hyperevm: { - currencyId: "hyperevm", - family: "ethereum", - skChainName: EvmNetworks.HyperEVM, - }, - }, -} as const satisfies SupportedLedgerFamiliesWithCurrency; - -export type SupportedLedgerFamiliesWithCurrency = Record< - SupportedLedgerLiveFamilies, - Partial< - Record< - (Currency["id"] & {}) | "*", - { - family: SupportedLedgerLiveFamilies; - currencyId: Currency["id"]; - skChainName: SupportedSKChains; - } - > - > ->; diff --git a/packages/common/src/domain/ids.ts b/packages/common/src/domain/ids.ts new file mode 100644 index 0000000..1537af4 --- /dev/null +++ b/packages/common/src/domain/ids.ts @@ -0,0 +1,34 @@ +import { Schema } from "effect"; +import { LowercaseString } from "./scalars"; + +export const ProviderId = Schema.String.pipe(Schema.brand("ProviderId")); +export type ProviderId = typeof ProviderId.Type; + +export const MarketId = Schema.String.pipe(Schema.brand("MarketId")); +export type MarketId = typeof MarketId.Type; + +export const ActionId = Schema.String.pipe(Schema.brand("ActionId")); +export type ActionId = typeof ActionId.Type; + +export const TransactionId = Schema.String.pipe(Schema.brand("TransactionId")); +export type TransactionId = typeof TransactionId.Type; + +export const EventId = Schema.String.pipe(Schema.brand("EventId")); +export type EventId = typeof EventId.Type; + +export const ChainId = Schema.String.pipe(Schema.brand("ChainId")); +export type ChainId = typeof ChainId.Type; + +export const WalletAddress = Schema.TemplateLiteral([ + Schema.Literal("0x"), + Schema.String, +]).pipe(Schema.brand("WalletAddress")); +export type WalletAddress = typeof WalletAddress.Type; + +export const TokenAddress = LowercaseString.pipe(Schema.brand("TokenAddress")); +export type TokenAddress = typeof TokenAddress.Type; + +export const ProviderOrderId = Schema.String.pipe( + Schema.brand("ProviderOrderId"), +); +export type ProviderOrderId = typeof ProviderOrderId.Type; diff --git a/packages/common/src/domain/index.ts b/packages/common/src/domain/index.ts index a8bc10d..fb0a505 100644 --- a/packages/common/src/domain/index.ts +++ b/packages/common/src/domain/index.ts @@ -1,6 +1,20 @@ +export * from "./action"; +export * from "./action-transaction"; +export * from "./api-event"; export * from "./chains"; -export * from "./signer"; +export * from "./ids"; +export * from "./internal-event"; +export * from "./market"; +export * from "./model-updates"; +export * from "./pending-action"; +export * from "./portfolio"; +export * from "./provider"; +export * from "./scalars"; +export * from "./token"; export * from "./tokens"; export * from "./transactions"; export * from "./types"; export * from "./wallet"; +export * from "./wallet-adapter"; +export * from "./wallet-errors"; +export * from "./wallet-source"; diff --git a/packages/common/src/domain/internal-event.ts b/packages/common/src/domain/internal-event.ts new file mode 100644 index 0000000..e6c9d5a --- /dev/null +++ b/packages/common/src/domain/internal-event.ts @@ -0,0 +1,62 @@ +import type { Action } from "./action"; +import type { ActionTransaction } from "./action-transaction"; + +export type LifecycleEventActionContext = { + id: Action["id"]; + action: Action["action"]; + status: Action["status"]; +}; + +export type LifecycleEventTransactionContext = { + id: ActionTransaction["id"]; + type: ActionTransaction["type"]; + status: ActionTransaction["status"]; +}; + +export type TransactionSigningStartedEvent = { + type: "transaction.signing_started"; + action: LifecycleEventActionContext; + transaction: LifecycleEventTransactionContext; +}; + +export type TransactionSubmittedEvent = { + type: "transaction.submitted"; + action: LifecycleEventActionContext; + transaction: LifecycleEventTransactionContext; + result: + | { type: "transactionHash"; transactionHash: string } + | { type: "signedPayload"; signedPayload: string }; +}; + +export type ActionCompletedEvent = { + type: "action.completed"; + action: LifecycleEventActionContext; +}; + +export type ActionFailedEvent = { + type: "action.failed"; + action: LifecycleEventActionContext; + error: string; +}; + +export type LifecycleEvent = + | TransactionSigningStartedEvent + | TransactionSubmittedEvent + | ActionCompletedEvent + | ActionFailedEvent; + +export const makeLifecycleActionContext = ( + action: Action, +): LifecycleEventActionContext => ({ + id: action.id, + action: action.action, + status: action.status, +}); + +export const makeLifecycleTransactionContext = ( + transaction: ActionTransaction, +): LifecycleEventTransactionContext => ({ + id: transaction.id, + type: transaction.type, + status: transaction.status, +}); diff --git a/packages/common/src/domain/market.ts b/packages/common/src/domain/market.ts new file mode 100644 index 0000000..7412174 --- /dev/null +++ b/packages/common/src/domain/market.ts @@ -0,0 +1,37 @@ +import { Schema } from "effect"; +import * as ApiSchemas from "../services/api-client/api-schemas"; +import { MarketId, ProviderId } from "./ids"; +import { TokenInfo } from "./token"; + +const MarketFields = { + ...ApiSchemas.MarketDto.fields, + id: MarketId, + providerId: ProviderId, + baseAsset: TokenInfo, + quoteAsset: TokenInfo, +}; + +export class Market extends Schema.Class("Market")(MarketFields) {} + +export class MarketDetail extends Schema.Class("MarketDetail")({ + ...ApiSchemas.MarketDetailDto.fields, + ...MarketFields, + chartConfig: ApiSchemas.MarketDetailDto.fields.chartConfig, +}) {} + +export class Candle extends Schema.Class("Candle")({ + ...ApiSchemas.CandleDto.fields, + open: Schema.NumberFromString, + high: Schema.NumberFromString, + low: Schema.NumberFromString, + close: Schema.NumberFromString, + volume: Schema.NumberFromString, +}) {} + +export class CandlesResponse extends Schema.Class( + "CandlesResponse", +)({ + ...ApiSchemas.CandlesResponseDto.fields, + marketId: MarketId, + candles: Schema.Array(Candle), +}) {} diff --git a/packages/common/src/domain/model-updates.ts b/packages/common/src/domain/model-updates.ts new file mode 100644 index 0000000..07f806a --- /dev/null +++ b/packages/common/src/domain/model-updates.ts @@ -0,0 +1,18 @@ +import { Market } from "./market"; +import { Position } from "./portfolio"; + +export const updateMarketModel = (market: Market, updates: Partial) => + new Market({ ...market, ...updates }); + +export const updatePositionModel = ( + position: Position, + updates: Partial, +) => new Position({ ...position, ...updates }); + +export const updateMarketMarkPrice = (market: Market, markPrice: number) => + updateMarketModel(market, { markPrice }); + +export const updatePositionMarkPrice = ( + position: Position, + markPrice: number, +) => updatePositionModel(position, { markPrice }); diff --git a/packages/common/src/domain/pending-action.ts b/packages/common/src/domain/pending-action.ts new file mode 100644 index 0000000..4c4a980 --- /dev/null +++ b/packages/common/src/domain/pending-action.ts @@ -0,0 +1,22 @@ +import { Schema } from "effect"; +import * as ApiSchemas from "../services/api-client/api-schemas"; +import { MarketId } from "./ids"; +import { NumberFromString } from "./scalars"; +import { TokenIdentifier } from "./token"; + +class PendingActionArgs extends Schema.Class( + "PendingActionArgs", +)({ + ...ApiSchemas.PendingActionDto.fields.args.fields, + marketId: Schema.optionalKey(MarketId), + amount: Schema.optionalKey(NumberFromString), + size: Schema.optionalKey(NumberFromString), + fromToken: Schema.optionalKey(TokenIdentifier), +}) {} + +export class PendingAction extends Schema.Class("PendingAction")( + { + ...ApiSchemas.PendingActionDto.fields, + args: PendingActionArgs, + }, +) {} diff --git a/packages/common/src/domain/portfolio.ts b/packages/common/src/domain/portfolio.ts new file mode 100644 index 0000000..d8a2702 --- /dev/null +++ b/packages/common/src/domain/portfolio.ts @@ -0,0 +1,26 @@ +import { Schema } from "effect"; +import * as ApiSchemas from "../services/api-client/api-schemas"; +import { MarketId, ProviderId } from "./ids"; +import { PendingAction } from "./pending-action"; +import { NumberFromString } from "./scalars"; +import { TokenInfo } from "./token"; + +export class Balance extends Schema.Class("Balance")({ + ...ApiSchemas.BalanceDto.fields, + providerId: ProviderId, + collateral: TokenInfo, +}) {} + +export class Position extends Schema.Class("Position")({ + ...ApiSchemas.PositionDto.fields, + marketId: MarketId, + size: NumberFromString, + pendingActions: Schema.Array(PendingAction), +}) {} + +export class Order extends Schema.Class("Order")({ + ...ApiSchemas.OrderDto.fields, + marketId: MarketId, + size: NumberFromString, + pendingActions: Schema.Array(PendingAction), +}) {} diff --git a/packages/common/src/domain/provider.ts b/packages/common/src/domain/provider.ts new file mode 100644 index 0000000..66ed628 --- /dev/null +++ b/packages/common/src/domain/provider.ts @@ -0,0 +1,9 @@ +import { Schema } from "effect"; +import * as ApiSchemas from "../services/api-client/api-schemas"; +import { ProviderId } from "./ids"; + +export class Provider extends Schema.Class("Provider")({ + ...ApiSchemas.ProviderDto.fields, + id: ProviderId, + supportedActions: Schema.Array(ApiSchemas.PerpActionTypes), +}) {} diff --git a/packages/common/src/domain/scalars.ts b/packages/common/src/domain/scalars.ts new file mode 100644 index 0000000..74330e9 --- /dev/null +++ b/packages/common/src/domain/scalars.ts @@ -0,0 +1,20 @@ +import { Schema, SchemaTransformation } from "effect"; + +export const NumberFromString = Schema.NumberFromString; +export type NumberFromString = typeof NumberFromString.Type; + +export const BigIntFromString = Schema.String.pipe( + Schema.decodeTo(Schema.BigInt, SchemaTransformation.bigintFromString), +); +export type BigIntFromString = typeof BigIntFromString.Type; + +export const LowercaseString = Schema.String.pipe( + Schema.decode(SchemaTransformation.toLowerCase()), +); +export type LowercaseString = typeof LowercaseString.Type; + +export const HexString = Schema.TemplateLiteral([ + Schema.Literal("0x"), + Schema.String, +]); +export type HexString = typeof HexString.Type; diff --git a/packages/common/src/domain/signer.ts b/packages/common/src/domain/signer.ts deleted file mode 100644 index 5b78354..0000000 --- a/packages/common/src/domain/signer.ts +++ /dev/null @@ -1,75 +0,0 @@ -import type { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; -import { Data, type Effect, Schema, type Stream } from "effect"; -import type { Transaction, TransactionHash } from "./transactions"; - -export const WalletAccountAddress = Schema.String.pipe( - Schema.brand("WalletAccountAddress"), -); - -const BrowserWalletAccount = Schema.Struct({ - _kind: Schema.tagDefaultOmit("browserWalletAccount"), - address: WalletAccountAddress, -}); - -const LedgerWalletAccount = Schema.Struct({ - _kind: Schema.tagDefaultOmit("ledgerWalletAccount"), - id: Schema.String.pipe(Schema.brand("WalletAccountId")), - address: WalletAccountAddress, -}); - -export const makeBrowserWalletAccount = Schema.decodeSync(BrowserWalletAccount); -export const makeLedgerWalletAccount = Schema.decodeSync(LedgerWalletAccount); - -export type BrowserWalletAccount = typeof BrowserWalletAccount.Type; -export type LedgerWalletAccount = typeof LedgerWalletAccount.Type; - -export const WalletAccount = Schema.Union([ - BrowserWalletAccount, - LedgerWalletAccount, -]); - -export type WalletAccount = typeof WalletAccount.Type; - -export type AccountsState = - | { status: "disconnected" } - | { - status: "connected"; - currentAccount: T; - accounts: T[]; - }; - -type SignerCommon = { - signTransaction: (args: { - transaction: Transaction; - }) => Effect.Effect; - switchAccount: (args: { - account: T; - }) => Effect.Effect; - accountsStream: Stream.Stream>; - getAccountState: Effect.Effect>; -}; - -export type BrowserSigner = { - type: "browser"; - wagmiAdapter: WagmiAdapter; -} & SignerCommon; - -export type LedgerSigner = { - type: "ledger"; -} & SignerCommon; - -export type Signer = BrowserSigner | LedgerSigner; - -export class SwitchAccountError extends Data.TaggedError("SwitchAccountError")<{ - cause: unknown; -}> {} - -export class SignTransactionError extends Data.TaggedError( - "SignTransactionError", -)<{ - cause: unknown; -}> {} - -export class SwitchChainError extends Data.TaggedError("SwitchChainError")<{ - cause: unknown; -}> {} diff --git a/packages/common/src/domain/token.ts b/packages/common/src/domain/token.ts new file mode 100644 index 0000000..6a66cf5 --- /dev/null +++ b/packages/common/src/domain/token.ts @@ -0,0 +1,17 @@ +import { Schema } from "effect"; +import * as ApiSchemas from "../services/api-client/api-schemas"; +import { TokenAddress } from "./ids"; + +export class TokenIdentifier extends Schema.Class( + "TokenIdentifier", +)({ + ...ApiSchemas.TokenIdentifierDto.fields, + address: Schema.optionalKey(TokenAddress), +}) {} + +export class TokenInfo extends Schema.Class("TokenInfo")({ + ...ApiSchemas.MarketDto.fields.baseAsset.fields, + address: Schema.optionalKey(TokenAddress), +}) {} + +export type Token = TokenInfo; diff --git a/packages/common/src/domain/transactions.ts b/packages/common/src/domain/transactions.ts index 2d158c9..882eff8 100644 --- a/packages/common/src/domain/transactions.ts +++ b/packages/common/src/domain/transactions.ts @@ -30,3 +30,6 @@ export const TransactionHash = Schema.String.pipe( ); export type TransactionHash = typeof TransactionHash.Type; + +export const SignedPayload = Schema.String.pipe(Schema.brand("SignedPayload")); +export type SignedPayload = typeof SignedPayload.Type; diff --git a/packages/common/src/domain/types.ts b/packages/common/src/domain/types.ts index 037d656..7df8e9a 100644 --- a/packages/common/src/domain/types.ts +++ b/packages/common/src/domain/types.ts @@ -1,8 +1,8 @@ -import type { MarketDto } from "../services/api-client/api-schemas"; +import type { TokenInfo } from "./token"; -export type TokenDto = MarketDto["baseAsset"]; +export type TokenData = TokenInfo; -export type TokenString = `${TokenDto["network"]}-${TokenDto["address"]}`; +export type TokenString = `${TokenData["network"]}-${string}`; export type TokenPrices = Record< TokenString, @@ -10,7 +10,7 @@ export type TokenPrices = Record< >; export type TokenBalance = { - token: TokenDto; + token: TokenData; amount: string; price: number; }; diff --git a/packages/common/src/domain/wallet-adapter.ts b/packages/common/src/domain/wallet-adapter.ts new file mode 100644 index 0000000..4f1c800 --- /dev/null +++ b/packages/common/src/domain/wallet-adapter.ts @@ -0,0 +1,100 @@ +import type { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; +import { type Effect, Schema, type Stream } from "effect"; +import { type ChainId, WalletAddress } from "./ids"; +import { + EIP712Tx, + EvmTx, + type SignedPayload, + type TransactionHash, +} from "./transactions"; +import type { + WalletMissingCapabilityError, + WalletSendTransactionError, + WalletSignTypedDataError, + WalletSwitchAccountError, + WalletSwitchChainError, +} from "./wallet-errors"; + +export const WalletAdapterMode = Schema.Literals(["browser", "external"]); +export type WalletAdapterMode = typeof WalletAdapterMode.Type; + +export const WalletAdapterAccount = Schema.Struct({ + address: WalletAddress, + id: Schema.optionalKey(Schema.String), + label: Schema.optionalKey(Schema.String), +}); +export type WalletAdapterAccount = typeof WalletAdapterAccount.Type; + +export const makeWalletAdapterAccount = Schema.decodeSync(WalletAdapterAccount); + +export const DisconnectedWalletAdapterState = Schema.Struct({ + status: Schema.Literal("disconnected"), +}); +export type DisconnectedWalletAdapterState = + typeof DisconnectedWalletAdapterState.Type; + +export const ConnectedWalletAdapterState = Schema.Struct({ + status: Schema.Literal("connected"), + currentAccount: WalletAdapterAccount, + accounts: Schema.NonEmptyArray(WalletAdapterAccount), +}); +export type ConnectedWalletAdapterState = + typeof ConnectedWalletAdapterState.Type; + +export const WalletAdapterState = Schema.Union([ + DisconnectedWalletAdapterState, + ConnectedWalletAdapterState, +]); +export type WalletAdapterState = typeof WalletAdapterState.Type; + +export const EvmTransactionRequest = Schema.Struct({ + account: WalletAddress, + transaction: EvmTx, +}); +export type EvmTransactionRequest = typeof EvmTransactionRequest.Type; + +export const TypedDataRequest = Schema.Struct({ + account: WalletAddress, + transaction: EIP712Tx, +}); +export type TypedDataRequest = typeof TypedDataRequest.Type; + +type WalletAdapterCommon = { + getState: () => WalletAdapterState; + changes: Stream.Stream; + sendTransaction: ( + request: EvmTransactionRequest, + ) => Effect.Effect< + TransactionHash, + WalletSwitchChainError | WalletSendTransactionError + >; + signTypedData: ( + request: TypedDataRequest, + ) => Effect.Effect< + SignedPayload, + WalletSwitchChainError | WalletSignTypedDataError + >; + switchAccount: ( + address: WalletAddress, + ) => Effect.Effect< + void, + WalletMissingCapabilityError | WalletSwitchAccountError + >; + switchChain: ( + chainId: ChainId, + ) => Effect.Effect< + void, + WalletMissingCapabilityError | WalletSwitchChainError + >; +}; + +export type BrowserWalletAdapter = { + mode: "browser"; + wagmiAdapter: WagmiAdapter; +} & WalletAdapterCommon; + +export type ExternalWalletAdapter = { + mode: "external"; +} & WalletAdapterCommon; + +export type PerpsWalletAdapter = BrowserWalletAdapter | ExternalWalletAdapter; diff --git a/packages/common/src/domain/wallet-errors.ts b/packages/common/src/domain/wallet-errors.ts new file mode 100644 index 0000000..050df08 --- /dev/null +++ b/packages/common/src/domain/wallet-errors.ts @@ -0,0 +1,31 @@ +import { Data } from "effect"; + +export class WalletMissingCapabilityError extends Data.TaggedError( + "WalletMissingCapabilityError", +)<{ + capability: "switchAccount" | "switchChain"; +}> {} + +export class WalletSendTransactionError extends Data.TaggedError( + "WalletSendTransactionError", +)<{ + reason: unknown; +}> {} + +export class WalletSignTypedDataError extends Data.TaggedError( + "WalletSignTypedDataError", +)<{ + reason: unknown; +}> {} + +export class WalletSwitchAccountError extends Data.TaggedError( + "WalletSwitchAccountError", +)<{ + reason: unknown; +}> {} + +export class WalletSwitchChainError extends Data.TaggedError( + "WalletSwitchChainError", +)<{ + reason: unknown; +}> {} diff --git a/packages/common/src/domain/wallet-source.ts b/packages/common/src/domain/wallet-source.ts new file mode 100644 index 0000000..cd165a2 --- /dev/null +++ b/packages/common/src/domain/wallet-source.ts @@ -0,0 +1,30 @@ +import type { ChainId, WalletAddress } from "./ids"; +import type { SignedPayload, TransactionHash } from "./transactions"; +import type { + EvmTransactionRequest, + TypedDataRequest, + WalletAdapterState, +} from "./wallet-adapter"; + +export type WalletAdapterStateEncoded = typeof WalletAdapterState.Encoded; +export type TransactionHashEncoded = typeof TransactionHash.Encoded; +export type SignedPayloadEncoded = typeof SignedPayload.Encoded; +export type ChainIdEncoded = typeof ChainId.Encoded; +export type WalletAddressEncoded = typeof WalletAddress.Encoded; +export type TypedDataRequestEncoded = typeof TypedDataRequest.Encoded; +export type EvmTransactionRequestEncoded = typeof EvmTransactionRequest.Encoded; + +export type ExternalWalletSource = { + getState: () => WalletAdapterStateEncoded; + subscribe: ( + listener: (state: WalletAdapterStateEncoded) => void, + ) => () => void; + sendTransaction: ( + request: EvmTransactionRequestEncoded, + ) => Promise; + signTypedData: ( + request: TypedDataRequestEncoded, + ) => Promise; + switchAccount?: (address: WalletAddressEncoded) => Promise; + switchChain?: (chainId: ChainIdEncoded) => Promise; +}; diff --git a/packages/common/src/domain/wallet.ts b/packages/common/src/domain/wallet.ts index b5db992..e4cfc67 100644 --- a/packages/common/src/domain/wallet.ts +++ b/packages/common/src/domain/wallet.ts @@ -1,22 +1,21 @@ -import type { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; import type { Schema } from "effect"; -import { Data, type Effect, type Stream } from "effect"; +import { Data, type Effect } from "effect"; import type { HttpClientError } from "effect/unstable/http"; +import type { SKClientError } from "../services/api-client/client-factory"; +import type { Action } from "./action"; +import type { ActionTransaction } from "./action-transaction"; import type { - ActionDto, - SKClientError, - TransactionDto, -} from "../services/api-client/client-factory"; + BrowserWalletAdapter, + ExternalWalletAdapter, + WalletAdapterAccount, +} from "./wallet-adapter"; import type { - BrowserSigner, - BrowserWalletAccount, - LedgerSigner, - LedgerWalletAccount, - SignTransactionError, - SwitchAccountError, - SwitchChainError, - WalletAccount, -} from "./signer"; + WalletMissingCapabilityError, + WalletSendTransactionError, + WalletSignTypedDataError, + WalletSwitchAccountError, + WalletSwitchChainError, +} from "./wallet-errors"; export class TransactionNotConfirmedError extends Data.TaggedError( "TransactionNotConfirmedError", @@ -27,20 +26,20 @@ export class TransactionFailedError extends Data.TaggedError( ) {} export type SignTransactionsState = { - action: ActionDto; - transactions: readonly TransactionDto[]; + action: Action; + transactions: readonly ActionTransaction[]; currentTxIndex: number; error: | null | HttpClientError.HttpClientError | Schema.SchemaError - // biome-ignore lint/suspicious/noExplicitAny: any is fine here - | SKClientError - | DeserializeTransactionError - | SignTransactionError + | SKClientError + | WalletMissingCapabilityError + | WalletSendTransactionError + | WalletSignTypedDataError + | WalletSwitchChainError | TransactionNotConfirmedError - | TransactionFailedError - | SwitchChainError; + | TransactionFailedError; isDone: boolean; } & ( | { @@ -54,55 +53,51 @@ export type SignTransactionsState = { ); export type BrowserWalletDisconnected = { - type: BrowserSigner["type"]; - wagmiAdapter: WagmiAdapter; + type: BrowserWalletAdapter["mode"]; status: "disconnected"; }; -export type LedgerWalletDisconnected = { - type: LedgerSigner["type"]; +export type ExternalWalletDisconnected = { + type: ExternalWalletAdapter["mode"]; status: "disconnected"; }; export type WalletDisconnected = | BrowserWalletDisconnected - | LedgerWalletDisconnected; + | ExternalWalletDisconnected; + +export type WalletAccount = WalletAdapterAccount; type WalletConnectedCommon = { status: "connected"; currentAccount: T; - accounts: T[]; + accounts: readonly T[]; switchAccount: (args: { account: T; - }) => Effect.Effect; - signTransactions: (action: ActionDto) => Effect.Effect< - { - stream: Stream.Stream; - retry: Effect.Effect; - }, - never, - never + }) => Effect.Effect< + void, + WalletMissingCapabilityError | WalletSwitchAccountError >; }; -// Connected wallet types export type BrowserWalletConnected = Omit< BrowserWalletDisconnected, "status" -> & { status: "connected" } & WalletConnectedCommon; +> & { + status: "connected"; +} & WalletConnectedCommon; -export type LedgerWalletConnected = Omit & { +export type ExternalWalletConnected = Omit< + ExternalWalletDisconnected, + "status" +> & { status: "connected"; -} & WalletConnectedCommon; +} & WalletConnectedCommon; -export type WalletConnected = BrowserWalletConnected | LedgerWalletConnected; +export type WalletConnected = BrowserWalletConnected | ExternalWalletConnected; export type Wallet = WalletDisconnected | WalletConnected; -export class DeserializeTransactionError extends Data.TaggedError( - "DeserializeTransactionError", -)<{ cause: unknown }> {} - export const isWalletConnected = ( wallet: Wallet | null, ): wallet is WalletConnected => wallet?.status === "connected"; @@ -114,10 +109,3 @@ export const isBrowserWalletConnected = ( wallet: Wallet | null, ): wallet is BrowserWalletConnected => isWalletConnected(wallet) && wallet.type === "browser"; - -export const isLedgerWalletConnected = ( - wallet: Wallet | null, -): wallet is LedgerWalletConnected => - isWalletConnected(wallet) && wallet.type === "ledger"; - -export { WalletAccount } from "./signer"; diff --git a/packages/common/src/hooks/use-close-position.ts b/packages/common/src/hooks/use-close-position.ts index b08dc9d..01e29b3 100644 --- a/packages/common/src/hooks/use-close-position.ts +++ b/packages/common/src/hooks/use-close-position.ts @@ -3,8 +3,8 @@ import { closePercentageAtom, submitCloseAtom, } from "../atoms/close-position-atoms"; +import type { Position } from "../domain"; import { getCloseCalculations } from "../lib/math"; -import type { PositionDto } from "../services/api-client/api-schemas"; export const useClosePercentage = () => { const closePercentage = useAtomValue(closePercentageAtom); @@ -16,7 +16,7 @@ export const useClosePercentage = () => { }; }; -export const useCloseCalculations = (position: PositionDto) => { +export const useCloseCalculations = (position: Position) => { const { closePercentage } = useClosePercentage(); return getCloseCalculations(position, closePercentage); diff --git a/packages/common/src/hooks/use-deposit-form.ts b/packages/common/src/hooks/use-deposit-form.ts index 63cc544..29e80e5 100644 --- a/packages/common/src/hooks/use-deposit-form.ts +++ b/packages/common/src/hooks/use-deposit-form.ts @@ -13,6 +13,7 @@ import * as Atom from "effect/unstable/reactivity/Atom"; import * as Registry from "effect/unstable/reactivity/AtomRegistry"; import { actionAtom, + decodeAction, moralisTokenBalancesAtom, selectedProviderAtom, type TokenBalances, @@ -165,7 +166,7 @@ export const createDepositForm = ( }); const registry = yield* Registry.AtomRegistry; - registry.set(actionAtom, action); + registry.set(actionAtom, decodeAction(action)); }), }); diff --git a/packages/common/src/hooks/use-order-actions.ts b/packages/common/src/hooks/use-order-actions.ts index ce66819..b4328e3 100644 --- a/packages/common/src/hooks/use-order-actions.ts +++ b/packages/common/src/hooks/use-order-actions.ts @@ -1,5 +1,5 @@ import { Option, Schema } from "effect"; -import type { OrderDto } from "../services/api-client/api-schemas"; +import type { Order } from "../domain"; const CancelOrderPendingActionSchema = Schema.Struct({ type: Schema.Literal("cancelOrder"), @@ -9,7 +9,7 @@ const CancelOrderPendingActionSchema = Schema.Struct({ }), }); -export const useOrderActions = (order: OrderDto) => { +export const useOrderActions = (order: Order) => { return order.pendingActions.reduce( (acc, pa) => { const decoded = Schema.decodeUnknownOption( diff --git a/packages/common/src/hooks/use-order-form.ts b/packages/common/src/hooks/use-order-form.ts index 8e02087..9e2d24e 100644 --- a/packages/common/src/hooks/use-order-form.ts +++ b/packages/common/src/hooks/use-order-form.ts @@ -19,8 +19,7 @@ import { makeGetCurrentPositionRefArgs, selectedProviderBalancesAtom, } from "../atoms/portfolio-atoms"; -import type { WalletConnected } from "../domain"; -import type { ApiSchemas } from "../services"; +import type { Market, WalletConnected } from "../domain"; import { useOptionalAtomRef } from "./use-optional-atom-ref"; export const useOrderType = () => { @@ -217,7 +216,7 @@ export const useOrderPercentage = ( }; export const useOrderCalculations = ( - market: ApiSchemas.MarketDto, + market: Market, side: OrderSide, leverageRanges: typeof LeverageRangesSchema.Type, ) => { @@ -237,9 +236,8 @@ export { } from "../atoms/order-form-atoms"; // Helper to decode leverage ranges from market -export const decodeLeverageRanges = ( - leverageRange: ApiSchemas.MarketDto["leverageRange"], -) => Schema.decodeSync(LeverageRangesSchema)(leverageRange); +export const decodeLeverageRanges = (leverageRange: Market["leverageRange"]) => + Schema.decodeSync(LeverageRangesSchema)(leverageRange); export const useProviderBalance = (wallet: WalletConnected) => { const providerBalance = useAtomValue( diff --git a/packages/common/src/hooks/use-position-actions.ts b/packages/common/src/hooks/use-position-actions.ts index 4797631..09fa49c 100644 --- a/packages/common/src/hooks/use-position-actions.ts +++ b/packages/common/src/hooks/use-position-actions.ts @@ -1,5 +1,5 @@ import { Match, Option, Schema } from "effect"; -import type { PositionDto } from "../services/api-client/api-schemas"; +import type { Position } from "../domain"; const UpdateLeverageSchema = Schema.Struct({ type: Schema.Literal("updateLeverage"), @@ -23,7 +23,7 @@ const PendingActionSchema = Schema.Union([ ]); export const getPositionActions = ( - pendingActions: PositionDto["pendingActions"], + pendingActions: Position["pendingActions"], ) => { return pendingActions.reduce( (acc, pa) => { @@ -54,6 +54,6 @@ export const getPositionActions = ( ); }; -export const usePositionActions = (position: PositionDto) => { +export const usePositionActions = (position: Position) => { return getPositionActions(position.pendingActions); }; diff --git a/packages/common/src/hooks/use-tp-sl-orders.ts b/packages/common/src/hooks/use-tp-sl-orders.ts index 15d4929..4862413 100644 --- a/packages/common/src/hooks/use-tp-sl-orders.ts +++ b/packages/common/src/hooks/use-tp-sl-orders.ts @@ -1,5 +1,5 @@ import { Match, Option, Schema } from "effect"; -import type { OrderDto } from "../services/api-client/api-schemas"; +import type { Order } from "../domain"; const TpSlOrderSchema = Schema.Struct({ type: Schema.Literals(["take_profit", "stop_loss"]), @@ -7,7 +7,7 @@ const TpSlOrderSchema = Schema.Struct({ triggerPrice: Schema.optional(Schema.Number), }); -export const useTpSlOrders = (orders: OrderDto[]) => { +export const useTpSlOrders = (orders: Order[]) => { return orders.reduce( (acc, order) => { const decoded = Schema.decodeUnknownOption(TpSlOrderSchema)(order).pipe( diff --git a/packages/common/src/hooks/use-withdraw-form.ts b/packages/common/src/hooks/use-withdraw-form.ts index 857fdcb..97c482d 100644 --- a/packages/common/src/hooks/use-withdraw-form.ts +++ b/packages/common/src/hooks/use-withdraw-form.ts @@ -5,6 +5,7 @@ import * as Result from "effect/unstable/reactivity/AsyncResult"; import * as Registry from "effect/unstable/reactivity/AtomRegistry"; import { actionAtom, + decodeAction, selectedProviderAtom, selectedProviderBalancesAtom, walletAtom, @@ -114,7 +115,7 @@ export const createWithdrawForm = ( }); const registry = yield* Registry.AtomRegistry; - registry.set(actionAtom, action); + registry.set(actionAtom, decodeAction(action)); }), }); diff --git a/packages/common/src/lib/math.ts b/packages/common/src/lib/math.ts index 11cbf9d..3038e98 100644 --- a/packages/common/src/lib/math.ts +++ b/packages/common/src/lib/math.ts @@ -1,8 +1,5 @@ import { Number as _Number, Option } from "effect"; -import type { - MarketDto, - PositionDto, -} from "../services/api-client/api-schemas"; +import type { Market, Position } from "../domain"; /** * The minimum leverage supported by the UI/SDK. @@ -160,9 +157,7 @@ export const round = (number: number, precision: number = 2) => /** * Computes max leverage from the leverage range (falls back to `MAX_LEVERAGE`). */ -export const getMaxLeverage = ( - leverages: MarketDto["leverageRange"], -): number => +export const getMaxLeverage = (leverages: Market["leverageRange"]): number => leverages.length > 0 ? (leverages[leverages.length - 1] ?? MAX_LEVERAGE) : MAX_LEVERAGE; @@ -184,7 +179,7 @@ export const getPriceChangePercent = ({ /** * Price change percent for a position relative to entry. */ -export const getPositionChangePercent = (position: PositionDto) => +export const getPositionChangePercent = (position: Position) => getPriceChangePercent({ currentPrice: position.markPrice, pastOrFuturePrice: position.entryPrice, @@ -248,7 +243,7 @@ export const getEstimatedLiquidationPriceForProjectedMargin = ({ position, projectedMargin, }: { - position: Pick; + position: Pick; projectedMargin: number; }) => { if (projectedMargin <= 0) return null; @@ -365,11 +360,11 @@ export const calculatePositionSize = ({ * Computes close-related UI calculations for a given close percentage. */ export const getCloseCalculations = ( - position: PositionDto, + position: Position, closePercentage: number, ) => { const ratio = closePercentage / 100; - const sizeNum = parseFloatOrZero(position.size); + const sizeNum = position.size; const positionValue = position.markPrice * sizeNum; const closeValue = positionValue * ratio; const marginReturn = position.margin * ratio; diff --git a/packages/common/src/lib/utils.ts b/packages/common/src/lib/utils.ts index 0edfd50..7e9343c 100644 --- a/packages/common/src/lib/utils.ts +++ b/packages/common/src/lib/utils.ts @@ -1,6 +1,6 @@ import { type ClassValue, clsx } from "clsx"; import { twMerge } from "tailwind-merge"; -import type { TokenDto, TokenString } from "../domain/types"; +import type { TokenData, TokenString } from "../domain/types"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); @@ -12,7 +12,7 @@ export const getNetworkLogo = (network: string) => export const getTokenLogo = (tokenSymbol: string) => `https://assets.stakek.it/tokens/${tokenSymbol.toLowerCase()}.svg`; -export const getTokenString = (token: TokenDto): TokenString => +export const getTokenString = (token: TokenData): TokenString => `${token.network}-${token.address}`; export const truncateAddress = (address: string, length: number = 6) => diff --git a/packages/common/src/services/api-client/api-schemas.ts b/packages/common/src/services/api-client/api-schemas.ts index c13b0a3..4cc05f6 100644 --- a/packages/common/src/services/api-client/api-schemas.ts +++ b/packages/common/src/services/api-client/api-schemas.ts @@ -39,8 +39,8 @@ export type SubmitTransactionResponseDto = { readonly "transactionHash"?: string export const SubmitTransactionResponseDto = Schema.Struct({ "transactionHash": Schema.optionalKey(Schema.String.annotate({ "description": "Transaction hash or order ID (undefined for immediate actions)", "examples": ["0x1234567890abcdef..."] })), "link": Schema.String.annotate({ "description": "Link to view transaction on provider platform", "examples": ["https://app.hyperliquid.xyz/exchange"] }), "status": Schema.Literals(["CREATED", "QUEUED", "BROADCASTED", "CONFIRMED", "FAILED", "NOT_FOUND"]).annotate({ "description": "Transaction status after submission", "examples": ["CONFIRMED"] }), "error": Schema.optionalKey(Schema.String.annotate({ "description": "Error message if status is FAILED", "examples": ["Order rejected: Insufficient margin"] })), "details": Schema.optionalKey(Schema.Struct({ }).annotate({ "description": "Additional provider-specific details", "examples": [{"orderStatus":"filled","fillPrice":3900}] })) }) export type HealthStatusDto = { readonly "status": "OK" | "FAIL", readonly "timestamp": string } export const HealthStatusDto = Schema.Struct({ "status": Schema.Literals(["OK", "FAIL"]).annotate({ "description": "The health status of the service", "examples": ["OK"] }), "timestamp": Schema.String.annotate({ "description": "Timestamp when the health check was performed", "examples": ["2024-01-15T10:30:00.000Z"], "format": "date-time" }) }) -export type ProviderDto = { readonly "id": string, readonly "name": string, readonly "network": string, readonly "metadata": { readonly "description": string, readonly "externalLink": string, readonly "logoURI": string }, readonly "supportedActions": "open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl", readonly "argumentSchemas": { readonly [x: string]: ArgumentSchemaDto } } -export const ProviderDto = Schema.Struct({ "id": Schema.String.annotate({ "description": "Provider identifier", "examples": ["hyperliquid"] }), "name": Schema.String.annotate({ "description": "Provider name", "examples": ["Hyperliquid"] }), "network": Schema.String.annotate({ "description": "Network the provider operates on", "examples": ["hyperliquid"] }), "metadata": Schema.Struct({ "description": Schema.String.annotate({ "description": "Provider description", "examples": ["Hyperliquid is a high-performance L1 optimized for perpetual futures trading."] }), "externalLink": Schema.String.annotate({ "description": "External link to the provider website", "examples": ["https://hyperliquid.xyz"] }), "logoURI": Schema.String.annotate({ "description": "Provider logo URI", "examples": ["https://assets.stakek.it/providers/hyperliquid.svg"] }) }).annotate({ "description": "Provider metadata (description, logo, links)" }), "supportedActions": Schema.Literals(["open", "close", "updateLeverage", "stopLoss", "takeProfit", "cancelOrder", "editOrder", "fund", "withdraw", "approveAgent", "approveBuilderFee", "updateMargin", "setTpAndSl"]).annotate({ "description": "Action type executed", "examples": ["open"] }), "argumentSchemas": Schema.Record(Schema.String, ArgumentSchemaDto).annotate({ "description": "Argument schemas for each supported action (JSON Schema format)", "examples": [{"open":{"type":"object","properties":{"marketId":{"type":"string","label":"Market"},"side":{"enum":["long","short"],"label":"Side"},"leverage":{"type":"number","label":"Leverage"}},"required":["marketId","side","leverage"]}}] }) }) +export type ProviderDto = { readonly "id": string, readonly "name": string, readonly "network": string, readonly "metadata": { readonly "description": string, readonly "externalLink": string, readonly "logoURI": string }, readonly "supportedActions": ReadonlyArray<"open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl">, readonly "argumentSchemas": { readonly [x: string]: ArgumentSchemaDto } } +export const ProviderDto = Schema.Struct({ "id": Schema.String.annotate({ "description": "Provider identifier", "examples": ["hyperliquid"] }), "name": Schema.String.annotate({ "description": "Provider name", "examples": ["Hyperliquid"] }), "network": Schema.String.annotate({ "description": "Network the provider operates on", "examples": ["hyperliquid"] }), "metadata": Schema.Struct({ "description": Schema.String.annotate({ "description": "Provider description", "examples": ["Hyperliquid is a high-performance L1 optimized for perpetual futures trading."] }), "externalLink": Schema.String.annotate({ "description": "External link to the provider website", "examples": ["https://hyperliquid.xyz"] }), "logoURI": Schema.String.annotate({ "description": "Provider logo URI", "examples": ["https://assets.stakek.it/providers/hyperliquid.svg"] }) }).annotate({ "description": "Provider metadata (description, logo, links)" }), "supportedActions": Schema.Array(Schema.Literals(["open", "close", "updateLeverage", "stopLoss", "takeProfit", "cancelOrder", "editOrder", "fund", "withdraw", "approveAgent", "approveBuilderFee", "updateMargin", "setTpAndSl"])).annotate({ "description": "Action types supported by the provider", "examples": [["open"]] }), "argumentSchemas": Schema.Record(Schema.String, ArgumentSchemaDto).annotate({ "description": "Argument schemas for each supported action (JSON Schema format)", "examples": [{"open":{"type":"object","properties":{"marketId":{"type":"string","label":"Market"},"side":{"enum":["long","short"],"label":"Side"},"leverage":{"type":"number","label":"Leverage"}},"required":["marketId","side","leverage"]}}] }) }) export type CandlesResponseDto = { readonly "marketId": string, readonly "interval": "1m" | "5m" | "15m" | "1h" | "4h" | "1d", readonly "candles": ReadonlyArray } export const CandlesResponseDto = Schema.Struct({ "marketId": Schema.String.annotate({ "examples": ["hyperliquid-btc-usdc"] }), "interval": Schema.Literals(["1m", "5m", "15m", "1h", "4h", "1d"]).annotate({ "examples": ["1h"] }), "candles": Schema.Array(CandleDto) }) export type PositionDto = { readonly "marketId": string, readonly "side": "long" | "short", readonly "size": string, readonly "entryPrice": number, readonly "markPrice": number, readonly "leverage": number, readonly "marginMode": "cross" | "isolated", readonly "margin": number, readonly "unrealizedPnl": number, readonly "funding": number, readonly "liquidationPrice": number, readonly "pendingActions": ReadonlyArray } diff --git a/packages/common/src/services/api-client/client-factory.ts b/packages/common/src/services/api-client/client-factory.ts index 593ed4e..2fe0256 100644 --- a/packages/common/src/services/api-client/client-factory.ts +++ b/packages/common/src/services/api-client/client-factory.ts @@ -21,7 +21,7 @@ export type PerpEventType = "order_filled" | "liquidation" | "stop_loss_triggere export type SubmitTransactionDto = { readonly "signedPayload"?: string, readonly "transactionHash"?: string } export type SubmitTransactionResponseDto = { readonly "transactionHash"?: string, readonly "link": string, readonly "status": "CREATED" | "QUEUED" | "BROADCASTED" | "CONFIRMED" | "FAILED" | "NOT_FOUND", readonly "error"?: string, readonly "details"?: { } } export type HealthStatusDto = { readonly "status": "OK" | "FAIL", readonly "timestamp": string } -export type ProviderDto = { readonly "id": string, readonly "name": string, readonly "network": string, readonly "metadata": { readonly "description": string, readonly "externalLink": string, readonly "logoURI": string }, readonly "supportedActions": "open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl", readonly "argumentSchemas": { readonly [x: string]: ArgumentSchemaDto } } +export type ProviderDto = { readonly "id": string, readonly "name": string, readonly "network": string, readonly "metadata": { readonly "description": string, readonly "externalLink": string, readonly "logoURI": string }, readonly "supportedActions": ReadonlyArray<"open" | "close" | "updateLeverage" | "stopLoss" | "takeProfit" | "cancelOrder" | "editOrder" | "fund" | "withdraw" | "approveAgent" | "approveBuilderFee" | "updateMargin" | "setTpAndSl">, readonly "argumentSchemas": { readonly [x: string]: ArgumentSchemaDto } } export type CandlesResponseDto = { readonly "marketId": string, readonly "interval": "1m" | "5m" | "15m" | "1h" | "4h" | "1d", readonly "candles": ReadonlyArray } export type PositionDto = { readonly "marketId": string, readonly "side": "long" | "short", readonly "size": string, readonly "entryPrice": number, readonly "markPrice": number, readonly "leverage": number, readonly "marginMode": "cross" | "isolated", readonly "margin": number, readonly "unrealizedPnl": number, readonly "funding": number, readonly "liquidationPrice": number, readonly "pendingActions": ReadonlyArray } export type OrderDto = { readonly "marketId": string, readonly "side": "long" | "short", readonly "type": "market" | "limit" | "stop_loss" | "take_profit", readonly "size": string, readonly "limitPrice"?: number, readonly "triggerPrice"?: number, readonly "leverage"?: number, readonly "margin"?: number, readonly "reduceOnly": boolean, readonly "createdAt": number, readonly "pendingActions": ReadonlyArray } diff --git a/packages/common/src/services/api-client/index.ts b/packages/common/src/services/api-client/index.ts index 8c8ea32..1d514f9 100644 --- a/packages/common/src/services/api-client/index.ts +++ b/packages/common/src/services/api-client/index.ts @@ -53,6 +53,6 @@ export class ApiClientService extends Context.Service()( }, ) { static readonly layer = Layer.effect(this, this.make).pipe( - Layer.provide(Layer.mergeAll(ConfigService.layer, HttpClientService.layer)), + Layer.provide(HttpClientService.layer), ); } diff --git a/packages/common/src/services/config.ts b/packages/common/src/services/config.ts index bedca92..1422f66 100644 --- a/packages/common/src/services/config.ts +++ b/packages/common/src/services/config.ts @@ -1,37 +1,13 @@ -import { Config, ConfigProvider, Context, Effect, Layer } from "effect"; +import { Context } from "effect"; -export class ConfigService extends Context.Service()( - "perps/services/config-service/ConfigService", +export class ConfigService extends Context.Service< + ConfigService, { - make: Effect.gen(function* () { - const provider = ConfigProvider.fromEnv({ - env: import.meta.env, - }); - const read =
(config: Config.Config) => config.parse(provider); - - const perpsBaseUrl = yield* read( - Config.nonEmptyString("VITE_PERPS_BASE_URL"), - ); - const perpsApiKey = yield* read( - Config.nonEmptyString("VITE_PERPS_API_KEY"), - ); - - const reownProjectId = yield* read( - Config.nonEmptyString("VITE_REOWN_PROJECT_ID").pipe(Config.option), - ); - - const moralisApiKey = yield* read( - Config.nonEmptyString("VITE_MORALIS_API_KEY"), - ); - - return { - perpsBaseUrl, - perpsApiKey, - reownProjectId, - moralisApiKey, - }; - }), - }, -) { - static readonly layer = Layer.effect(this, this.make); -} + readonly perpsBaseUrl: string; + readonly perpsApiKey: string; + readonly reownProjectId?: string; + readonly moralisApiKey: string; + } +>()("perps/services/config-service/ConfigService") {} + +export type PerpsConfig = ConfigService["Service"]; diff --git a/packages/common/src/services/events.ts b/packages/common/src/services/events.ts new file mode 100644 index 0000000..a315d64 --- /dev/null +++ b/packages/common/src/services/events.ts @@ -0,0 +1,65 @@ +import { Context, Effect, Exit, Layer, PubSub, Scope, Stream } from "effect"; +import * as Reactivity from "effect/unstable/reactivity/Reactivity"; +import { portfolioReactivityKeysArray } from "../atoms/reactivity-keys"; +import type { LifecycleEvent } from "../domain"; + +const shouldInvalidatePortfolio = (event: LifecycleEvent) => + event.type === "transaction.submitted" || event.type === "action.completed"; + +export class EventsService extends Context.Service()( + "perps/services/events/EventsService", + { + make: Effect.gen(function* () { + const pubsub = yield* PubSub.unbounded(); + const reactivity = yield* Reactivity.Reactivity; + + const stream = Stream.fromPubSub(pubsub); + + const publish = (event: LifecycleEvent) => PubSub.publish(pubsub, event); + + const publishAll = (events: ReadonlyArray) => + PubSub.publishAll(pubsub, events); + + const portfolioSubscription = yield* PubSub.subscribe(pubsub); + + yield* PubSub.take(portfolioSubscription).pipe( + Effect.andThen((event) => + shouldInvalidatePortfolio(event) + ? reactivity.invalidate(portfolioReactivityKeysArray) + : Effect.void, + ), + Effect.forever, + Effect.forkScoped, + ); + + const subscribe = (listener: (event: LifecycleEvent) => void) => + Effect.gen(function* () { + const scope = yield* Scope.make(); + const subscription = yield* PubSub.subscribe(pubsub).pipe( + Scope.provide(scope), + ); + + yield* PubSub.take(subscription).pipe( + Effect.tap((event) => Effect.sync(() => listener(event))), + Effect.forever, + Effect.forkIn(scope), + ); + + return () => { + Effect.runFork(Scope.close(scope, Exit.void)); + }; + }); + + return { + publish, + publishAll, + stream, + subscribe, + }; + }), + }, +) { + static readonly layer = Layer.effect(this, this.make).pipe( + Layer.provide(Reactivity.layer), + ); +} diff --git a/packages/common/src/services/hyperliquid/index.ts b/packages/common/src/services/hyperliquid/index.ts index cbbd246..6b48456 100644 --- a/packages/common/src/services/hyperliquid/index.ts +++ b/packages/common/src/services/hyperliquid/index.ts @@ -26,7 +26,7 @@ export class HyperliquidService extends Context.Service()( endTime?: number; }) => Effect.tryPromise(() => infoClient.candleSnapshot(params)).pipe( - Effect.mapError((cause) => new GetCandleSnapshotError({ cause })), + Effect.mapError((reason) => new GetCandleSnapshotError({ reason })), ); const subscribeCandle = (params: { @@ -95,6 +95,6 @@ export const CandleIntervalSchema = Schema.Literals([ export class GetCandleSnapshotError extends Schema.TaggedErrorClass()( "GetCandleSnapshotError", { - cause: Schema.Unknown, + reason: Schema.Unknown, }, ) {} diff --git a/packages/common/src/services/index.ts b/packages/common/src/services/index.ts index e15755d..5ebafd5 100644 --- a/packages/common/src/services/index.ts +++ b/packages/common/src/services/index.ts @@ -1,12 +1,10 @@ export * from "./api-client"; -export * as ApiSchemas from "./api-client/api-schemas"; -export type * as ApiTypes from "./api-client/client-factory"; export * from "./config"; export * from "./constants"; +export * from "./events"; export * from "./http-client"; export * from "./hyperliquid"; export * from "./runtime"; -export * from "./wallet/browser-signer"; -export * from "./wallet/ledger-signer"; -export * from "./wallet/signer"; -export * from "./wallet/wallet-service"; +export * from "./wallet/browser-wallet-adapter"; +export * from "./wallet/external-wallet-adapter"; +export * from "./wallet-adapter"; diff --git a/packages/common/src/services/runtime.ts b/packages/common/src/services/runtime.ts index d3ed2ac..4d9c706 100644 --- a/packages/common/src/services/runtime.ts +++ b/packages/common/src/services/runtime.ts @@ -1,38 +1,62 @@ -import { Effect, Layer, Logger, ManagedRuntime } from "effect"; +import { Effect, Layer, Logger } from "effect"; import * as Atom from "effect/unstable/reactivity/Atom"; import * as Registry from "effect/unstable/reactivity/AtomRegistry"; -import * as Reactivity from "effect/unstable/reactivity/Reactivity"; +import { externalWalletSourceAtom } from "../atoms/external-wallet-source"; +import { perpsConfigAtom } from "../atoms/perps-config-atom"; +import type { ExternalWalletSource } from "../domain"; import { ApiClientService } from "./api-client"; -import { ConfigService } from "./config"; +import { ConfigService, type PerpsConfig } from "./config"; +import { EventsService } from "./events"; import { HttpClientService } from "./http-client"; import { HyperliquidService } from "./hyperliquid"; -import { BrowserSignerLayer } from "./wallet/browser-signer"; -import { LedgerSignerLayer } from "./wallet/ledger-signer"; -import { isLedgerDappBrowserProvider } from "./wallet/ledger-signer/utils"; -import { WalletService } from "./wallet/wallet-service"; +import { BrowserWalletAdapterLayer } from "./wallet/browser-wallet-adapter"; +import { ExternalWalletAdapterLayer } from "./wallet/external-wallet-adapter"; -const Signer = isLedgerDappBrowserProvider - ? LedgerSignerLayer.pipe(Layer.orDie) - : BrowserSignerLayer.pipe(Layer.provide(ConfigService.layer), Layer.orDie); +const makeConfigLayer = (config: PerpsConfig | null) => + Layer.effect(ConfigService)( + Effect.gen(function* () { + if (!config) { + return yield* Effect.die( + new Error("Perps config has not been provided"), + ); + } -const layer = Layer.mergeAll( - WalletService.layer.pipe(Layer.provide(Signer)), + return ConfigService.of(config); + }), + ); + +const baseLayer = Layer.mergeAll( ApiClientService.layer, - HttpClientService.layer, - ConfigService.layer, HyperliquidService.layer, + HttpClientService.layer, Registry.layer, - Reactivity.layer, + EventsService.layer, Logger.layer([Logger.consolePretty()]), -).pipe(Layer.orDie); +); + +const makeLayer = ( + externalSource: ExternalWalletSource | null, + config: PerpsConfig | null, +) => { + const configLayer = makeConfigLayer(config); + + const walletAdapterLayer = externalSource + ? ExternalWalletAdapterLayer(externalSource) + : BrowserWalletAdapterLayer; + + return Layer.mergeAll(baseLayer, walletAdapterLayer).pipe( + Layer.provideMerge(configLayer), + Layer.orDie, + ); +}; const memoMap = Layer.makeMemoMap.pipe(Effect.runSync); const atomContext = Atom.context({ memoMap }); -export const runtimeAtom = atomContext(layer); - -export const managedRuntime = ManagedRuntime.make(layer, { memoMap }); +export const runtimeAtom = atomContext((get) => + makeLayer(get(externalWalletSourceAtom), get(perpsConfigAtom)), +); /** * Use this instead of Atom.withReactivity to ensure the same Reactivity diff --git a/packages/common/src/services/wallet-adapter.ts b/packages/common/src/services/wallet-adapter.ts new file mode 100644 index 0000000..a382558 --- /dev/null +++ b/packages/common/src/services/wallet-adapter.ts @@ -0,0 +1,7 @@ +import { Context } from "effect"; +import type { PerpsWalletAdapter } from "../domain/wallet-adapter"; + +export class WalletAdapterService extends Context.Service< + WalletAdapterService, + PerpsWalletAdapter +>()("perps/services/wallet-adapter/WalletAdapterService") {} diff --git a/packages/common/src/services/wallet/browser-signer.ts b/packages/common/src/services/wallet/browser-signer.ts deleted file mode 100644 index 7943c1f..0000000 --- a/packages/common/src/services/wallet/browser-signer.ts +++ /dev/null @@ -1,224 +0,0 @@ -import type { AppKitNetwork } from "@reown/appkit/networks"; -import { createAppKit } from "@reown/appkit/react"; -import { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; -import { EvmNetworks } from "@stakekit/common"; -import { - Array as _Array, - Effect, - identity, - Layer, - Option, - Record, - Schema, - SubscriptionRef, -} from "effect"; -import type { NonEmptyArray } from "effect/Array"; -import { ChainNotFoundError, defineChain } from "viem"; -import { arbitrum, base, mainnet, monad, optimism } from "viem/chains"; -import { - sendTransaction, - signTypedData, - switchConnection, - switchChain as wagmiSwitchChain, -} from "wagmi/actions"; -import type { SupportedSKChains } from "../../domain/chains"; -import { - type AccountsState, - type BrowserWalletAccount, - makeBrowserWalletAccount, - SignTransactionError, - SwitchAccountError, - SwitchChainError, -} from "../../domain/signer"; -import { - EIP712Tx, - type Transaction, - TransactionHash, -} from "../../domain/transactions"; -import { ConfigService } from "../config"; -import { SignerService } from "./signer"; - -const hyperLiquidL1 = defineChain({ - id: 1337, - caipNetworkId: "eip155:1337", - chainNamespace: "eip155", - name: "Hyperliquid L1", - nativeCurrency: { name: "HYPE", symbol: "HYPE", decimals: 18 }, - rpcUrls: { - default: { http: ["https://api.hyperliquid.xyz/evm"] }, - }, - blockExplorers: { - default: { name: "Hyperliquid", url: "https://app.hyperliquid.xyz" }, - }, -}); - -export const BrowserSignerLayer = Effect.gen(function* () { - const config = yield* ConfigService; - const projectId = Option.getOrThrow(config.reownProjectId); - - const networks: NonEmptyArray< - AppKitNetwork & { skChainName: SupportedSKChains } - > = [ - { ...mainnet, skChainName: EvmNetworks.Ethereum }, - { ...base, skChainName: EvmNetworks.Base }, - { ...arbitrum, skChainName: EvmNetworks.Arbitrum }, - { ...optimism, skChainName: EvmNetworks.Optimism }, - { ...monad, skChainName: EvmNetworks.Monad }, - { ...hyperLiquidL1, skChainName: EvmNetworks.HyperEVM }, - ]; - - const chainsMap = Record.fromIterableBy(networks, (network) => - network.id.toString(), - ); - - const wagmiAdapter = new WagmiAdapter({ - networks, - projectId, - multiInjectedProviderDiscovery: true, - }); - - createAppKit({ - networks, - projectId, - themeVariables: { - "--apkt-font-family": "var(--font-family)", - }, - enableNetworkSwitch: false, - adapters: [wagmiAdapter], - }); - - const switchChain = (chainId: AppKitNetwork["id"]) => - Effect.gen(function* () { - const chain = yield* Effect.fromOption( - Record.get(chainsMap, chainId.toString()), - ).pipe( - Effect.mapError( - () => new SwitchChainError({ cause: new ChainNotFoundError() }), - ), - ); - - yield* Effect.tryPromise({ - try: () => - wagmiSwitchChain(wagmiAdapter.wagmiConfig, { - chainId: typeof chain.id === "number" ? chain.id : Number(chain.id), - }), - catch: (e) => new SwitchChainError({ cause: e }), - }); - }); - - const signTransaction = Effect.fn(function* ({ - transaction, - }: { - transaction: Transaction; - }) { - const isEIP712Transaction = Schema.is(EIP712Tx)(transaction); - const chainId = isEIP712Transaction - ? transaction.domain.chainId - : transaction.chainId; - - if (chainId !== wagmiAdapter.wagmiConfig.state.chainId) { - yield* switchChain(chainId).pipe(Effect.orDie); - } - - return yield* Effect.tryPromise({ - try: () => - isEIP712Transaction - ? signTypedData(wagmiAdapter.wagmiConfig, { - primaryType: transaction.primaryType, - message: transaction.message, - types: transaction.types, - domain: transaction.domain, - }) - : sendTransaction(wagmiAdapter.wagmiConfig, transaction), - catch: (e) => new SignTransactionError({ cause: e }), - }).pipe( - Effect.andThen((hash) => - Effect.sync(() => Schema.decodeSync(TransactionHash)(hash)), - ), - ); - }); - - const accountsStateRef = yield* SubscriptionRef.make< - AccountsState - >({ - status: "disconnected", - }); - - yield* Effect.acquireRelease( - Effect.sync(() => - wagmiAdapter.wagmiConfig.subscribe(identity, (nextState) => { - nextState.status; - const currentConnectionId = nextState.current; - - SubscriptionRef.update( - accountsStateRef, - (prevWallet): AccountsState => { - const connection = Option.fromNullishOr(currentConnectionId).pipe( - Option.flatMap((connectionId) => - Option.fromNullishOr(nextState.connections.get(connectionId)), - ), - ); - - if (Option.isNone(connection)) { - return { status: "disconnected" }; - } - - const currentAccount = Option.some(prevWallet).pipe( - Option.filter((accounts) => accounts?.status === "connected"), - Option.map((wallet) => wallet.currentAccount), - Option.flatMap((prevAcc) => - Option.fromNullishOr( - connection.value.accounts.find( - (acc) => acc === prevAcc.address, - ), - ), - ), - Option.orElse(() => _Array.head(connection.value.accounts)), - ); - - if (Option.isNone(currentAccount)) { - return { status: "disconnected" }; - } - - return { - status: "connected", - currentAccount: makeBrowserWalletAccount({ - address: currentAccount.value, - }), - accounts: connection.value.accounts.map((acc) => - makeBrowserWalletAccount({ - address: acc, - }), - ), - }; - }, - ).pipe(Effect.runSync); - }), - ), - (unsubscribe) => Effect.sync(() => unsubscribe()), - ); - - const switchAccount = Effect.fn( - function* ({ account }: { account: BrowserWalletAccount }) { - const connection = yield* Option.fromNullishOr( - wagmiAdapter.wagmiConfig.state.connections.get(account.address), - ); - - yield* Effect.tryPromise(() => - switchConnection(wagmiAdapter.wagmiConfig, { - connector: connection.connector, - }), - ); - }, - Effect.mapError((e) => new SwitchAccountError({ cause: e })), - ); - - return SignerService.of({ - type: "browser", - signTransaction, - switchAccount, - wagmiAdapter, - accountsStream: SubscriptionRef.changes(accountsStateRef), - getAccountState: SubscriptionRef.get(accountsStateRef), - }); -}).pipe(Layer.effect(SignerService)); diff --git a/packages/common/src/services/wallet/browser-wallet-adapter.ts b/packages/common/src/services/wallet/browser-wallet-adapter.ts new file mode 100644 index 0000000..74f8f78 --- /dev/null +++ b/packages/common/src/services/wallet/browser-wallet-adapter.ts @@ -0,0 +1,238 @@ +import type { AppKitNetwork } from "@reown/appkit/networks"; +import { createAppKit } from "@reown/appkit/react"; +import { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; +import { EvmNetworks } from "@stakekit/common"; +import { + Array as _Array, + Effect, + identity, + Layer, + Option, + Record, + Schema, + SubscriptionRef, +} from "effect"; +import type { NonEmptyArray } from "effect/Array"; +import { ChainNotFoundError, defineChain } from "viem"; +import { arbitrum, base, mainnet, monad, optimism } from "viem/chains"; +import { + switchConnection, + sendTransaction as wagmiSendTransaction, + signTypedData as wagmiSignTypedData, + switchChain as wagmiSwitchChain, +} from "wagmi/actions"; +import { + type EvmTransactionRequest, + makeWalletAdapterAccount, + SignedPayload, + TransactionHash, + type TypedDataRequest, + WalletAdapterState, + WalletSendTransactionError, + WalletSignTypedDataError, + WalletSwitchAccountError, + WalletSwitchChainError, +} from "../../domain"; +import type { SupportedSKChains } from "../../domain/chains"; +import { ChainId, type WalletAddress } from "../../domain/ids"; +import { ConfigService } from "../config"; +import { WalletAdapterService } from "../wallet-adapter"; + +const hyperLiquidL1 = defineChain({ + id: 1337, + caipNetworkId: "eip155:1337", + chainNamespace: "eip155", + name: "Hyperliquid L1", + nativeCurrency: { name: "HYPE", symbol: "HYPE", decimals: 18 }, + rpcUrls: { + default: { http: ["https://api.hyperliquid.xyz/evm"] }, + }, + blockExplorers: { + default: { name: "Hyperliquid", url: "https://app.hyperliquid.xyz" }, + }, +}); + +export const BrowserWalletAdapterLayer = Effect.gen(function* () { + const config = yield* ConfigService; + const projectId = + config.reownProjectId ?? + (yield* Effect.die(new Error("Reown project ID has not been provided"))); + + const networks: NonEmptyArray< + AppKitNetwork & { skChainName: SupportedSKChains } + > = [ + { ...mainnet, skChainName: EvmNetworks.Ethereum }, + { ...base, skChainName: EvmNetworks.Base }, + { ...arbitrum, skChainName: EvmNetworks.Arbitrum }, + { ...optimism, skChainName: EvmNetworks.Optimism }, + { ...monad, skChainName: EvmNetworks.Monad }, + { ...hyperLiquidL1, skChainName: EvmNetworks.HyperEVM }, + ]; + + const chainsMap = Record.fromIterableBy(networks, (network) => + network.id.toString(), + ); + + const wagmiAdapter = new WagmiAdapter({ + networks, + projectId, + multiInjectedProviderDiscovery: true, + }); + + createAppKit({ + networks, + projectId, + themeVariables: { + "--apkt-font-family": "var(--font-family)", + }, + enableNetworkSwitch: false, + adapters: [wagmiAdapter], + }); + + const switchChain = (chainId: typeof ChainId.Type) => + Effect.gen(function* () { + const chain = yield* Effect.fromOption( + Record.get(chainsMap, chainId.toString()), + ).pipe( + Effect.mapError( + () => + new WalletSwitchChainError({ + reason: new ChainNotFoundError(), + }), + ), + ); + + yield* Effect.tryPromise({ + try: () => + wagmiSwitchChain(wagmiAdapter.wagmiConfig, { + chainId: typeof chain.id === "number" ? chain.id : Number(chain.id), + }), + catch: (reason) => new WalletSwitchChainError({ reason }), + }); + }); + + const ensureChain = (chainId: AppKitNetwork["id"]) => { + if (chainId === wagmiAdapter.wagmiConfig.state.chainId) { + return Effect.void; + } + + return Schema.decodeUnknownEffect(ChainId)(chainId.toString()).pipe( + Effect.mapError((reason) => new WalletSwitchChainError({ reason })), + Effect.andThen(switchChain), + ); + }; + + const sendTransaction = Effect.fn(function* ({ + transaction, + }: EvmTransactionRequest) { + yield* ensureChain(transaction.chainId); + + const hash = yield* Effect.tryPromise({ + try: () => wagmiSendTransaction(wagmiAdapter.wagmiConfig, transaction), + catch: (reason) => new WalletSendTransactionError({ reason }), + }); + + return yield* Schema.decodeUnknownEffect(TransactionHash)(hash).pipe( + Effect.mapError((reason) => new WalletSendTransactionError({ reason })), + ); + }); + + const signTypedData = Effect.fn(function* ({ + transaction, + }: TypedDataRequest) { + yield* ensureChain(transaction.domain.chainId); + + const payload = yield* Effect.tryPromise({ + try: () => + wagmiSignTypedData(wagmiAdapter.wagmiConfig, { + primaryType: transaction.primaryType, + message: transaction.message, + types: transaction.types, + domain: transaction.domain, + }), + catch: (reason) => new WalletSignTypedDataError({ reason }), + }); + + return yield* Schema.decodeUnknownEffect(SignedPayload)(payload).pipe( + Effect.mapError((reason) => new WalletSignTypedDataError({ reason })), + ); + }); + + const stateRef = yield* SubscriptionRef.make({ + status: "disconnected", + }); + + yield* Effect.acquireRelease( + Effect.sync(() => + wagmiAdapter.wagmiConfig.subscribe(identity, (nextState) => { + const currentConnectionId = nextState.current; + + SubscriptionRef.update(stateRef, (prevState): WalletAdapterState => { + const connection = Option.fromNullishOr(currentConnectionId).pipe( + Option.flatMap((connectionId) => + Option.fromNullishOr(nextState.connections.get(connectionId)), + ), + ); + + if (Option.isNone(connection)) { + return { status: "disconnected" }; + } + + const currentAccount = Option.some(prevState).pipe( + Option.filter((accounts) => accounts?.status === "connected"), + Option.map((wallet) => wallet.currentAccount), + Option.flatMap((prevAcc) => + Option.fromNullishOr( + connection.value.accounts.find( + (account) => account === prevAcc.address, + ), + ), + ), + Option.orElse(() => _Array.head(connection.value.accounts)), + ); + + if (Option.isNone(currentAccount)) { + return { status: "disconnected" }; + } + + return Schema.decodeUnknownSync(WalletAdapterState)({ + status: "connected", + currentAccount: makeWalletAdapterAccount({ + address: currentAccount.value, + }), + accounts: connection.value.accounts.map((address) => + makeWalletAdapterAccount({ address }), + ), + }); + }).pipe(Effect.runSync); + }), + ), + (unsubscribe) => Effect.sync(() => unsubscribe()), + ); + + const switchAccount = Effect.fn( + function* (address: typeof WalletAddress.Type) { + const connection = yield* Option.fromNullishOr( + wagmiAdapter.wagmiConfig.state.connections.get(address), + ); + + yield* Effect.tryPromise(() => + switchConnection(wagmiAdapter.wagmiConfig, { + connector: connection.connector, + }), + ); + }, + Effect.mapError((reason) => new WalletSwitchAccountError({ reason })), + ); + + return WalletAdapterService.of({ + mode: "browser", + wagmiAdapter, + getState: () => stateRef.value, + changes: SubscriptionRef.changes(stateRef), + sendTransaction, + signTypedData, + switchAccount, + switchChain, + }); +}).pipe(Layer.effect(WalletAdapterService)); diff --git a/packages/common/src/services/wallet/external-wallet-adapter.ts b/packages/common/src/services/wallet/external-wallet-adapter.ts new file mode 100644 index 0000000..5bdbf4e --- /dev/null +++ b/packages/common/src/services/wallet/external-wallet-adapter.ts @@ -0,0 +1,79 @@ +import { Effect, FiberHandle, Layer, Schema, SubscriptionRef } from "effect"; +import { + type ExternalWalletSource, + SignedPayload, + TransactionHash, + WalletAdapterState, + WalletMissingCapabilityError, + WalletSendTransactionError, + WalletSignTypedDataError, + WalletSwitchAccountError, + WalletSwitchChainError, +} from "../../domain"; +import { WalletAdapterService } from "../wallet-adapter"; + +export const ExternalWalletAdapterLayer = (source: ExternalWalletSource) => + Layer.effect(WalletAdapterService)( + Effect.gen(function* () { + const decodeState = Schema.decodeUnknownSync(WalletAdapterState); + const stateRef = yield* SubscriptionRef.make( + decodeState(source.getState()), + ); + + const run = yield* FiberHandle.makeRuntimePromise(); + + const unsubscribe = source.subscribe((state) => { + run(SubscriptionRef.set(stateRef, decodeState(state))); + }); + + yield* Effect.addFinalizer(() => Effect.sync(unsubscribe)); + + return WalletAdapterService.of({ + mode: "external", + getState: () => stateRef.value, + changes: SubscriptionRef.changes(stateRef), + sendTransaction: (request) => + Effect.tryPromise(() => source.sendTransaction(request)).pipe( + Effect.andThen(Schema.decodeUnknownEffect(TransactionHash)), + Effect.mapError( + (reason) => new WalletSendTransactionError({ reason }), + ), + ), + signTypedData: (request) => + Effect.tryPromise(() => source.signTypedData(request)).pipe( + Effect.andThen(Schema.decodeUnknownEffect(SignedPayload)), + Effect.mapError( + (reason) => new WalletSignTypedDataError({ reason }), + ), + ), + switchAccount: (address) => { + const switchExternalAccount = source.switchAccount; + + return switchExternalAccount + ? Effect.tryPromise({ + try: () => switchExternalAccount(address), + catch: (reason) => new WalletSwitchAccountError({ reason }), + }) + : Effect.fail( + new WalletMissingCapabilityError({ + capability: "switchAccount", + }), + ); + }, + switchChain: (chainId) => { + const switchExternalChain = source.switchChain; + + return switchExternalChain + ? Effect.tryPromise({ + try: () => switchExternalChain(chainId), + catch: (reason) => new WalletSwitchChainError({ reason }), + }) + : Effect.fail( + new WalletMissingCapabilityError({ + capability: "switchChain", + }), + ); + }, + }); + }), + ); diff --git a/packages/common/src/services/wallet/ledger-signer/index.ts b/packages/common/src/services/wallet/ledger-signer/index.ts deleted file mode 100644 index 16640a8..0000000 --- a/packages/common/src/services/wallet/ledger-signer/index.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { - deserializeTransaction, - WalletAPIClient, - WindowMessageTransport, -} from "@ledgerhq/wallet-api-client"; -import { - Array as _Array, - Effect, - Layer, - Schema, - SubscriptionRef, -} from "effect"; -import { evmChainsMap } from "../../../domain/chains/evm"; -import type { SupportedLedgerLiveFamilies } from "../../../domain/chains/ledger"; -import { - type AccountsState, - type LedgerWalletAccount, - makeLedgerWalletAccount, - SignTransactionError, - SwitchAccountError, -} from "../../../domain/signer"; -import { - EIP712Tx, - EvmTx, - type Transaction, - TransactionHash, -} from "../../../domain/transactions"; -import { SignerService } from "../signer"; -import { - getFilteredSupportedLedgerFamiliesWithCurrency, - getLedgerAccounts, - getLedgerCurrencies, - NoAccountsFoundError, -} from "./utils"; - -export const LedgerSignerLayer = Effect.gen(function* () { - const transport = new WindowMessageTransport(); - transport.connect(); - const walletApiClient = new WalletAPIClient(transport); - - /** - * Create Map - * then use TokenCurrency parent to get CryptoCurrency family - * and add to map TokenCurrency['id'] => CryptoCurrency['family'] - */ - const ledgerCurrencies = yield* getLedgerCurrencies(walletApiClient); - const parentAccounts = yield* getLedgerAccounts(walletApiClient).pipe( - Effect.map((allAccounts) => allAccounts.filter((a) => !a.parentAccountId)), - ); - - const filteredSupportedLedgerFamiliesWithCurrency = - getFilteredSupportedLedgerFamiliesWithCurrency({ - ledgerCurrencies, - accounts: parentAccounts, - enabledChainsMap: { evm: evmChainsMap }, - }); - - const uniqueByAddressAccounts = parentAccounts.reduce( - (acc, next) => { - const family = ledgerCurrencies.get(next.currency); - - if (!family) return acc; - - const itemMap = filteredSupportedLedgerFamiliesWithCurrency.get( - family as SupportedLedgerLiveFamilies, - ); - - if (!family || !itemMap) return acc; - - const chainItem = itemMap.get("*") || itemMap.get(next.currency); - - if (chainItem) { - acc.push( - makeLedgerWalletAccount({ - address: next.address, - id: next.id, - }), - ); - } - - return acc; - }, - [], - ); - - const accountWithChain = yield* Effect.fromOption( - _Array.head(uniqueByAddressAccounts), - ).pipe(Effect.mapError(() => new NoAccountsFoundError())); - - const accountsStateRef = yield* SubscriptionRef.make< - AccountsState - >({ - status: "connected", - currentAccount: accountWithChain, - accounts: uniqueByAddressAccounts, - }); - - const signMessage = ({ - account, - transaction, - }: { - account: LedgerWalletAccount; - transaction: typeof EIP712Tx.Type; - }) => - Effect.sync(() => Buffer.from(JSON.stringify(transaction))).pipe( - Effect.andThen((buffer) => - Effect.promise(() => walletApiClient.message.sign(account.id, buffer)), - ), - Effect.andThen((buffer) => - Effect.sync(() => - Schema.decodeSync(TransactionHash)(buffer.toString("hex")), - ), - ), - Effect.mapError((error) => new SignTransactionError({ cause: error })), - ); - - const signEVMTransaction = ({ - account, - transaction, - }: { - account: LedgerWalletAccount; - transaction: typeof EvmTx.Type; - }) => - Schema.encodeEffect(EvmTx)(transaction).pipe( - Effect.andThen((tx) => - Effect.sync(() => - deserializeTransaction({ - ...tx, - family: "ethereum", - amount: String(tx.value ?? "0"), - recipient: tx.to, - data: tx.data.slice(2), - gasLimit: tx.gasLimit.toString(), - }), - ), - ), - Effect.andThen((tx) => - Effect.tryPromise(() => - walletApiClient.transaction.signAndBroadcast(account.id, tx), - ), - ), - Effect.andThen((hash) => - Effect.sync(() => Schema.decodeSync(TransactionHash)(hash)), - ), - Effect.mapError((error) => new SignTransactionError({ cause: error })), - ); - - const signTransaction = Effect.fn(function* ({ - transaction, - }: { - transaction: Transaction; - }) { - const currentAccount = yield* SubscriptionRef.get(accountsStateRef); - - if (currentAccount.status === "disconnected") { - return yield* Effect.die(new Error("Wallet is disconnected")); - } - - return yield* Schema.is(EIP712Tx)(transaction) - ? signMessage({ account: currentAccount.currentAccount, transaction }) - : signEVMTransaction({ - account: currentAccount.currentAccount, - transaction, - }); - }); - - const switchAccount = Effect.fn( - function* ({ account }: { account: LedgerWalletAccount }) { - const newAccount = yield* _Array.findFirst( - uniqueByAddressAccounts, - (a) => a.id === account.id, - ); - - yield* SubscriptionRef.update(accountsStateRef, (state) => ({ - ...state, - currentAccount: newAccount, - })); - }, - Effect.mapError((e) => new SwitchAccountError({ cause: e })), - ); - - return SignerService.of({ - type: "ledger", - signTransaction, - switchAccount, - accountsStream: SubscriptionRef.changes(accountsStateRef), - getAccountState: SubscriptionRef.get(accountsStateRef), - }); -}).pipe(Layer.effect(SignerService)); diff --git a/packages/common/src/services/wallet/ledger-signer/utils.ts b/packages/common/src/services/wallet/ledger-signer/utils.ts deleted file mode 100644 index 6d135e0..0000000 --- a/packages/common/src/services/wallet/ledger-signer/utils.ts +++ /dev/null @@ -1,185 +0,0 @@ -import type { - Account, - CryptoCurrency, - Currency, - ERC20TokenCurrency, - WalletAPIClient, -} from "@ledgerhq/wallet-api-client"; -import { Data, Effect, Option, Record } from "effect"; -import type { SupportedSKChains } from "../../../domain/chains"; -import type { EvmChainsMap } from "../../../domain/chains/evm"; -import { - type SupportedLedgerLiveFamilies, - supportedLedgerFamiliesWithCurrency, -} from "../../../domain/chains/ledger"; - -export const getFilteredSupportedLedgerFamiliesWithCurrency = ({ - accounts, - ledgerCurrencies, - enabledChainsMap, -}: { - accounts: Account[]; - ledgerCurrencies: Effect.Success>; - enabledChainsMap: { evm: Partial }; -}) => { - const { accountsFamilies, accountsCurrencies } = accounts.reduce( - (acc, next) => { - const family = ledgerCurrencies.get(next.currency); - - if (family) { - acc.accountsFamilies.add(family); - acc.accountsCurrencies.add(next.currency); - } - - return acc; - }, - { accountsFamilies: new Set(), accountsCurrencies: new Set() }, - ); - - const v = Record.map( - supportedLedgerFamiliesWithCurrency, - Record.filter((s, key) => { - const chain = enabledChainsMap.evm[s.skChainName]?.skChainName; - - if (!chain) return false; - - if ( - accountsFamilies.has(s.family) && - ((key as typeof key | "*") === "*" || - accountsCurrencies.has(s.currencyId)) - ) { - return true; - } - - return false; - }), - ); - - type V = typeof v; - type Key = keyof V; - - return Object.keys(v).reduce( - (acc, key) => { - const subItem = v[key as Key]; - - type SubItemKey = keyof typeof subItem; - - const subItemMap = Object.keys(subItem).reduce((acc, subKey) => { - const val = Record.get(subItem, subKey).pipe(Option.getOrNull); - - if (!val) return acc; - - acc.set(subKey as SubItemKey, val); - - return acc; - }, new Map()); - - acc.set(key as Key, subItemMap); - - return acc; - }, - new Map< - Key, - Map< - "*" | (string & {}), - { - currencyId: string; - family: SupportedLedgerLiveFamilies; - skChainName: SupportedSKChains; - } - > - >(), - ); -}; - -export const getLedgerCurrencies = (walletApiClient: WalletAPIClient) => - Effect.tryPromise({ - try: () => - walletApiClient.currency.list({ - currencyIds: Object.values(supportedLedgerFamiliesWithCurrency).flatMap( - (chain) => - Object.values(chain).map((currency) => currency.currencyId), - ), - }), - catch: (error) => new GetCurrenciesError({ cause: error }), - }).pipe( - Effect.map((val) => - val.reduce( - (acc, next) => { - if (next.type === "CryptoCurrency") { - acc.cryptoCurrency.set(next.id, next.family); - } else { - acc.tokenCurrency.push(next); - } - - return acc; - }, - { cryptoCurrency: new Map(), tokenCurrency: [] } as { - cryptoCurrency: Map; - tokenCurrency: ERC20TokenCurrency[]; - }, - ), - ), - Effect.map((val) => { - val.tokenCurrency.forEach((t) => { - const parentCryptoCurrencyFamily = val.cryptoCurrency.get(t.parent); - - if (parentCryptoCurrencyFamily) { - val.cryptoCurrency.set(t.id, parentCryptoCurrencyFamily); - } - }); - - return val.cryptoCurrency; - }), - ); - -export const getLedgerAccounts = (walletApiClient: WalletAPIClient) => - Effect.tryPromise({ - try: () => walletApiClient.account.list(), - catch: (error) => new GetAccountsError({ cause: error }), - }).pipe( - Effect.map((val) => ({ - accounts: val, - accountsMap: new Map(val.map((v) => [v.id, v])), - })), - Effect.map((val) => - val.accounts.map((acc) => { - if (!acc.parentAccountId) return acc; - - return Option.fromNullishOr( - val.accountsMap.get(acc.parentAccountId), - ).pipe( - Option.map((parentAcc) => ({ - ...acc, - currency: parentAcc.currency, - })), - Option.getOrElse(() => acc), - ); - }), - ), - ); - -export class GetAccountsError extends Data.TaggedError("GetAccountsError")<{ - cause: unknown; -}> {} - -export class GetCurrenciesError extends Data.TaggedError("GetCurrenciesError")<{ - cause: unknown; -}> {} - -export class NoAccountsFoundError extends Data.TaggedError( - "NoAccountsFoundError", -) {} - -export const isLedgerDappBrowserProvider = Option.fromNullishOr(window).pipe( - Option.map((w) => { - try { - const params = new URLSearchParams(w.self.location.search); - - return !!params.get("embed"); - } catch (_error) { - return false; - } - }), - Option.getOrElse(() => false), -); diff --git a/packages/common/src/services/wallet/signer.ts b/packages/common/src/services/wallet/signer.ts deleted file mode 100644 index f2287fd..0000000 --- a/packages/common/src/services/wallet/signer.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Context } from "effect"; -import type { Signer } from "../../domain/signer"; - -export class SignerService extends Context.Service()( - "perps/services/wallet/signer/SignerService", -) {} diff --git a/packages/common/src/services/wallet/wallet-service.ts b/packages/common/src/services/wallet/wallet-service.ts deleted file mode 100644 index c6d7a9a..0000000 --- a/packages/common/src/services/wallet/wallet-service.ts +++ /dev/null @@ -1,358 +0,0 @@ -import { - Array as _Array, - Context, - Data, - Duration, - Effect, - Layer, - Match, - Schedule, - Schema, - Stream, - SubscriptionRef, -} from "effect"; -import type { BrowserSigner, LedgerSigner } from "../../domain/signer"; -import { Transaction } from "../../domain/transactions"; -import { - type SignTransactionsState, - TransactionFailedError, - TransactionNotConfirmedError, - type Wallet, -} from "../../domain/wallet"; -import { ApiClientService } from "../api-client"; -import type { ActionDto } from "../api-client/client-factory"; -import { SignerService } from "./signer"; - -export class WalletService extends Context.Service()( - "perps/services/wallet-service/WalletService", - { - make: Effect.gen(function* () { - const apiClient = yield* ApiClientService; - const signer = yield* SignerService; - - type SignAction = Data.TaggedEnum<{ - MachineStart: {}; - SignStart: {}; - SignDone: { txHash: string }; - SubmitStart: {}; - SubmitDone: {}; - CheckStart: {}; - CheckDone: { action: ActionDto }; - Error: { - error: SignTransactionsState["error"]; - }; - }>; - const SignAction = Data.taggedEnum(); - - const signTransactions = (action: ActionDto) => - Effect.gen(function* () { - const ref = yield* SubscriptionRef.make({ - action: action, - transactions: action.transactions, - currentTxIndex: 0, - step: null, - error: null, - txHash: null, - isDone: false, - }); - - const updateState = (action: SignAction) => - SubscriptionRef.update(ref, (state) => - SignAction.$match(action, { - MachineStart: () => ({ - ...state, - error: null, - txHash: null, - step: "sign" as const, - }), - SignStart: () => ({ - ...state, - error: null, - txHash: null, - step: "sign" as const, - }), - SignDone: (val) => ({ - ...state, - error: null, - txHash: val.txHash, - step: "submit" as const, - }), - SubmitStart: () => ({ - ...state, - error: null, - txHash: state.txHash as string, - step: "submit" as const, - }), - SubmitDone: () => ({ - ...state, - error: null, - txHash: state.txHash as string, - step: "check" as const, - }), - CheckStart: () => ({ - ...state, - error: null, - txHash: state.txHash as string, - step: "check" as const, - }), - CheckDone: (val) => { - const isDone = - state.currentTxIndex === state.transactions.length - 1; - - /** - * Mantain order - */ - const transactions = state.transactions.map( - (tx) => - val.action.transactions.find((t) => t.id === tx.id) ?? tx, - ); - - if (isDone) { - return { - ...state, - isDone, - transactions, - error: null, - step: null, - txHash: null, - }; - } - - return { - ...state, - txHash: null, - transactions, - step: "sign" as const, - currentTxIndex: state.currentTxIndex + 1, - }; - }, - Error: (val) => ({ ...state, error: val.error }), - }), - ); - - const startMachine = Effect.gen(function* () { - const state = yield* SubscriptionRef.get(ref); - const tx = yield* Effect.fromOption( - _Array.get(state.transactions, state.currentTxIndex), - ).pipe(Effect.orDie); - - const accountState = yield* signer.getAccountState; - - if (accountState.status === "disconnected") { - return yield* Effect.die(new Error("Wallet is disconnected")); - } - - const signablePayload = tx.signablePayload; - - if (!signablePayload) { - return yield* updateState( - SignAction.CheckDone({ action: state.action }), - ); - } - - const decodedTx = yield* Schema.decodeUnknownEffect(Transaction)( - signablePayload, - ).pipe(Effect.orDie); - - yield* Match.value(state.step).pipe( - Match.when(null, () => updateState(SignAction.MachineStart())), - Match.when( - "sign", - Effect.fn(function* () { - yield* updateState(SignAction.SignStart()); - - const txHash = yield* signer.signTransaction({ - transaction: decodedTx, - }); - - yield* updateState(SignAction.SignDone({ txHash })); - }), - ), - Match.when( - "submit", - Effect.fn(function* () { - yield* updateState(SignAction.SubmitStart()); - - const txHash = yield* SubscriptionRef.get(ref).pipe( - Effect.map((state) => state.txHash), - Effect.filterOrFail( - (txHash): txHash is string => txHash !== null, - () => new TransactionFailedError(), - ), - ); - - yield* apiClient.TransactionsControllerSubmitTransaction( - tx.id, - { - payload: - tx.signingFormat === "EIP712_TYPED_DATA" - ? { signedPayload: txHash } - : { transactionHash: txHash }, - }, - ); - - yield* updateState(SignAction.SubmitDone()); - }), - ), - Match.when( - "check", - Effect.fn(function* () { - yield* updateState(SignAction.CheckStart()); - - const action = yield* apiClient - .ActionsControllerGetAction(state.action.id, undefined) - .pipe( - Effect.andThen((res) => - Effect.fromOption( - _Array.findFirst( - res.transactions, - (newTx) => newTx.id === tx.id, - ), - ).pipe( - Effect.catch(() => - Effect.die( - new Error("Transaction not found in response"), - ), - ), - Effect.andThen((newTx) => - Match.value(newTx.status).pipe( - Match.when( - (res) => - res === "CONFIRMED" || res === "BROADCASTED", - () => Effect.succeed(newTx), - ), - Match.when( - (res) => - res === "NOT_FOUND" || res === "FAILED", - () => Effect.fail(new TransactionFailedError()), - ), - Match.orElse(() => - Effect.fail(new TransactionNotConfirmedError()), - ), - ), - ), - Effect.as(res), - ), - ), - Effect.retry({ - while: (e) => e._tag === "TransactionNotConfirmedError", - times: 20, - schedule: Schedule.spaced(Duration.seconds(2)), - }), - ); - - yield* updateState(SignAction.CheckDone({ action })); - }), - ), - Match.exhaustive, - ); - }).pipe( - Effect.tapError((e) => updateState(SignAction.Error({ error: e }))), - Effect.repeat({ - while: () => - SubscriptionRef.get(ref).pipe( - Effect.map((state) => state.step !== null), - ), - }), - Effect.ignore, - ); - - Effect.runFork(startMachine as Effect.Effect); - - const retry = startMachine as Effect.Effect; - const stream = SubscriptionRef.changes(ref); - - return { stream, retry }; - }); - - const getWalletState = Match.type< - | { - type: BrowserSigner["type"]; - signer: BrowserSigner; - accountsState: Effect.Success; - } - | { - type: LedgerSigner["type"]; - signer: LedgerSigner; - accountsState: Effect.Success; - } - >().pipe( - Match.withReturnType(), - Match.when({ type: "browser" }, ({ signer, accountsState }) => - Match.value(accountsState).pipe( - Match.withReturnType(), - Match.when({ status: "connected" }, (connectedState) => { - const state = connectedState as Effect.Success< - BrowserSigner["getAccountState"] - > & { status: "connected" }; - return { - type: "browser", - wagmiAdapter: signer.wagmiAdapter, - status: "connected", - accounts: state.accounts, - currentAccount: state.currentAccount, - signTransactions, - switchAccount: signer.switchAccount, - }; - }), - Match.orElse(() => { - return { - type: "browser", - wagmiAdapter: signer.wagmiAdapter, - status: "disconnected", - }; - }), - ), - ), - Match.orElse(({ accountsState, signer }) => - Match.value(accountsState).pipe( - Match.withReturnType(), - Match.when({ status: "connected" }, (connectedState) => { - const state = connectedState as Effect.Success< - LedgerSigner["getAccountState"] - > & { status: "connected" }; - return { - type: "ledger", - status: "connected", - accounts: state.accounts, - currentAccount: state.currentAccount, - signTransactions, - switchAccount: signer.switchAccount, - }; - }), - Match.orElse(() => { - return { - type: "ledger", - status: "disconnected", - }; - }), - ), - ), - ); - - const walletStream = Match.value(signer).pipe( - Match.when({ type: "browser" }, (s) => - s.accountsStream.pipe( - Stream.map((accountsState) => - getWalletState({ type: "browser", signer: s, accountsState }), - ), - ), - ), - Match.when({ type: "ledger" }, (s) => - s.accountsStream.pipe( - Stream.map((accountsState) => - getWalletState({ type: "ledger", signer: s, accountsState }), - ), - ), - ), - Match.exhaustive, - ); - - return { walletStream }; - }), - }, -) { - static readonly layer = Layer.effect(this, this.make).pipe( - Layer.provide(ApiClientService.layer), - ); -} diff --git a/packages/common/src/vite.config.ts b/packages/common/src/vite.config.ts index 8f7986e..46720cb 100644 --- a/packages/common/src/vite.config.ts +++ b/packages/common/src/vite.config.ts @@ -1,6 +1,7 @@ +import babel from "@rolldown/plugin-babel"; import tailwindcss from "@tailwindcss/vite"; import { tanstackRouter } from "@tanstack/router-plugin/vite"; -import viteReact from "@vitejs/plugin-react"; +import viteReact, { reactCompilerPreset } from "@vitejs/plugin-react"; import { playwright } from "@vitest/browser-playwright"; import type { UserConfig } from "vite"; import { nodePolyfills } from "vite-plugin-node-polyfills"; @@ -12,41 +13,27 @@ declare module "vite" { } } -export const commonPlugins = { - tanstackRouter: tanstackRouter({ - target: "react", - autoCodeSplitting: true, - }), - viteReact: viteReact({ - babel: { - plugins: ["babel-plugin-react-compiler"], - }, - }), - tailwindcss: tailwindcss(), - nodePolyfills: nodePolyfills({ include: ["buffer"] }), -}; - -const createTanstackRouterPlugin = () => +export const createTanstackRouterPlugin = () => tanstackRouter({ target: "react", autoCodeSplitting: true, }); -const createViteReactPlugin = () => - viteReact({ - babel: { - plugins: ["babel-plugin-react-compiler"], - }, - }); +export const createViteReactPlugin = () => viteReact(); + +export const createReactCompilerPlugin = () => + babel({ presets: [reactCompilerPreset()] }); -const createTailwindPlugin = () => tailwindcss(); +export const createTailwindPlugin = () => tailwindcss(); -const createNodePolyfillsPlugin = () => nodePolyfills({ include: ["buffer"] }); +export const createNodePolyfillsPlugin = () => + nodePolyfills({ include: ["buffer"] }); export const createCommonViteConfig = (): UserConfig => ({ plugins: [ createTanstackRouterPlugin(), createViteReactPlugin(), + createReactCompilerPlugin(), createTailwindPlugin(), createNodePolyfillsPlugin(), ], @@ -56,7 +43,6 @@ export const createCommonViteConfig = (): UserConfig => ({ headless: true, enabled: true, provider: playwright(), - // https://vitest.dev/config/browser/playwright instances: [{ browser: "chromium" }], }, include: ["./tests/**/*.test.{ts,tsx}"], diff --git a/packages/common/tests/adjust-margin.test.ts b/packages/common/tests/adjust-margin.test.ts index 1eb20b5..6605a29 100644 --- a/packages/common/tests/adjust-margin.test.ts +++ b/packages/common/tests/adjust-margin.test.ts @@ -9,7 +9,7 @@ describe("adjust margin helpers", () => { const position = { markPrice: 4_000, side: "long" as const, - size: "1", + size: 1, }; const lowerRiskPrice = getEstimatedLiquidationPriceForProjectedMargin({ @@ -35,7 +35,7 @@ describe("adjust margin helpers", () => { const position = { markPrice: 4_000, side: "short" as const, - size: "1", + size: 1, }; const lowerRiskPrice = getEstimatedLiquidationPriceForProjectedMargin({ @@ -61,7 +61,7 @@ describe("adjust margin helpers", () => { const position = { markPrice: 4_000, side: "long" as const, - size: "1", + size: 1, }; expect( diff --git a/packages/common/tests/domain-models.test.ts b/packages/common/tests/domain-models.test.ts new file mode 100644 index 0000000..ae6f339 --- /dev/null +++ b/packages/common/tests/domain-models.test.ts @@ -0,0 +1,215 @@ +import { Schema } from "effect"; +import { describe, expect, test } from "vitest"; +import { + Action, + ActivityItem, + ApiEvent, + BigIntFromString, + Market, + Position, + Provider, + TokenAddress, + updateMarketMarkPrice, + updatePositionMarkPrice, +} from "../src/domain"; + +const token = { + symbol: "ETH", + name: "Ethereum", + network: "hyperliquid" as const, + decimals: 18, + address: "0xABCD", + logoURI: "https://example.com/eth.png", +}; + +const marketDto = { + id: "hyperliquid-eth-usdc", + providerId: "hyperliquid", + baseAsset: token, + quoteAsset: { + symbol: "USDC", + name: "USD Coin", + network: "arbitrum" as const, + decimals: 6, + address: "0xAF88D065E77C8CC2239327C5EDB3A432268E5831", + logoURI: "https://example.com/usdc.png", + }, + leverageRange: [1, 50], + supportedMarginModes: ["isolated", "cross"] as const, + markPrice: 4000, + oraclePrice: 3998, + priceChange24h: 12, + priceChangePercent24h: 0.3, + volume24h: 1000000, + openInterest: 5000, + makerFee: "0.0002", + takerFee: "0.0004", + fundingRate: "0.00012", + fundingRateIntervalHours: 8, + minSize: 10, + metadata: { + name: "ETH-USDC Perpetual", + logoURI: "https://example.com/market.png", + url: "https://example.com/market", + }, +}; + +const providerDto = { + id: "hyperliquid", + name: "Hyperliquid", + network: "hyperliquid", + metadata: { + description: "Hyperliquid is a high-performance L1.", + externalLink: "https://hyperliquid.xyz", + logoURI: "https://assets.stakek.it/providers/hyperliquid.svg", + }, + supportedActions: [ + "open", + "close", + "updateLeverage", + "updateMargin", + ] as const, + argumentSchemas: {}, +}; + +const pendingActionDto = { + type: "close" as const, + label: "Close Position", + args: { + marketId: "hyperliquid-eth-usdc", + size: "1.25", + }, +}; + +const positionDto = { + marketId: "hyperliquid-eth-usdc", + side: "long" as const, + size: "1.25", + entryPrice: 3900, + markPrice: 4000, + leverage: 10, + marginMode: "isolated" as const, + margin: 500, + unrealizedPnl: 125, + funding: -1.2, + liquidationPrice: 3500, + pendingActions: [pendingActionDto], +}; + +const transactionDto = { + id: "tx-1", + network: "arbitrum" as const, + chainId: "42161", + type: "OPEN_POSITION" as const, + status: "CREATED" as const, + address: "0x1111111111111111111111111111111111111111", + explorerUrls: [], +}; + +const actionDto = { + id: "action-1", + providerId: "hyperliquid", + action: "open" as const, + status: "CREATED" as const, + summary: { + type: "Open Position" as const, + size: "1.25", + amount: "500", + fee: "0.0004", + }, + transactions: [transactionDto], + createdAt: "2026-05-11T00:00:00.000Z", + completedAt: "2026-05-11T00:00:00.000Z", +}; + +const eventDto = { + id: "event-1", + eventType: "order_filled" as const, + providerId: "hyperliquid", + occurredAt: "2026-05-11T00:00:00.000Z", + marketId: "hyperliquid-eth-usdc", + perpActionId: "action-1", + providerOrderId: "order-1", + explorerUrl: "https://example.com/tx", + order: { + orderId: "order-1", + marketId: "hyperliquid-eth-usdc", + asset: "ETH", + side: "buy" as const, + type: "market" as const, + originalSizeBase: "1.25", + remainingSizeBase: "0", + reduceOnly: false, + isPositionLevel: false, + clientOrderId: null, + childOrderIds: [], + createdAt: "2026-05-11T00:00:00.000Z", + closedPnl: "42.5", + fillPrice: 4010, + }, +}; + +describe("domain model decoding", () => { + test("normalizes scalar and identifier values", () => { + expect(Schema.decodeUnknownSync(TokenAddress)("0xABCD")).toBe("0xabcd"); + expect(Schema.decodeUnknownSync(BigIntFromString)("123")).toBe(123n); + }); + + test("decodes market and lowercases token addresses", () => { + const market = Schema.decodeUnknownSync(Market)(marketDto); + + expect(market).toBeInstanceOf(Market); + expect(market.id).toBe("hyperliquid-eth-usdc"); + expect(market.baseAsset.address).toBe("0xabcd"); + expect(market.quoteAsset.address).toBe( + "0xaf88d065e77c8cc2239327c5edb3a432268e5831", + ); + }); + + test("decodes provider supported actions", () => { + const provider = Schema.decodeUnknownSync(Provider)(providerDto); + + expect(provider).toBeInstanceOf(Provider); + expect(provider.supportedActions).toEqual([ + "open", + "close", + "updateLeverage", + "updateMargin", + ]); + }); + + test("decodes portfolio values with string numeric fields", () => { + const position = Schema.decodeUnknownSync(Position)(positionDto); + + expect(position).toBeInstanceOf(Position); + expect(position.size).toBe(1.25); + expect(position.pendingActions[0]?.args.size).toBe(1.25); + }); + + test("decodes action, API event, and activity item models", () => { + const action = Schema.decodeUnknownSync(Action)(actionDto); + const event = Schema.decodeUnknownSync(ApiEvent)(eventDto); + const activity = Schema.decodeUnknownSync(ActivityItem)({ + type: "event", + event: eventDto, + }); + + expect(action.transactions[0]?.chainId).toBe("42161"); + expect(action.summary?.size).toBe(1.25); + expect(event.order.originalSizeBase).toBe(1.25); + expect(activity.type).toBe("event"); + }); + + test("safe update helpers preserve domain model instances", () => { + const market = Schema.decodeUnknownSync(Market)(marketDto); + const position = Schema.decodeUnknownSync(Position)(positionDto); + + const updatedMarket = updateMarketMarkPrice(market, 4100); + const updatedPosition = updatePositionMarkPrice(position, 4100); + + expect(updatedMarket).toBeInstanceOf(Market); + expect(updatedMarket.markPrice).toBe(4100); + expect(updatedPosition).toBeInstanceOf(Position); + expect(updatedPosition.markPrice).toBe(4100); + }); +}); diff --git a/packages/common/tests/events.test.ts b/packages/common/tests/events.test.ts new file mode 100644 index 0000000..ef1ae41 --- /dev/null +++ b/packages/common/tests/events.test.ts @@ -0,0 +1,85 @@ +import { Effect, Layer, Stream } from "effect"; +import * as Reactivity from "effect/unstable/reactivity/Reactivity"; +import { describe, expect, test } from "vitest"; +import { portfolioReactivityKeysArray } from "../src/atoms/reactivity-keys"; +import type { LifecycleEvent } from "../src/domain"; +import { EventsService } from "../src/services/events"; + +const event = { + type: "transaction.submitted", + action: { + id: "action-1", + providerId: "hyperliquid", + action: "open", + status: "PROCESSING", + }, + transaction: { + id: "tx-1", + type: "OPEN_POSITION", + status: "BROADCASTED", + network: "arbitrum", + chainId: "42161", + }, + result: { + type: "transactionHash", + transactionHash: "0xhash", + }, +} as unknown as LifecycleEvent; + +const makeLayer = (invalidations: unknown[]) => + EventsService.layer.pipe( + Layer.provide( + Layer.succeed(Reactivity.Reactivity, { + invalidateUnsafe: () => undefined, + registerUnsafe: () => () => undefined, + invalidate: (keys) => + Effect.sync(() => { + invalidations.push(keys); + }), + mutation: (_keys, effect) => effect, + query: () => Effect.die(new Error("unused")), + stream: () => Stream.die(new Error("unused")), + withBatch: (effect) => effect, + }), + ), + ); + +describe("EventsService", () => { + test("delivers external subscriptions and cleans up unsubscribe", () => { + const invalidations: unknown[] = []; + const received: LifecycleEvent[] = []; + + return Effect.gen(function* () { + const events = yield* EventsService; + const unsubscribe = yield* events.subscribe((event) => { + received.push(event); + }); + + yield* events.publish(event); + yield* Effect.yieldNow; + unsubscribe(); + yield* Effect.yieldNow; + yield* events.publish({ + ...event, + type: "action.completed", + action: { ...event.action, status: "SUCCESS" }, + }); + yield* Effect.yieldNow; + + expect(received).toEqual([event]); + }).pipe(Effect.provide(makeLayer(invalidations)), Effect.runPromise); + }); + + test("invalidates portfolio reactivity for transaction lifecycle events", () => { + const invalidations: unknown[] = []; + + return Effect.gen(function* () { + const events = yield* EventsService; + + yield* events.publish(event); + yield* Effect.yieldNow; + + expect(invalidations).toContainEqual(portfolioReactivityKeysArray); + }).pipe(Effect.provide(makeLayer(invalidations)), Effect.runPromise); + }); +}); diff --git a/packages/common/tests/transaction-execution.test.ts b/packages/common/tests/transaction-execution.test.ts new file mode 100644 index 0000000..6eadb14 --- /dev/null +++ b/packages/common/tests/transaction-execution.test.ts @@ -0,0 +1,291 @@ +import { Effect, Layer, Schedule, Schema, Stream } from "effect"; +import { describe, expect, test } from "vitest"; +import { + Action, + type LifecycleEvent, + type PerpsWalletAdapter, + SignedPayload, + type SignTransactionsState, + TransactionFailedError, + TransactionHash, + WalletAddress, + WalletSendTransactionError, +} from "../src/domain"; +import type { ApiClientService } from "../src/services/api-client"; +import { ApiClientService as ApiClientTag } from "../src/services/api-client"; +import { EventsService } from "../src/services/events"; +import { WalletAdapterService } from "../src/services/wallet-adapter"; + +const account = Schema.decodeUnknownSync(WalletAddress)( + "0x00000000000000000000000000000000000000a1", +); + +const baseTx = { + id: "tx-1", + network: "arbitrum" as const, + chainId: "42161", + type: "OPEN_POSITION" as const, + status: "CREATED" as const, + address: account, + explorerUrls: [], +}; + +const makeAction = (tx: Record, status = "CREATED") => + Schema.decodeUnknownSync(Action)({ + id: "action-1", + providerId: "hyperliquid", + action: "open", + status, + summary: null, + transactions: [tx], + createdAt: "2026-05-11T00:00:00.000Z", + completedAt: "2026-05-11T00:00:00.000Z", + }); + +const makeConfirmedAction = () => + makeAction({ ...baseTx, status: "CONFIRMED" }, "SUCCESS"); + +const makeFailedAction = () => + makeAction({ ...baseTx, status: "FAILED" }, "PROCESSING"); + +const evmPayload = { + from: account, + to: "0x00000000000000000000000000000000000000b2", + data: "0x", + gasLimit: 1n, + chainId: 42161, +}; + +const typedDataPayload = { + domain: { chainId: 42161 }, + types: {}, + message: {}, + primaryType: "Order", +}; + +const makeWalletAdapter = (options?: { + sendTransaction?: PerpsWalletAdapter["sendTransaction"]; + signTypedData?: PerpsWalletAdapter["signTypedData"]; +}): PerpsWalletAdapter => ({ + mode: "external", + getState: () => ({ + status: "connected", + currentAccount: { address: account }, + accounts: [{ address: account }], + }), + changes: Stream.empty, + sendTransaction: + options?.sendTransaction ?? + (() => Effect.succeed(Schema.decodeUnknownSync(TransactionHash)("0xevm"))), + signTypedData: + options?.signTypedData ?? + (() => Effect.succeed(Schema.decodeUnknownSync(SignedPayload)("0xsigned"))), + switchAccount: () => Effect.void, + switchChain: () => Effect.void, +}); + +const makeApiClient = (options?: { + onSubmit?: (payload: unknown) => void; + getAction?: () => Effect.Effect; +}): ApiClientService["Service"] => + ({ + TransactionsControllerSubmitTransaction: (_id: string, payload: unknown) => + Effect.sync(() => { + options?.onSubmit?.(payload); + + return { + link: "https://example.test", + status: "CONFIRMED", + }; + }), + ActionsControllerGetAction: + options?.getAction ?? + (() => Effect.succeed(makeConfirmedAction() as unknown)), + }) as unknown as ApiClientService["Service"]; + +const collectExecutionStates = ( + execution: Effect.Effect, +): Effect.Effect> => + execution.pipe( + Stream.fromEffect, + Stream.repeat(Schedule.forever), + Stream.takeUntil((state) => state.isDone || state.error !== null), + Stream.runCollect, + Effect.map((states) => Array.from(states)), + ); + +const runExecution = ( + action: Action, + options?: { + apiClient?: ApiClientService["Service"]; + events?: LifecycleEvent[]; + walletAdapter?: PerpsWalletAdapter; + }, +) => + Effect.gen(function* () { + const { makeTransactionExecution } = yield* Effect.promise( + () => import("../src/atoms/transaction-execution-atoms"), + ); + const execution = yield* makeTransactionExecution(action); + + const states = yield* collectExecutionStates(execution); + + return { execution, states }; + }).pipe( + Effect.provide( + Layer.mergeAll( + Layer.succeed(ApiClientTag, options?.apiClient ?? makeApiClient()), + Layer.succeed( + WalletAdapterService, + options?.walletAdapter ?? makeWalletAdapter(), + ), + Layer.succeed(EventsService, { + publish: (event) => + Effect.sync(() => { + options?.events?.push(event); + return true; + }), + publishAll: (events) => + Effect.sync(() => { + options?.events?.push(...events); + return true; + }), + stream: Stream.empty, + subscribe: () => Effect.succeed(() => undefined), + }), + ), + ), + ); + +describe("transaction execution", () => { + test("completes transactions with no signable payload", () => + runExecution(makeAction(baseTx)).pipe( + Effect.tap(({ states }) => + Effect.sync(() => { + expect(states.at(-1)).toMatchObject({ isDone: true, error: null }); + }), + ), + Effect.runPromise, + )); + + test("submits EVM wallet results as transaction hashes", () => { + const events: LifecycleEvent[] = []; + const submitted: unknown[] = []; + const action = makeAction({ + ...baseTx, + signingFormat: "EVM_TRANSACTION", + signablePayload: evmPayload, + }); + + return runExecution(action, { + apiClient: makeApiClient({ + onSubmit: (payload) => submitted.push(payload), + }), + events, + }).pipe( + Effect.tap(({ states }) => + Effect.sync(() => { + expect(states.at(-1)).toMatchObject({ isDone: true, error: null }); + expect(submitted.at(-1)).toEqual({ + payload: { transactionHash: "0xevm" }, + }); + expect(events.map((event) => event.type)).toEqual([ + "transaction.signing_started", + "transaction.submitted", + "action.completed", + ]); + }), + ), + Effect.runPromise, + ); + }); + + test("submits EIP-712 wallet results as signed payloads", () => { + const submitted: unknown[] = []; + const action = makeAction({ + ...baseTx, + signingFormat: "EIP712_TYPED_DATA", + signablePayload: typedDataPayload, + }); + + return runExecution(action, { + apiClient: makeApiClient({ + onSubmit: (payload) => submitted.push(payload), + }), + }).pipe( + Effect.tap(({ states }) => + Effect.sync(() => { + expect(states.at(-1)).toMatchObject({ isDone: true, error: null }); + expect(submitted.at(-1)).toEqual({ + payload: { signedPayload: "0xsigned" }, + }); + }), + ), + Effect.runPromise, + ); + }); + + test("stops in a terminal failure state", () => { + const action = makeAction({ + ...baseTx, + signingFormat: "EVM_TRANSACTION", + signablePayload: evmPayload, + }); + + return runExecution(action, { + apiClient: makeApiClient({ + getAction: () => Effect.succeed(makeFailedAction() as unknown), + }), + }).pipe( + Effect.tap(({ states }) => + Effect.sync(() => { + const state = states.at(-1); + + expect(state?.error).toBeInstanceOf(TransactionFailedError); + expect(state?.isDone).toBe(false); + }), + ), + Effect.runPromise, + ); + }); + + test("retries after a recoverable signing error", () => { + const action = makeAction({ + ...baseTx, + signingFormat: "EVM_TRANSACTION", + signablePayload: evmPayload, + }); + let attempts = 0; + + return Effect.gen(function* () { + const { execution, states } = yield* runExecution(action, { + walletAdapter: makeWalletAdapter({ + sendTransaction: () => { + attempts += 1; + + if (attempts === 1) { + return Effect.fail( + new WalletSendTransactionError({ + reason: new Error("temporary signing failure"), + }), + ); + } + + return Effect.succeed( + Schema.decodeUnknownSync(TransactionHash)("0xretry"), + ); + }, + }), + }); + + expect(states.at(-1)?.error).not.toBeNull(); + + const retryStates = yield* collectExecutionStates(execution); + + expect(retryStates.at(-1)).toMatchObject({ + isDone: true, + error: null, + }); + }).pipe(Effect.runPromise); + }); +}); diff --git a/packages/common/tests/wallet-adapter.test.ts b/packages/common/tests/wallet-adapter.test.ts new file mode 100644 index 0000000..c55f02f --- /dev/null +++ b/packages/common/tests/wallet-adapter.test.ts @@ -0,0 +1,144 @@ +import { Effect, Layer, Schema, Stream } from "effect"; +import { describe, expect, test } from "vitest"; +import { + type ExternalWalletSource, + type PerpsWalletAdapter, + type WalletAdapterState, + WalletAddress, + WalletMissingCapabilityError, +} from "../src/domain"; +import { ExternalWalletAdapterLayer } from "../src/services/wallet/external-wallet-adapter"; +import { WalletAdapterService } from "../src/services/wallet-adapter"; + +const accountA = Schema.decodeUnknownSync(WalletAddress)( + "0x00000000000000000000000000000000000000a1", +); +const accountB = Schema.decodeUnknownSync(WalletAddress)( + "0x00000000000000000000000000000000000000b2", +); + +const disconnectedState: WalletAdapterState = { status: "disconnected" }; + +const connectedState = (currentAccount = accountA): WalletAdapterState => ({ + status: "connected", + currentAccount: { address: currentAccount }, + accounts: [{ address: accountA }, { address: accountB }], +}); + +const makeBrowserAdapter = (): PerpsWalletAdapter => { + const currentState = connectedState(); + + return { + mode: "browser", + wagmiAdapter: {} as Extract< + PerpsWalletAdapter, + { mode: "browser" } + >["wagmiAdapter"], + getState: () => currentState, + changes: Stream.succeed(currentState), + sendTransaction: () => Effect.die(new Error("unused")), + signTypedData: () => Effect.die(new Error("unused")), + switchAccount: () => Effect.void, + switchChain: () => Effect.void, + }; +}; + +const makeExternalAdapter = (initialState: WalletAdapterState) => { + let state = initialState; + const listeners = new Set<(state: WalletAdapterState) => void>(); + + const adapter: ExternalWalletSource = { + getState: () => state, + subscribe: (listener) => { + listeners.add(listener); + + return () => { + listeners.delete(listener); + }; + }, + sendTransaction: () => Promise.reject(new Error("unused")), + signTypedData: () => Promise.reject(new Error("unused")), + }; + + return { + adapter, + emit: (nextState: WalletAdapterState) => { + state = nextState; + + for (const listener of listeners) { + listener(nextState); + } + }, + }; +}; + +describe("WalletAdapterService", () => { + test("selects browser mode without an external source", () => + Effect.gen(function* () { + const adapter = yield* WalletAdapterService; + + expect(adapter.mode).toBe("browser"); + expect(adapter.getState()).toMatchObject({ + status: "connected", + currentAccount: { address: accountA }, + }); + }).pipe( + Effect.provide(Layer.succeed(WalletAdapterService, makeBrowserAdapter())), + Effect.runPromise, + )); + + test("selects external mode when a host adapter is provided", () => { + const external = makeExternalAdapter(connectedState(accountB)); + + return Effect.gen(function* () { + const adapter = yield* WalletAdapterService; + + expect(adapter.mode).toBe("external"); + expect(adapter.getState()).toMatchObject({ + status: "connected", + currentAccount: { address: accountB }, + }); + }).pipe( + Effect.provide(ExternalWalletAdapterLayer(external.adapter)), + Effect.runPromise, + ); + }); + + test("updates state when the external adapter emits a change", () => { + const external = makeExternalAdapter(disconnectedState); + + return Effect.gen(function* () { + const adapter = yield* WalletAdapterService; + + expect(adapter.getState()).toEqual(disconnectedState); + + external.emit(connectedState(accountB)); + yield* Effect.yieldNow; + + expect(adapter.getState()).toMatchObject({ + status: "connected", + currentAccount: { address: accountB }, + }); + }).pipe( + Effect.provide(ExternalWalletAdapterLayer(external.adapter)), + Effect.runPromise, + ); + }); + + test("returns typed missing capability errors for absent external account switching", () => { + const external = makeExternalAdapter(connectedState()); + + return Effect.gen(function* () { + const adapter = yield* WalletAdapterService; + const error = yield* adapter.switchAccount(accountA).pipe(Effect.flip); + + expect(error).toBeInstanceOf(WalletMissingCapabilityError); + if (error._tag === "WalletMissingCapabilityError") { + expect(error.capability).toBe("switchAccount"); + } + }).pipe( + Effect.provide(ExternalWalletAdapterLayer(external.adapter)), + Effect.runPromise, + ); + }); +}); diff --git a/packages/common/vite.config.ts b/packages/common/vite.config.ts index 519b49d..fd07362 100644 --- a/packages/common/vite.config.ts +++ b/packages/common/vite.config.ts @@ -1,13 +1,18 @@ import { defineConfig } from "vite"; -import { commonPlugins, createCommonViteConfig } from "./src/vite.config"; +import { + createCommonViteConfig, + createNodePolyfillsPlugin, + createTailwindPlugin, + createViteReactPlugin, +} from "./src/vite.config"; const commonViteConfig = createCommonViteConfig(); export default defineConfig({ plugins: [ - commonPlugins.viteReact, - commonPlugins.tailwindcss, - commonPlugins.nodePolyfills, + createViteReactPlugin(), + createTailwindPlugin(), + createNodePolyfillsPlugin(), ], test: commonViteConfig.test, optimizeDeps: commonViteConfig.optimizeDeps, diff --git a/packages/dashboard/package.json b/packages/dashboard/package.json index f19802b..adb022e 100644 --- a/packages/dashboard/package.json +++ b/packages/dashboard/package.json @@ -1,62 +1,98 @@ { "name": "@yieldxyz/perps-dashboard", + "version": "0.0.1", "type": "module", + "license": "BUSL-1.1", + "sideEffects": [ + "**/*.css" + ], + "files": [ + "dist" + ], + "main": "./dist/react/index.js", + "module": "./dist/react/index.js", + "types": "./dist/src/index.d.ts", + "exports": { + ".": { + "types": "./dist/src/index.d.ts", + "import": "./dist/react/index.js" + }, + "./vanilla": { + "types": "./dist/src/vanilla.d.ts", + "import": "./dist/vanilla/vanilla.js" + }, + "./styles.css": { + "default": "./dist/styles.css" + }, + "./package.json": "./package.json" + }, "scripts": { "dev": "vite --port 3001", - "build": "vite build && tsc -b", + "build": "rm -rf dist && pnpm run build:react && pnpm run build:vanilla && tsc -b", + "build:react": "vite build --config vite.react.config.ts", + "build:vanilla": "vite build --config vite.vanilla.config.ts", "preview": "vite preview", "lint": "biome check . && tsc -b", - "format": "biome format --write .", + "format": "biome check --write .", "generate-routes": "tsr generate" }, - "dependencies": { - "@yieldxyz/perps-common": "workspace:*", + "peerDependencies": { + "react": "catalog:", + "react-dom": "catalog:" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + }, + "devDependencies": { "@base-ui/react": "catalog:", + "@effect/atom-react": "catalog:", + "@effect/openapi-generator": "catalog:", "@effect/platform-node": "catalog:", - "@ledgerhq/wallet-api-client": "catalog:", "@lucas-barake/effect-form-react": "catalog:", "@reown/appkit": "catalog:", "@reown/appkit-adapter-wagmi": "catalog:", "@stakekit/common": "catalog:", "@tailwindcss/vite": "catalog:", + "@tanstack/devtools-vite": "catalog:", "@tanstack/react-devtools": "catalog:", "@tanstack/react-query": "catalog:", "@tanstack/react-router": "catalog:", "@tanstack/react-router-devtools": "catalog:", "@tanstack/react-virtual": "catalog:", - "class-variance-authority": "catalog:", - "clsx": "catalog:", - "effect": "catalog:", - "lucide-react": "catalog:", - "react": "catalog:", - "react-dom": "catalog:", - "sonner": "catalog:", - "tailwind-merge": "catalog:", - "tailwindcss": "catalog:", - "tw-animate-css": "catalog:", - "viem": "catalog:", - "wagmi": "catalog:", - "@effect/atom-react": "catalog:" - }, - "devDependencies": { - "@tanstack/devtools-vite": "catalog:", "@tanstack/router-cli": "catalog:", + "@tanstack/router-plugin": "catalog:", "@types/node": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", "@vite-pwa/assets-generator": "catalog:", "@vitejs/plugin-react": "catalog:", "@vitest/browser-playwright": "catalog:", + "@yieldxyz/perps-common": "workspace:*", "babel-plugin-react-compiler": "catalog:", + "class-variance-authority": "catalog:", + "clsx": "catalog:", + "effect": "catalog:", "jsdom": "catalog:", + "lucide-react": "catalog:", "openapi-filter": "catalog:", + "react": "catalog:", + "react-dom": "catalog:", + "sonner": "catalog:", + "tailwind-merge": "catalog:", + "tailwindcss": "catalog:", "tsx": "catalog:", + "tw-animate-css": "catalog:", "typescript": "catalog:", + "viem": "catalog:", "vite": "catalog:", "vite-plugin-node-polyfills": "catalog:", "vitest": "catalog:", "vitest-browser-react": "catalog:", - "@tanstack/router-plugin": "catalog:", - "@effect/openapi-generator": "catalog:" + "wagmi": "catalog:" } } diff --git a/packages/dashboard/src/app.tsx b/packages/dashboard/src/app.tsx index b88372c..577fd87 100644 --- a/packages/dashboard/src/app.tsx +++ b/packages/dashboard/src/app.tsx @@ -1,6 +1,10 @@ -import "./styles.css"; import { createRouter, RouterProvider } from "@tanstack/react-router"; import { Providers, useRootContainer } from "@yieldxyz/perps-common/context"; +import type { + ExternalWalletSource, + LifecycleEvent, +} from "@yieldxyz/perps-common/domain"; +import type { PerpsConfig } from "@yieldxyz/perps-common/services"; import { Preload } from "./components/modules/root/Preload"; import { SignTransactionsDialog } from "./components/modules/trade/order-form/sign-dialog"; import { routeTree } from "./routeTree.gen"; @@ -14,12 +18,6 @@ const router = createRouter({ defaultPreloadStaleTime: 0, }); -declare module "@tanstack/react-router" { - interface Register { - router: typeof router; - } -} - const App = () => { const rootContainer = useRootContainer(); @@ -34,9 +32,23 @@ const App = () => { ); }; -export const Dashboard = () => { +export type DashboardProps = { + readonly config: Omit; + readonly externalWalletSource?: ExternalWalletSource; + readonly onLifecycleEvent?: (event: LifecycleEvent) => void; +}; + +export const Dashboard = ({ + config, + externalWalletSource, + onLifecycleEvent, +}: DashboardProps) => { return ( - + diff --git a/packages/dashboard/src/atoms/selected-market-atom.ts b/packages/dashboard/src/atoms/selected-market-atom.ts index 04a8cb1..67746c9 100644 --- a/packages/dashboard/src/atoms/selected-market-atom.ts +++ b/packages/dashboard/src/atoms/selected-market-atom.ts @@ -1,5 +1,6 @@ import { MarketNotFoundError, marketsAtom } from "@yieldxyz/perps-common/atoms"; -import { type ApiTypes, runtimeAtom } from "@yieldxyz/perps-common/services"; +import type { Market } from "@yieldxyz/perps-common/domain"; +import { runtimeAtom } from "@yieldxyz/perps-common/services"; import { Array as _Array, Effect, Option, Record } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import * as Atom from "effect/unstable/reactivity/Atom"; @@ -25,8 +26,10 @@ const initMarketAtom = runtimeAtom.atom( }), ); -export const selectedMarketAtom = Atom.writable( +export const selectedMarketAtom: Atom.Writable< + Result.AsyncResult, unknown>, + AtomRef.AtomRef +> = Atom.writable( (ctx) => ctx.get(initMarketAtom), - (ctx, value: AtomRef.AtomRef) => - ctx.setSelf(Result.success(value)), + (ctx, value: AtomRef.AtomRef) => ctx.setSelf(Result.success(value)), ); diff --git a/packages/dashboard/src/components/modules/trade/chart.tsx b/packages/dashboard/src/components/modules/trade/chart.tsx index 6d9cca2..f6d2a1e 100644 --- a/packages/dashboard/src/components/modules/trade/chart.tsx +++ b/packages/dashboard/src/components/modules/trade/chart.tsx @@ -1,6 +1,6 @@ import { useAtomRef, useAtomValue } from "@effect/atom-react"; import { Chart as ChartView, Text } from "@yieldxyz/perps-common/components"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; +import type { Market } from "@yieldxyz/perps-common/domain"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; import { TriangleAlertIcon } from "lucide-react"; @@ -31,7 +31,7 @@ const ChartError = ({ message }: { message: string }) => ( const ChartContent = ({ marketRef, }: { - marketRef: AtomRef.AtomRef; + marketRef: AtomRef.AtomRef; }) => { const market = useAtomRef(marketRef); diff --git a/packages/dashboard/src/components/modules/trade/market-info/index.tsx b/packages/dashboard/src/components/modules/trade/market-info/index.tsx index d17fd31..117334f 100644 --- a/packages/dashboard/src/components/modules/trade/market-info/index.tsx +++ b/packages/dashboard/src/components/modules/trade/market-info/index.tsx @@ -5,6 +5,7 @@ import { Text, TokenIcon, } from "@yieldxyz/perps-common/components"; +import type { Market } from "@yieldxyz/perps-common/domain"; import { cn, formatAmount, @@ -13,7 +14,6 @@ import { formatRate, getTokenLogo, } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; import { ChevronDown } from "lucide-react"; @@ -30,7 +30,7 @@ function MarketInfoBarContent({ marketRef, className, }: { - marketRef: AtomRef.AtomRef; + marketRef: AtomRef.AtomRef; className?: string; }) { const market = useAtomRef(marketRef); @@ -41,9 +41,7 @@ function MarketInfoBarContent({ const logo = market.baseAsset.logoURI ?? getTokenLogo(market.baseAsset.symbol); - const handleMarketSelect = ( - marketRef: AtomRef.AtomRef, - ) => { + const handleMarketSelect = (marketRef: AtomRef.AtomRef) => { setSelectedMarket(marketRef); setIsOpen(false); }; diff --git a/packages/dashboard/src/components/modules/trade/market-info/market-selector-popover.tsx b/packages/dashboard/src/components/modules/trade/market-info/market-selector-popover.tsx index 6cef934..735d7b2 100644 --- a/packages/dashboard/src/components/modules/trade/market-info/market-selector-popover.tsx +++ b/packages/dashboard/src/components/modules/trade/market-info/market-selector-popover.tsx @@ -2,6 +2,7 @@ import { useAtomRef, useAtomValue } from "@effect/atom-react"; import { useVirtualizer } from "@tanstack/react-virtual"; import { marketsAtom } from "@yieldxyz/perps-common/atoms"; import { Skeleton, Text, TokenIcon } from "@yieldxyz/perps-common/components"; +import type { Market } from "@yieldxyz/perps-common/domain"; import { cn, formatAmount, @@ -11,7 +12,6 @@ import { getMaxLeverage, getTokenLogo, } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Array as _Array, Option, Order, Record } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; @@ -33,7 +33,7 @@ type SortState = { readonly direction: SortDirection; } | null; -type MarketRef = AtomRef.AtomRef; +type MarketRef = AtomRef.AtomRef; const columnOrders: { [Key in SortColumn]: Order.Order; @@ -57,12 +57,12 @@ const columnOrders: { }; interface MarketSelectorContentProps { - onSelect: (marketRef: AtomRef.AtomRef) => void; + onSelect: (marketRef: AtomRef.AtomRef) => void; } interface MarketRowProps { - marketRef: AtomRef.AtomRef; - onSelect: (marketRef: AtomRef.AtomRef) => void; + marketRef: AtomRef.AtomRef; + onSelect: (marketRef: AtomRef.AtomRef) => void; } function MarketRow({ marketRef, onSelect }: MarketRowProps) { diff --git a/packages/dashboard/src/components/modules/trade/order-form/index.tsx b/packages/dashboard/src/components/modules/trade/order-form/index.tsx index 39c4683..d3de814 100644 --- a/packages/dashboard/src/components/modules/trade/order-form/index.tsx +++ b/packages/dashboard/src/components/modules/trade/order-form/index.tsx @@ -14,6 +14,7 @@ import { } from "@yieldxyz/perps-common/components"; import { isWalletConnected, + type Market, type WalletConnected, } from "@yieldxyz/perps-common/domain"; import { @@ -38,7 +39,6 @@ import { getMaxLeverage, round, } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Schema } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; @@ -93,7 +93,7 @@ function OrderFormDisconnected({ marketRef, }: { className?: string; - marketRef: AtomRef.AtomRef; + marketRef: AtomRef.AtomRef; }) { const market = useAtomRef(marketRef); const { orderType, setOrderType } = useOrderType(); @@ -198,7 +198,7 @@ function OrderFormContent({ }: { className?: string; wallet: WalletConnected; - marketRef: AtomRef.AtomRef; + marketRef: AtomRef.AtomRef; }) { const market = useAtomRef(marketRef); const leverageRanges = Schema.decodeSync(LeverageRangesSchema)( diff --git a/packages/dashboard/src/components/modules/trade/order-form/sign-dialog.tsx b/packages/dashboard/src/components/modules/trade/order-form/sign-dialog.tsx index d451420..e47eec4 100644 --- a/packages/dashboard/src/components/modules/trade/order-form/sign-dialog.tsx +++ b/packages/dashboard/src/components/modules/trade/order-form/sign-dialog.tsx @@ -1,7 +1,7 @@ import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { actionAtom, - signActionAtoms, + transactionExecutionAtoms, walletAtom, } from "@yieldxyz/perps-common/atoms"; import { @@ -27,7 +27,11 @@ export function SignTransactionsDialog() { return null; } - const machineAtoms = signActionAtoms(wallet.signTransactions); + if (!action) { + return null; + } + + const machineAtoms = transactionExecutionAtoms(action); return ( !open && handleClose()}> @@ -51,7 +55,7 @@ export function SignTransactionsDialog() { } interface SignTransactionsContentProps { - machineAtoms: ReturnType; + machineAtoms: ReturnType; onClose: () => void; } @@ -59,13 +63,10 @@ function SignTransactionsContent({ machineAtoms, onClose, }: SignTransactionsContentProps) { - const { machineStreamAtom, retryMachineAtom } = machineAtoms; + const { machineStreamAtom } = machineAtoms; const state = useAtomValue(machineStreamAtom); - const retry = useAtomSet(retryMachineAtom); - const result = Result.all({ state, retry }); - - if (Result.isFailure(result)) { + if (Result.isFailure(state)) { return (
@@ -73,14 +74,8 @@ function SignTransactionsContent({ ); } - if (Result.isSuccess(result)) { - return ( - - ); + if (Result.isSuccess(state)) { + return ; } return ; diff --git a/packages/dashboard/src/components/molecules/header/deposit/deposit-dialog.tsx b/packages/dashboard/src/components/molecules/header/deposit/deposit-dialog.tsx index d46d4bb..f86120f 100644 --- a/packages/dashboard/src/components/molecules/header/deposit/deposit-dialog.tsx +++ b/packages/dashboard/src/components/molecules/header/deposit/deposit-dialog.tsx @@ -12,6 +12,7 @@ import { TokenIcon, } from "@yieldxyz/perps-common/components"; import type { + Provider, WalletAccount, WalletConnected, } from "@yieldxyz/perps-common/domain"; @@ -24,7 +25,6 @@ import { formatTokenAmount, getNetworkLogo, } from "@yieldxyz/perps-common/lib"; -import type { ApiSchemas } from "@yieldxyz/perps-common/services"; import { Array as _Array, Option, Record } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import { @@ -112,7 +112,7 @@ function DepositDialogContent({ wallet }: DepositDialogContentProps) { function ProviderSelect() { const providers = useAtomValue(providersAtom).pipe( - Result.getOrElse(() => [] as ReadonlyArray), + Result.getOrElse(() => [] as ReadonlyArray), ); const { selectedProvider, setSelectedProvider } = useProviders(); diff --git a/packages/dashboard/src/components/molecules/header/deposit/state.tsx b/packages/dashboard/src/components/molecules/header/deposit/state.tsx index 9c7cd73..c362bc2 100644 --- a/packages/dashboard/src/components/molecules/header/deposit/state.tsx +++ b/packages/dashboard/src/components/molecules/header/deposit/state.tsx @@ -7,6 +7,7 @@ import { } from "@yieldxyz/perps-common/atoms"; import { Text } from "@yieldxyz/perps-common/components"; import type { + Provider, TokenBalance, WalletAccount, } from "@yieldxyz/perps-common/domain"; @@ -22,7 +23,7 @@ import { round, valueFromPercent, } from "@yieldxyz/perps-common/lib"; -import { type ApiTypes, runtimeAtom } from "@yieldxyz/perps-common/services"; +import { runtimeAtom } from "@yieldxyz/perps-common/services"; import { Effect, Option } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import * as Atom from "effect/unstable/reactivity/Atom"; @@ -39,8 +40,8 @@ export const selectedChainAtom = Atom.writable( // Hooks for using atoms in components export const useProviders = (): { - selectedProvider: ApiTypes.ProviderDto | null; - setSelectedProvider: (value: ApiTypes.ProviderDto) => void; + selectedProvider: Provider | null; + setSelectedProvider: (value: Provider) => void; } => { const selectedProvider = useAtomValue(selectedProviderAtom).pipe( Result.getOrElse(() => null), @@ -124,7 +125,8 @@ const DepositAmountField: FormReact.FieldComponent = ({ field }) => { ); }; -export const DepositForm = createDepositForm(DepositAmountField); +export const DepositForm: ReturnType = + createDepositForm(DepositAmountField); const { value: amountAtom, setValue: setAmountFieldAtom } = DepositForm.getFieldAtoms(DepositForm.fields.Amount); diff --git a/packages/dashboard/src/components/molecules/header/index.tsx b/packages/dashboard/src/components/molecules/header/index.tsx index 8ee9269..250e29e 100644 --- a/packages/dashboard/src/components/molecules/header/index.tsx +++ b/packages/dashboard/src/components/molecules/header/index.tsx @@ -16,10 +16,10 @@ import { import { isBrowserWallet, isWalletConnected, + type Provider, type WalletConnected, } from "@yieldxyz/perps-common/domain"; import { cn, truncateAddress } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import { ChevronRight } from "lucide-react"; import { useState } from "react"; @@ -103,14 +103,14 @@ function ConnectedWalletSection({ wallet }: { wallet: WalletConnected }) { const [withdrawDialogOpen, setWithdrawDialogOpen] = useState(false); const providers = useAtomValue(providersAtom).pipe( - Result.getOrElse(() => [] as ReadonlyArray), + Result.getOrElse(() => [] as ReadonlyArray), ); const selectedProvider = useAtomValue(selectedProviderAtom).pipe( Result.getOrElse(() => null), ); const setSelectedProvider = useAtomSet(selectedProviderAtom); - const handleProviderSelect = (provider: ApiTypes.ProviderDto) => { + const handleProviderSelect = (provider: Provider) => { setSelectedProvider(provider); setProviderDialogOpen(false); }; diff --git a/packages/dashboard/src/components/molecules/header/withdraw/state.tsx b/packages/dashboard/src/components/molecules/header/withdraw/state.tsx index 45f8dc5..b5fdf6b 100644 --- a/packages/dashboard/src/components/molecules/header/withdraw/state.tsx +++ b/packages/dashboard/src/components/molecules/header/withdraw/state.tsx @@ -6,7 +6,7 @@ import { selectedProviderBalancesAtom, } from "@yieldxyz/perps-common/atoms"; import { Text } from "@yieldxyz/perps-common/components"; -import type { WalletAccount } from "@yieldxyz/perps-common/domain"; +import type { Provider, WalletAccount } from "@yieldxyz/perps-common/domain"; import { createWithdrawForm } from "@yieldxyz/perps-common/hooks"; import { clampPercent, @@ -14,7 +14,6 @@ import { round, valueFromPercent, } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Array as _Array, Option } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import * as Atom from "effect/unstable/reactivity/Atom"; @@ -24,12 +23,12 @@ const withdrawSelectedProviderAtom = Atom.writable( ctx .get(providersAtom) .pipe(Result.map(_Array.head), Result.map(Option.getOrNull)), - (ctx, value: ApiTypes.ProviderDto) => ctx.setSelf(Result.success(value)), + (ctx, value: Provider) => ctx.setSelf(Result.success(value)), ); export const useProviders = (): { - selectedProvider: ApiTypes.ProviderDto | null; - setSelectedProvider: (value: ApiTypes.ProviderDto) => void; + selectedProvider: Provider | null; + setSelectedProvider: (value: Provider) => void; } => { const selectedProvider = useAtomValue(selectedProviderAtom).pipe( Result.getOrElse(() => null), @@ -113,7 +112,8 @@ const WithdrawAmountField: FormReact.FieldComponent = ({ field }) => { ); }; -export const WithdrawForm = createWithdrawForm(WithdrawAmountField); +export const WithdrawForm: ReturnType = + createWithdrawForm(WithdrawAmountField); const { value: amountFieldAtom, setValue: setAmountFieldAtom } = WithdrawForm.getFieldAtoms(WithdrawForm.fields.Amount); diff --git a/packages/dashboard/src/components/molecules/header/withdraw/withdraw-dialog.tsx b/packages/dashboard/src/components/molecules/header/withdraw/withdraw-dialog.tsx index cb4bace..5b5a822 100644 --- a/packages/dashboard/src/components/molecules/header/withdraw/withdraw-dialog.tsx +++ b/packages/dashboard/src/components/molecules/header/withdraw/withdraw-dialog.tsx @@ -9,11 +9,11 @@ import { Text, } from "@yieldxyz/perps-common/components"; import type { + Provider, WalletAccount, WalletConnected, } from "@yieldxyz/perps-common/domain"; import { formatTokenAmount, round } from "@yieldxyz/perps-common/lib"; -import type { ApiSchemas } from "@yieldxyz/perps-common/services"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import { useProviderBalance, @@ -101,7 +101,7 @@ function WithdrawDialogContent({ wallet }: WithdrawDialogContentProps) { function ProviderSelect() { const providers = useAtomValue(providersAtom).pipe( - Result.getOrElse(() => [] as ReadonlyArray), + Result.getOrElse(() => [] as ReadonlyArray), ); const { selectedProvider, setSelectedProvider } = useProviders(); diff --git a/packages/dashboard/src/components/molecules/positions/close-position-dialog.tsx b/packages/dashboard/src/components/molecules/positions/close-position-dialog.tsx index 7ffe33c..388a81e 100644 --- a/packages/dashboard/src/components/molecules/positions/close-position-dialog.tsx +++ b/packages/dashboard/src/components/molecules/positions/close-position-dialog.tsx @@ -6,20 +6,19 @@ import { PercentageSlider, Text, } from "@yieldxyz/perps-common/components"; -import type { WalletConnected } from "@yieldxyz/perps-common/domain"; +import type { Position, WalletConnected } from "@yieldxyz/perps-common/domain"; import { useCloseCalculations, useClosePercentage, useSubmitClose, } from "@yieldxyz/perps-common/hooks"; import { formatAmount, formatTokenAmount } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import { X } from "lucide-react"; import { useRef } from "react"; interface ClosePositionDialogProps { - position: ApiTypes.PositionDto; + position: Position; wallet: WalletConnected; children: React.ReactElement; onClose?: () => void; @@ -61,7 +60,7 @@ export function ClosePositionDialog({ } interface ClosePositionDialogContentProps { - position: ApiTypes.PositionDto; + position: Position; wallet: WalletConnected; onClose: () => void; } diff --git a/packages/dashboard/src/components/molecules/positions/orders-tab.tsx b/packages/dashboard/src/components/molecules/positions/orders-tab.tsx index 815d250..42974bd 100644 --- a/packages/dashboard/src/components/molecules/positions/orders-tab.tsx +++ b/packages/dashboard/src/components/molecules/positions/orders-tab.tsx @@ -5,7 +5,11 @@ import { ordersAtom, } from "@yieldxyz/perps-common/atoms"; import { Text } from "@yieldxyz/perps-common/components"; -import type { WalletConnected } from "@yieldxyz/perps-common/domain"; +import type { + Market, + Order, + WalletConnected, +} from "@yieldxyz/perps-common/domain"; import { useOrderActions } from "@yieldxyz/perps-common/hooks"; import { calcNotionalUsd, @@ -14,7 +18,6 @@ import { formatDate, formatSnakeCase, } from "@yieldxyz/perps-common/lib"; -import type { ApiSchemas } from "@yieldxyz/perps-common/services"; import { Array as _Array, Result as _Result, Record } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import { @@ -24,8 +27,8 @@ import { } from "./shared"; interface OrderWithMarket { - order: ApiSchemas.OrderDto; - market: ApiSchemas.MarketDto; + order: Order; + market: Market; wallet: WalletConnected; } diff --git a/packages/dashboard/src/components/molecules/positions/positions-tab.tsx b/packages/dashboard/src/components/molecules/positions/positions-tab.tsx index abd3d75..dc9f1c9 100644 --- a/packages/dashboard/src/components/molecules/positions/positions-tab.tsx +++ b/packages/dashboard/src/components/molecules/positions/positions-tab.tsx @@ -10,7 +10,12 @@ import { TPOrSLDialog, type TPOrSLSettings, } from "@yieldxyz/perps-common/components"; -import type { WalletConnected } from "@yieldxyz/perps-common/domain"; +import type { + Market, + Order, + Position, + WalletConnected, +} from "@yieldxyz/perps-common/domain"; import { useEditSLTP, usePositionActions, @@ -26,7 +31,6 @@ import { getMaxLeverage, getTPOrSLConfigurationFromPosition, } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Array as _Array, Result as _Result, Record } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; @@ -40,13 +44,13 @@ import { } from "./shared"; interface PositionWithMarket { - positionRef: AtomRef.AtomRef; - marketRef: AtomRef.AtomRef; + positionRef: AtomRef.AtomRef; + marketRef: AtomRef.AtomRef; } interface PositionsTableContentProps { positions: PositionWithMarket[]; - orders: ApiTypes.OrderDto[]; + orders: Order[]; wallet: WalletConnected; isLoading: boolean; } @@ -88,7 +92,7 @@ export function PositionsTabWithWallet({ const orders = ordersResult.pipe( Result.map((o) => [...o]), - Result.getOrElse(() => [] as ApiTypes.OrderDto[]), + Result.getOrElse(() => [] as Order[]), ); return ( @@ -166,9 +170,9 @@ function PositionsTableContent({ } interface PositionRowProps { - positionRef: AtomRef.AtomRef; - marketRef: AtomRef.AtomRef; - orders: ApiTypes.OrderDto[]; + positionRef: AtomRef.AtomRef; + marketRef: AtomRef.AtomRef; + orders: Order[]; wallet: WalletConnected; } diff --git a/packages/dashboard/src/index.ts b/packages/dashboard/src/index.ts new file mode 100644 index 0000000..beb08f3 --- /dev/null +++ b/packages/dashboard/src/index.ts @@ -0,0 +1,14 @@ +export type { + ChainIdEncoded, + EvmTransactionRequestEncoded, + ExternalWalletSource, + LifecycleEvent, + SignedPayloadEncoded, + TransactionHashEncoded, + TypedDataRequestEncoded, + WalletAdapterStateEncoded, + WalletAddressEncoded, +} from "@yieldxyz/perps-common/domain"; +export type { PerpsConfig } from "@yieldxyz/perps-common/services"; + +export { Dashboard, type DashboardProps } from "./app"; diff --git a/packages/dashboard/src/main.tsx b/packages/dashboard/src/main.tsx index a66448c..04b53c8 100644 --- a/packages/dashboard/src/main.tsx +++ b/packages/dashboard/src/main.tsx @@ -1,9 +1,18 @@ +import "./styles.css"; import "./main.css"; +import type { PerpsConfig } from "@yieldxyz/perps-common/services"; import ReactDOM from "react-dom/client"; import { Dashboard } from "./app"; +const config: PerpsConfig = { + perpsBaseUrl: import.meta.env.VITE_PERPS_BASE_URL, + perpsApiKey: import.meta.env.VITE_PERPS_API_KEY, + reownProjectId: import.meta.env.VITE_REOWN_PROJECT_ID || undefined, + moralisApiKey: import.meta.env.VITE_MORALIS_API_KEY, +}; + const rootElement = document.getElementById("app"); if (rootElement && !rootElement.innerHTML) { const root = ReactDOM.createRoot(rootElement); - root.render(); + root.render(); } diff --git a/packages/dashboard/src/styles-entry.ts b/packages/dashboard/src/styles-entry.ts new file mode 100644 index 0000000..fed29db --- /dev/null +++ b/packages/dashboard/src/styles-entry.ts @@ -0,0 +1 @@ +import "./styles.css"; diff --git a/packages/dashboard/src/vanilla.tsx b/packages/dashboard/src/vanilla.tsx new file mode 100644 index 0000000..81e2fa4 --- /dev/null +++ b/packages/dashboard/src/vanilla.tsx @@ -0,0 +1,37 @@ +import ReactDOM from "react-dom/client"; +import { Dashboard, type DashboardProps } from "./app"; + +export type DashboardMountTarget = Element | DocumentFragment | string; + +export type MountedDashboard = { + readonly unmount: () => void; +}; + +const getMountTarget = (target: DashboardMountTarget) => { + if (typeof target !== "string") { + return target; + } + + const element = document.querySelector(target); + + if (!element) { + throw new Error(`Dashboard mount target not found: ${target}`); + } + + return element; +}; + +export const mountDashboard = ( + target: DashboardMountTarget, + props: DashboardProps, +): MountedDashboard => { + const root = ReactDOM.createRoot(getMountTarget(target)); + + root.render(); + + return { + unmount: () => root.unmount(), + }; +}; + +export type { DashboardProps } from "./app"; diff --git a/packages/dashboard/vite.react.config.ts b/packages/dashboard/vite.react.config.ts new file mode 100644 index 0000000..898b2cd --- /dev/null +++ b/packages/dashboard/vite.react.config.ts @@ -0,0 +1,50 @@ +import { resolve } from "node:path"; +import { + createNodePolyfillsPlugin, + createReactCompilerPlugin, + createTailwindPlugin, + createViteReactPlugin, +} from "@yieldxyz/perps-common/vite.config"; +import { defineConfig, esmExternalRequirePlugin } from "vite"; + +const reactExternals = new Set([ + "react", + "react-dom", + "react-dom/client", + "react/jsx-runtime", + "react/jsx-dev-runtime", +]); + +export default defineConfig({ + plugins: [ + esmExternalRequirePlugin({ + external: [...reactExternals], + }), + createViteReactPlugin(), + createReactCompilerPlugin(), + createTailwindPlugin(), + createNodePolyfillsPlugin(), + ], + build: { + outDir: "dist", + emptyOutDir: false, + sourcemap: true, + lib: { + entry: { + index: resolve(__dirname, "src/index.ts"), + styles: resolve(__dirname, "src/styles-entry.ts"), + }, + formats: ["es"], + }, + rollupOptions: { + output: { + entryFileNames: "react/[name].js", + chunkFileNames: "react/chunks/[name]-[hash].js", + assetFileNames: (assetInfo) => + assetInfo.name?.endsWith(".css") + ? "styles.css" + : "react/assets/[name][extname]", + }, + }, + }, +}); diff --git a/packages/dashboard/vite.vanilla.config.ts b/packages/dashboard/vite.vanilla.config.ts new file mode 100644 index 0000000..db2096a --- /dev/null +++ b/packages/dashboard/vite.vanilla.config.ts @@ -0,0 +1,33 @@ +import { resolve } from "node:path"; +import { + createNodePolyfillsPlugin, + createReactCompilerPlugin, + createViteReactPlugin, +} from "@yieldxyz/perps-common/vite.config"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [ + createViteReactPlugin(), + createReactCompilerPlugin(), + createNodePolyfillsPlugin(), + ], + build: { + outDir: "dist", + emptyOutDir: false, + sourcemap: true, + lib: { + entry: { + vanilla: resolve(__dirname, "src/vanilla.tsx"), + }, + formats: ["es"], + }, + rollupOptions: { + output: { + entryFileNames: "vanilla/[name].js", + chunkFileNames: "vanilla/chunks/[name]-[hash].js", + assetFileNames: "vanilla/assets/[name][extname]", + }, + }, + }, +}); diff --git a/packages/widget/package.json b/packages/widget/package.json index 35bb71b..64322a1 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -1,62 +1,98 @@ { "name": "@yieldxyz/perps-widget", + "version": "0.0.1", "type": "module", + "license": "BUSL-1.1", + "sideEffects": [ + "**/*.css" + ], + "files": [ + "dist" + ], + "main": "./dist/react/index.js", + "module": "./dist/react/index.js", + "types": "./dist/src/index.d.ts", + "exports": { + ".": { + "types": "./dist/src/index.d.ts", + "import": "./dist/react/index.js" + }, + "./vanilla": { + "types": "./dist/src/vanilla.d.ts", + "import": "./dist/vanilla/vanilla.js" + }, + "./styles.css": { + "default": "./dist/styles.css" + }, + "./package.json": "./package.json" + }, "scripts": { "dev": "vite --port 3000", - "build": "vite build && tsc -b", + "build": "rm -rf dist && pnpm run build:react && pnpm run build:vanilla && tsc -b", + "build:react": "vite build --config vite.react.config.ts", + "build:vanilla": "vite build --config vite.vanilla.config.ts", "preview": "vite preview", "lint": "biome check . && tsc -b", - "format": "biome format --write .", + "format": "biome check --write .", "generate-routes": "tsr generate" }, - "dependencies": { - "@yieldxyz/perps-common": "workspace:*", + "peerDependencies": { + "react": "catalog:", + "react-dom": "catalog:" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + }, + "devDependencies": { "@base-ui/react": "catalog:", + "@effect/atom-react": "catalog:", + "@effect/openapi-generator": "catalog:", "@effect/platform-node": "catalog:", - "@ledgerhq/wallet-api-client": "catalog:", "@lucas-barake/effect-form-react": "catalog:", "@reown/appkit": "catalog:", "@reown/appkit-adapter-wagmi": "catalog:", "@stakekit/common": "catalog:", "@tailwindcss/vite": "catalog:", + "@tanstack/devtools-vite": "catalog:", "@tanstack/react-devtools": "catalog:", "@tanstack/react-query": "catalog:", "@tanstack/react-router": "catalog:", "@tanstack/react-router-devtools": "catalog:", "@tanstack/react-virtual": "catalog:", - "class-variance-authority": "catalog:", - "clsx": "catalog:", - "effect": "catalog:", - "lucide-react": "catalog:", - "react": "catalog:", - "react-dom": "catalog:", - "sonner": "catalog:", - "tailwind-merge": "catalog:", - "tailwindcss": "catalog:", - "tw-animate-css": "catalog:", - "viem": "catalog:", - "wagmi": "catalog:", - "@effect/atom-react": "catalog:" - }, - "devDependencies": { - "@tanstack/devtools-vite": "catalog:", "@tanstack/router-cli": "catalog:", + "@tanstack/router-plugin": "catalog:", "@types/node": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", "@vite-pwa/assets-generator": "catalog:", "@vitejs/plugin-react": "catalog:", "@vitest/browser-playwright": "catalog:", + "@yieldxyz/perps-common": "workspace:*", "babel-plugin-react-compiler": "catalog:", + "class-variance-authority": "catalog:", + "clsx": "catalog:", + "effect": "catalog:", "jsdom": "catalog:", + "lucide-react": "catalog:", "openapi-filter": "catalog:", + "react": "catalog:", + "react-dom": "catalog:", + "sonner": "catalog:", + "tailwind-merge": "catalog:", + "tailwindcss": "catalog:", "tsx": "catalog:", + "tw-animate-css": "catalog:", "typescript": "catalog:", + "viem": "catalog:", "vite": "catalog:", "vite-plugin-node-polyfills": "catalog:", "vitest": "catalog:", "vitest-browser-react": "catalog:", - "@tanstack/router-plugin": "catalog:", - "@effect/openapi-generator": "catalog:" + "wagmi": "catalog:" } } diff --git a/packages/widget/src/app.tsx b/packages/widget/src/app.tsx index a3c84d1..d972eec 100644 --- a/packages/widget/src/app.tsx +++ b/packages/widget/src/app.tsx @@ -1,7 +1,13 @@ import { createRouter, RouterProvider } from "@tanstack/react-router"; -import "./styles.css"; import { Providers, useRootContainer } from "@yieldxyz/perps-common/context"; -import { TRADING_VIEW_WIDGET_SCRIPT_URL } from "@yieldxyz/perps-common/services"; +import type { + ExternalWalletSource, + LifecycleEvent, +} from "@yieldxyz/perps-common/domain"; +import { + type PerpsConfig, + TRADING_VIEW_WIDGET_SCRIPT_URL, +} from "@yieldxyz/perps-common/services"; import { preload } from "react-dom"; import { PreloadAtoms } from "./components/modules/Root/PreloadAtoms"; import { routeTree } from "./routeTree.gen"; @@ -15,12 +21,6 @@ const router = createRouter({ defaultPreloadStaleTime: 0, }); -declare module "@tanstack/react-router" { - interface Register { - router: typeof router; - } -} - const App = () => { const rootContainer = useRootContainer(); @@ -34,10 +34,25 @@ const App = () => { ); }; -export const Widget = () => { +export type WidgetProps = { + readonly config: Omit; + readonly externalWalletSource?: ExternalWalletSource; + readonly onLifecycleEvent?: (event: LifecycleEvent) => void; +}; + +export const Widget = ({ + config, + externalWalletSource, + onLifecycleEvent, +}: WidgetProps) => { preload(TRADING_VIEW_WIDGET_SCRIPT_URL, { as: "script" }); + return ( - + diff --git a/packages/widget/src/components/modules/Account/Deposit/index.tsx b/packages/widget/src/components/modules/Account/Deposit/index.tsx index 1aeae77..256770e 100644 --- a/packages/widget/src/components/modules/Account/Deposit/index.tsx +++ b/packages/widget/src/components/modules/Account/Deposit/index.tsx @@ -6,6 +6,7 @@ import { Text, } from "@yieldxyz/perps-common/components"; import type { + Provider, TokenBalance, WalletConnected, } from "@yieldxyz/perps-common/domain"; @@ -18,7 +19,6 @@ import { useTokenBalances, } from "@yieldxyz/perps-common/hooks"; import { formatTokenAmount } from "@yieldxyz/perps-common/lib"; -import type { ApiSchemas } from "@yieldxyz/perps-common/services"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import { BackButton } from "../../../molecules/navigation/back-button"; import { WalletProtectedRoute } from "../../../molecules/navigation/wallet-protected-route"; @@ -36,9 +36,9 @@ function AccountDepositContent({ }: { wallet: WalletConnected; selectedTokenBalance: TokenBalance; - selectedProvider: ApiSchemas.ProviderDto; - providers: ReadonlyArray; - setSelectedProvider: (provider: ApiSchemas.ProviderDto) => void; + selectedProvider: Provider; + providers: ReadonlyArray; + setSelectedProvider: (provider: Provider) => void; setSelectedTokenBalance: (tokenBalance: TokenBalance) => void; }) { const { tokenAmountValue } = useTokenAmountValue( diff --git a/packages/widget/src/components/modules/Account/Deposit/state.tsx b/packages/widget/src/components/modules/Account/Deposit/state.tsx index 5507761..806ab8d 100644 --- a/packages/widget/src/components/modules/Account/Deposit/state.tsx +++ b/packages/widget/src/components/modules/Account/Deposit/state.tsx @@ -1,6 +1,6 @@ import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { providersAtom } from "@yieldxyz/perps-common/atoms"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; +import type { Provider } from "@yieldxyz/perps-common/domain"; import { Array as _Array, Option } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import * as Atom from "effect/unstable/reactivity/Atom"; @@ -10,7 +10,7 @@ const selectedProviderAtom = Atom.writable( ctx .get(providersAtom) .pipe(Result.map(_Array.head), Result.map(Option.getOrNull)), - (ctx, value: ApiTypes.ProviderDto) => ctx.setSelf(Result.success(value)), + (ctx, value: Provider) => ctx.setSelf(Result.success(value)), ); export const useProviders = () => { @@ -23,7 +23,10 @@ export const useProviders = () => { }; }; -export const useSelectedProvider = () => { +export const useSelectedProvider = (): { + selectedProvider: Provider | null; + setSelectedProvider: (value: Provider) => void; +} => { const selectedProvider = useAtomValue(selectedProviderAtom).pipe( Result.getOrElse(() => null), ); diff --git a/packages/widget/src/components/modules/Account/Withdraw/index.tsx b/packages/widget/src/components/modules/Account/Withdraw/index.tsx index 0920573..a00dee3 100644 --- a/packages/widget/src/components/modules/Account/Withdraw/index.tsx +++ b/packages/widget/src/components/modules/Account/Withdraw/index.tsx @@ -5,7 +5,11 @@ import { Skeleton, Text, } from "@yieldxyz/perps-common/components"; -import type { WalletConnected } from "@yieldxyz/perps-common/domain"; +import type { + Balance, + Provider, + WalletConnected, +} from "@yieldxyz/perps-common/domain"; import { useProviderBalance, useWithdrawForm, @@ -13,7 +17,6 @@ import { WithdrawForm, } from "@yieldxyz/perps-common/hooks"; import { formatAmount, formatTokenAmount } from "@yieldxyz/perps-common/lib"; -import type { ApiSchemas } from "@yieldxyz/perps-common/services"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import { BackButton } from "../../../molecules/navigation/back-button"; import { WalletProtectedRoute } from "../../../molecules/navigation/wallet-protected-route"; @@ -28,10 +31,10 @@ function AccountWithdrawContent({ setSelectedProvider, }: { wallet: WalletConnected; - selectedProvider: ApiSchemas.ProviderDto; - providers: ReadonlyArray; - providerBalance: ApiSchemas.BalanceDto; - setSelectedProvider: (provider: ApiSchemas.ProviderDto) => void; + selectedProvider: Provider; + providers: ReadonlyArray; + providerBalance: Balance; + setSelectedProvider: (provider: Provider) => void; }) { const { percentage, handlePercentageChange } = useWithdrawPercentage( wallet.currentAccount.address, diff --git a/packages/widget/src/components/modules/Account/Withdraw/state.tsx b/packages/widget/src/components/modules/Account/Withdraw/state.tsx index 5507761..806ab8d 100644 --- a/packages/widget/src/components/modules/Account/Withdraw/state.tsx +++ b/packages/widget/src/components/modules/Account/Withdraw/state.tsx @@ -1,6 +1,6 @@ import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { providersAtom } from "@yieldxyz/perps-common/atoms"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; +import type { Provider } from "@yieldxyz/perps-common/domain"; import { Array as _Array, Option } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import * as Atom from "effect/unstable/reactivity/Atom"; @@ -10,7 +10,7 @@ const selectedProviderAtom = Atom.writable( ctx .get(providersAtom) .pipe(Result.map(_Array.head), Result.map(Option.getOrNull)), - (ctx, value: ApiTypes.ProviderDto) => ctx.setSelf(Result.success(value)), + (ctx, value: Provider) => ctx.setSelf(Result.success(value)), ); export const useProviders = () => { @@ -23,7 +23,10 @@ export const useProviders = () => { }; }; -export const useSelectedProvider = () => { +export const useSelectedProvider = (): { + selectedProvider: Provider | null; + setSelectedProvider: (value: Provider) => void; +} => { const selectedProvider = useAtomValue(selectedProviderAtom).pipe( Result.getOrElse(() => null), ); diff --git a/packages/widget/src/components/modules/Home/AssetList/item.tsx b/packages/widget/src/components/modules/Home/AssetList/item.tsx index a412170..c263d2b 100644 --- a/packages/widget/src/components/modules/Home/AssetList/item.tsx +++ b/packages/widget/src/components/modules/Home/AssetList/item.tsx @@ -1,17 +1,17 @@ import { useAtomRef } from "@effect/atom-react"; import { useNavigate } from "@tanstack/react-router"; import { Text, TokenIcon } from "@yieldxyz/perps-common/components"; +import type { Market } from "@yieldxyz/perps-common/domain"; import { formatAmount, formatPercentage, getMaxLeverage, getTokenLogo, } from "@yieldxyz/perps-common/lib"; -import type { ApiSchemas } from "@yieldxyz/perps-common/services"; import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; export interface AssetItemProps { - marketRef: AtomRef.AtomRef; + marketRef: AtomRef.AtomRef; } export function AssetItem({ marketRef }: AssetItemProps) { diff --git a/packages/widget/src/components/modules/Home/Positions/index.tsx b/packages/widget/src/components/modules/Home/Positions/index.tsx index 69982f8..39dea4f 100644 --- a/packages/widget/src/components/modules/Home/Positions/index.tsx +++ b/packages/widget/src/components/modules/Home/Positions/index.tsx @@ -9,10 +9,10 @@ import { import { Skeleton, Text } from "@yieldxyz/perps-common/components"; import { isWalletConnected, + type Order, type WalletConnected, } from "@yieldxyz/perps-common/domain"; import { formatAmount, formatPercentage } from "@yieldxyz/perps-common/lib"; -import type { ApiSchemas } from "@yieldxyz/perps-common/services"; import { Array as _Array, Result as _Result, @@ -105,7 +105,7 @@ function PositionsWithWallet({ wallet }: { wallet: WalletConnected }) { marketRef: market.value, positionRef, orders: Record.get(ordersMap, positionRef.value.marketId).pipe( - Option.getOrElse(() => [] as ApiSchemas.OrderDto[]), + Option.getOrElse(() => [] as Order[]), ), }), ), diff --git a/packages/widget/src/components/modules/Home/Positions/order-card.tsx b/packages/widget/src/components/modules/Home/Positions/order-card.tsx index 10ce2e2..a7f11da 100644 --- a/packages/widget/src/components/modules/Home/Positions/order-card.tsx +++ b/packages/widget/src/components/modules/Home/Positions/order-card.tsx @@ -1,21 +1,21 @@ import { useAtomRef } from "@effect/atom-react"; import { Link } from "@tanstack/react-router"; import { Card, CardSection, Text } from "@yieldxyz/perps-common/components"; +import type { Market, Order } from "@yieldxyz/perps-common/domain"; import { calcNotionalUsd, formatAmount, formatDate, formatSnakeCase, } from "@yieldxyz/perps-common/lib"; -import type { ApiSchemas } from "@yieldxyz/perps-common/services"; import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; export function OrderCard({ order, marketRef, }: { - order: ApiSchemas.OrderDto; - marketRef: AtomRef.AtomRef; + order: Order; + marketRef: AtomRef.AtomRef; }) { const market = useAtomRef(marketRef); const price = order.limitPrice ?? order.triggerPrice ?? 0; diff --git a/packages/widget/src/components/modules/Home/Positions/position-card.tsx b/packages/widget/src/components/modules/Home/Positions/position-card.tsx index 3e25c1d..72e8ce1 100644 --- a/packages/widget/src/components/modules/Home/Positions/position-card.tsx +++ b/packages/widget/src/components/modules/Home/Positions/position-card.tsx @@ -7,6 +7,7 @@ import { Text, TokenIcon, } from "@yieldxyz/perps-common/components"; +import type { Market, Order, Position } from "@yieldxyz/perps-common/domain"; import { useTpSlOrders } from "@yieldxyz/perps-common/hooks"; import { calcNotionalUsd, @@ -15,7 +16,6 @@ import { formatPercentage, getTokenLogo, } from "@yieldxyz/perps-common/lib"; -import type { ApiSchemas } from "@yieldxyz/perps-common/services"; import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; export function PositionCard({ @@ -23,9 +23,9 @@ export function PositionCard({ marketRef, orders, }: { - positionRef: AtomRef.AtomRef; - marketRef: AtomRef.AtomRef; - orders: ApiSchemas.OrderDto[]; + positionRef: AtomRef.AtomRef; + marketRef: AtomRef.AtomRef; + orders: Order[]; }) { const position = useAtomRef(positionRef); const market = useAtomRef(marketRef); diff --git a/packages/widget/src/components/modules/Home/index.tsx b/packages/widget/src/components/modules/Home/index.tsx index d0b37c3..b68c9af 100644 --- a/packages/widget/src/components/modules/Home/index.tsx +++ b/packages/widget/src/components/modules/Home/index.tsx @@ -21,10 +21,10 @@ import { import { isBrowserWallet, isWalletConnected, + type Provider, type WalletConnected, } from "@yieldxyz/perps-common/domain"; import { cn, formatAmount } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Record } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import { @@ -86,7 +86,7 @@ export const Home = () => { const showAddressSwitcher = walletConnected; const providers = useAtomValue(providersAtom).pipe( - Result.getOrElse(() => [] as ReadonlyArray), + Result.getOrElse(() => [] as ReadonlyArray), ); const selectedProvider = useAtomValue(selectedProviderAtom).pipe( Result.getOrElse(() => null), diff --git a/packages/widget/src/components/modules/Order/Overview/index.tsx b/packages/widget/src/components/modules/Order/Overview/index.tsx index 13ed899..3b1a438 100644 --- a/packages/widget/src/components/modules/Order/Overview/index.tsx +++ b/packages/widget/src/components/modules/Order/Overview/index.tsx @@ -19,7 +19,7 @@ import { TokenIcon, TPOrSLDialog, } from "@yieldxyz/perps-common/components"; -import type { WalletConnected } from "@yieldxyz/perps-common/domain"; +import type { Market, WalletConnected } from "@yieldxyz/perps-common/domain"; import { useHandleLeverageChange, useHandlePercentageChange, @@ -38,7 +38,6 @@ import { getTokenLogo, round, } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Schema } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; @@ -56,7 +55,7 @@ function OrderContent({ side, mode, }: { - marketRef: AtomRef.AtomRef; + marketRef: AtomRef.AtomRef; wallet: WalletConnected; side: PositionSide; mode: OrderMode; diff --git a/packages/widget/src/components/modules/PositionDetails/AdjustMargin/index.tsx b/packages/widget/src/components/modules/PositionDetails/AdjustMargin/index.tsx index dc0cf81..1f045a3 100644 --- a/packages/widget/src/components/modules/PositionDetails/AdjustMargin/index.tsx +++ b/packages/widget/src/components/modules/PositionDetails/AdjustMargin/index.tsx @@ -11,13 +11,16 @@ import { Text, TokenIcon, } from "@yieldxyz/perps-common/components"; -import type { WalletConnected } from "@yieldxyz/perps-common/domain"; +import type { + Market, + Position, + WalletConnected, +} from "@yieldxyz/perps-common/domain"; import { formatAmount, formatPercentage, getTokenLogo, } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Match } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; @@ -40,8 +43,8 @@ function AdjustMarginContent({ mode, }: { wallet: WalletConnected; - marketRef: AtomRef.AtomRef; - position: ApiTypes.PositionDto; + marketRef: AtomRef.AtomRef; + position: Position; availableBalance: number; mode: "add" | "remove"; }) { diff --git a/packages/widget/src/components/modules/PositionDetails/AdjustMargin/state.tsx b/packages/widget/src/components/modules/PositionDetails/AdjustMargin/state.tsx index 73230cb..a25494d 100644 --- a/packages/widget/src/components/modules/PositionDetails/AdjustMargin/state.tsx +++ b/packages/widget/src/components/modules/PositionDetails/AdjustMargin/state.tsx @@ -2,6 +2,7 @@ import { useAtomSet, useAtomValue } from "@effect/atom-react"; import { FormBuilder, FormReact } from "@lucas-barake/effect-form-react"; import { actionAtom, + decodeAction, positionsAtom, selectedProviderAtom, selectedProviderBalancesAtom, @@ -9,8 +10,11 @@ import { } from "@yieldxyz/perps-common/atoms"; import { AmountField, ToggleGroup } from "@yieldxyz/perps-common/components"; import { + type Balance, + MarketId, + type Position, type WalletAccount, - WalletAccountAddress, + WalletAddress, } from "@yieldxyz/perps-common/domain"; import { clampPercent, @@ -20,19 +24,16 @@ import { round, valueFromPercent, } from "@yieldxyz/perps-common/lib"; -import { - ApiClientService, - type ApiTypes, - runtimeAtom, -} from "@yieldxyz/perps-common/services"; +import { ApiClientService, runtimeAtom } from "@yieldxyz/perps-common/services"; import { Effect, Option, Record, Schema } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import * as Atom from "effect/unstable/reactivity/Atom"; import * as Registry from "effect/unstable/reactivity/AtomRegistry"; +import type { FC, ReactNode } from "react"; export const AdjustMarginFormKey = Schema.Struct({ - walletAddress: WalletAccountAddress, - marketId: Schema.String, + walletAddress: WalletAddress, + marketId: MarketId, mode: Schema.Literals(["add", "remove"]), }).pipe(Schema.brand("AdjustMarginFormKey")); @@ -189,7 +190,7 @@ const adjustMarginFormAtom = Atom.family( }, }); - registry.set(actionAtom, action); + registry.set(actionAtom, decodeAction(action)); }), }); }, @@ -201,7 +202,7 @@ export const getAdjustMarginCalculations = ({ amount, mode, }: { - position: ApiTypes.PositionDto; + position: Position; availableBalance: number; amount: number; mode: UpdateMarginMode; @@ -224,10 +225,34 @@ export const getAdjustMarginCalculations = ({ export const useAdjustMarginPosition = ( key: typeof AdjustMarginFormKey.Type, -) => { +): Result.AsyncResult => { return useAtomValue(adjustMarginPositionAtom(key)); }; +type AdjustMarginFormView = { + readonly Initialize: FC<{ + readonly defaultValues: { + readonly Amount: string; + readonly Mode: UpdateMarginMode; + }; + readonly validateOnInit?: boolean; + readonly children: ReactNode; + }>; + readonly Amount: FC; +}; + +type AdjustMarginSubmitResult = Result.AsyncResult; + +type UseAdjustMarginResult = { + readonly AdjustMarginForm: AdjustMarginFormView; + readonly amount: number; + readonly mode: UpdateMarginMode; + readonly submit: () => void; + readonly submitResult: AdjustMarginSubmitResult; + readonly handlePercentageChange: (newPercentage: number) => void; + readonly percentage: number; +}; + export const useAdjustMargin = ({ key, position, @@ -235,10 +260,10 @@ export const useAdjustMargin = ({ mode, }: { key: typeof AdjustMarginFormKey.Type; - position: ApiTypes.PositionDto; + position: Position; availableBalance: number; mode: UpdateMarginMode; -}) => { +}): UseAdjustMarginResult => { const AdjustMarginForm = adjustMarginFormAtom(key); const amountFieldAtom = AdjustMarginForm.getFieldAtoms( @@ -288,6 +313,6 @@ export const useAdjustMargin = ({ export const useSelectedProviderBalanceResult = ( walletAddress: WalletAccount["address"], -) => { +): Result.AsyncResult => { return useAtomValue(selectedProviderBalancesAtom(walletAddress)); }; diff --git a/packages/widget/src/components/modules/PositionDetails/Close/index.tsx b/packages/widget/src/components/modules/PositionDetails/Close/index.tsx index 65a4f36..1eb6e69 100644 --- a/packages/widget/src/components/modules/PositionDetails/Close/index.tsx +++ b/packages/widget/src/components/modules/PositionDetails/Close/index.tsx @@ -7,7 +7,7 @@ import { Skeleton, Text, } from "@yieldxyz/perps-common/components"; -import type { WalletConnected } from "@yieldxyz/perps-common/domain"; +import type { Position, WalletConnected } from "@yieldxyz/perps-common/domain"; import { useCloseCalculations, useClosePercentage, @@ -19,7 +19,6 @@ import { formatTokenAmount, getPositionChangePercent, } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import { BackButton } from "../../../molecules/navigation/back-button"; import { WalletProtectedRoute } from "../../../molecules/navigation/wallet-protected-route"; @@ -75,7 +74,7 @@ function ClosePositionContent({ position, }: { wallet: WalletConnected; - position: ApiTypes.PositionDto; + position: Position; }) { const { closePercentage, setClosePercentage } = useClosePercentage(); const calculations = useCloseCalculations(position); diff --git a/packages/widget/src/components/modules/PositionDetails/Close/state.tsx b/packages/widget/src/components/modules/PositionDetails/Close/state.tsx index 74eced6..aae18d1 100644 --- a/packages/widget/src/components/modules/PositionDetails/Close/state.tsx +++ b/packages/widget/src/components/modules/PositionDetails/Close/state.tsx @@ -1,19 +1,23 @@ import { useAtomValue } from "@effect/atom-react"; import { positionsAtom } from "@yieldxyz/perps-common/atoms"; -import type { WalletAccount } from "@yieldxyz/perps-common/domain"; -import { type ApiTypes, runtimeAtom } from "@yieldxyz/perps-common/services"; -import { Effect, Record } from "effect"; +import { + MarketId, + type Position, + type WalletAccount, +} from "@yieldxyz/perps-common/domain"; +import { runtimeAtom } from "@yieldxyz/perps-common/services"; +import { Effect, Record, Schema } from "effect"; +import type * as Result from "effect/unstable/reactivity/AsyncResult"; import * as Atom from "effect/unstable/reactivity/Atom"; -export type { ApiTypes }; - const closePositionAtom = Atom.family( (args: { walletAddress: WalletAccount["address"]; marketId: string }) => runtimeAtom.atom( Effect.fn(function* (ctx) { const positions = yield* ctx.result(positionsAtom(args.walletAddress)); + const marketId = Schema.decodeSync(MarketId)(args.marketId); - const positionRef = Record.get(positions, args.marketId); + const positionRef = Record.get(positions, marketId); if (positionRef._tag === "None") { return yield* Effect.die(new Error("Position not found")); @@ -27,6 +31,6 @@ const closePositionAtom = Atom.family( export const usePosition = ( walletAddress: WalletAccount["address"], marketId: string, -) => { +): Result.AsyncResult => { return useAtomValue(closePositionAtom({ walletAddress, marketId })); }; diff --git a/packages/widget/src/components/modules/PositionDetails/Overview/Orders/index.tsx b/packages/widget/src/components/modules/PositionDetails/Overview/Orders/index.tsx index 6910bcc..71a7540 100644 --- a/packages/widget/src/components/modules/PositionDetails/Overview/Orders/index.tsx +++ b/packages/widget/src/components/modules/PositionDetails/Overview/Orders/index.tsx @@ -14,6 +14,8 @@ import { } from "@yieldxyz/perps-common/components"; import { isWalletConnected, + type Market, + type Order, type WalletConnected, } from "@yieldxyz/perps-common/domain"; import { useOrderActions } from "@yieldxyz/perps-common/hooks"; @@ -23,7 +25,6 @@ import { formatDate, formatSnakeCase, } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import * as Result from "effect/unstable/reactivity/AsyncResult"; function OrderCard({ @@ -31,8 +32,8 @@ function OrderCard({ market, wallet, }: { - order: ApiTypes.OrderDto; - market: ApiTypes.MarketDto; + order: Order; + market: Market; wallet: WalletConnected; }) { const price = order.limitPrice ?? order.triggerPrice ?? 0; @@ -162,7 +163,7 @@ function OrdersTabContentWithWallet({ market, }: { wallet: WalletConnected; - market: ApiTypes.MarketDto; + market: Market; }) { const ordersResult = useAtomValue(ordersAtom(wallet.currentAccount.address)); @@ -178,7 +179,7 @@ function OrdersTabContentWithWallet({ Result.map((allOrders) => allOrders.filter((o) => o.marketId === market.id), ), - Result.getOrElse(() => [] as ApiTypes.OrderDto[]), + Result.getOrElse(() => [] as Order[]), ); if (orders.length === 0) { @@ -210,7 +211,7 @@ function OrdersTabContentWithWallet({ ); } -export function OrdersTabContent({ market }: { market: ApiTypes.MarketDto }) { +export function OrdersTabContent({ market }: { market: Market }) { const wallet = useAtomValue(walletAtom).pipe(Result.getOrElse(() => null)); if (!isWalletConnected(wallet)) { diff --git a/packages/widget/src/components/modules/PositionDetails/Overview/Position/index.tsx b/packages/widget/src/components/modules/PositionDetails/Overview/Position/index.tsx index fec402b..c3dab99 100644 --- a/packages/widget/src/components/modules/PositionDetails/Overview/Position/index.tsx +++ b/packages/widget/src/components/modules/PositionDetails/Overview/Position/index.tsx @@ -17,6 +17,9 @@ import { } from "@yieldxyz/perps-common/components"; import { isWalletConnected, + type Market, + type Order, + type Position, type WalletConnected, } from "@yieldxyz/perps-common/domain"; import { @@ -33,7 +36,6 @@ import { getMaxLeverage, getTPOrSLConfigurationFromPosition, } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Option, Record } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; @@ -45,9 +47,9 @@ function PositionCardContent({ wallet, orders, }: { - orders: ApiTypes.OrderDto[]; - positionRef: AtomRef.AtomRef; - market: ApiTypes.MarketDto; + orders: Order[]; + positionRef: AtomRef.AtomRef; + market: Market; wallet: WalletConnected; }) { const position = useAtomRef(positionRef); @@ -283,7 +285,7 @@ function PositionTabContentWithWallet({ market, }: { wallet: WalletConnected; - market: ApiTypes.MarketDto; + market: Market; }) { const positionsResult = useAtomValue( positionsAtom(wallet.currentAccount.address), @@ -302,7 +304,7 @@ function PositionTabContentWithWallet({ Result.map((allOrders) => allOrders.filter((o) => o.marketId === market.id), ), - Result.getOrElse(() => [] as ApiTypes.OrderDto[]), + Result.getOrElse(() => [] as Order[]), ); const positionRef = positionsResult.pipe( @@ -337,7 +339,7 @@ function PositionTabContentWithWallet({ ); } -export function PositionTabContent({ market }: { market: ApiTypes.MarketDto }) { +export function PositionTabContent({ market }: { market: Market }) { const wallet = useAtomValue(walletAtom).pipe(Result.getOrElse(() => null)); if (!isWalletConnected(wallet)) { diff --git a/packages/widget/src/components/modules/PositionDetails/Overview/index.tsx b/packages/widget/src/components/modules/PositionDetails/Overview/index.tsx index 002cba6..e1f4188 100644 --- a/packages/widget/src/components/modules/PositionDetails/Overview/index.tsx +++ b/packages/widget/src/components/modules/PositionDetails/Overview/index.tsx @@ -23,6 +23,8 @@ import { } from "@yieldxyz/perps-common/components"; import { isWalletConnected, + type Market, + type Position, type WalletConnected, } from "@yieldxyz/perps-common/domain"; import { @@ -31,7 +33,6 @@ import { getMaxLeverage, getTokenLogo, } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import { Option, Record } from "effect"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import type * as AtomRef from "effect/unstable/reactivity/AtomRef"; @@ -49,7 +50,7 @@ function BottomButtonsWithWallet({ market, }: { wallet: WalletConnected; - market: ApiTypes.MarketDto; + market: Market; }) { const positionsResult = useAtomValue( positionsAtom(wallet.currentAccount.address), @@ -72,8 +73,8 @@ function BottomButtonsContent({ market, position, }: { - market: ApiTypes.MarketDto; - position?: ApiTypes.PositionDto; + market: Market; + position?: Position; }) { return (
@@ -110,7 +111,7 @@ function BottomButtonsContent({ ); } -function BottomButtons({ market }: { market: ApiTypes.MarketDto }) { +function BottomButtons({ market }: { market: Market }) { const wallet = useAtomValue(walletAtom).pipe(Result.getOrElse(() => null)); if (!isWalletConnected(wallet)) { @@ -125,7 +126,7 @@ function PositionDetailsContent({ marketRef, activeTab, }: { - marketRef: AtomRef.AtomRef; + marketRef: AtomRef.AtomRef; activeTab: PositionDetailsTab; }) { const market = useAtomRef(marketRef); diff --git a/packages/widget/src/components/modules/PositionDetails/Overview/overview-tab-content.tsx b/packages/widget/src/components/modules/PositionDetails/Overview/overview-tab-content.tsx index 7e3c99c..ea8b4f5 100644 --- a/packages/widget/src/components/modules/PositionDetails/Overview/overview-tab-content.tsx +++ b/packages/widget/src/components/modules/PositionDetails/Overview/overview-tab-content.tsx @@ -1,13 +1,13 @@ import { Card, CardSection, Text } from "@yieldxyz/perps-common/components"; +import type { Market } from "@yieldxyz/perps-common/domain"; import { estimateLowHighFromAbsoluteChange, formatAmount, formatCompactUsdAmount, formatRate, } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; -export function OverviewTabContent({ market }: { market: ApiTypes.MarketDto }) { +export function OverviewTabContent({ market }: { market: Market }) { const currentPrice = market.markPrice; const priceChange24h = market.priceChange24h; diff --git a/packages/widget/src/components/molecules/provider-select.tsx b/packages/widget/src/components/molecules/provider-select.tsx index 5289076..6d6ca2f 100644 --- a/packages/widget/src/components/molecules/provider-select.tsx +++ b/packages/widget/src/components/molecules/provider-select.tsx @@ -2,8 +2,8 @@ import { useAtomValue } from "@effect/atom-react"; import hyperliquidLogo from "@yieldxyz/perps-common/assets/hyperliquid.png"; import { providersAtom } from "@yieldxyz/perps-common/atoms"; import { Button, Dialog, Text } from "@yieldxyz/perps-common/components"; +import type { Provider } from "@yieldxyz/perps-common/domain"; import { cn } from "@yieldxyz/perps-common/lib"; -import type { ApiTypes } from "@yieldxyz/perps-common/services"; import * as Result from "effect/unstable/reactivity/AsyncResult"; import { ChevronDown } from "lucide-react"; import { @@ -18,9 +18,9 @@ import { interface ProviderSelectContextValue { open: boolean; setOpen: (open: boolean) => void; - selectedProvider: ApiTypes.ProviderDto | null; - setSelectedProvider: (provider: ApiTypes.ProviderDto) => void; - providers: ReadonlyArray; + selectedProvider: Provider | null; + setSelectedProvider: (provider: Provider) => void; + providers: ReadonlyArray; emptyContent: ReactNode; } @@ -52,10 +52,10 @@ function DefaultEmptyContent() { // Root component - handles state interface RootProps { children: ReactNode; - defaultProvider?: ApiTypes.ProviderDto; - value?: ApiTypes.ProviderDto; - onValueChange?: (provider: ApiTypes.ProviderDto) => void; - providers: ReadonlyArray; + defaultProvider?: Provider; + value?: Provider; + onValueChange?: (provider: Provider) => void; + providers: ReadonlyArray; emptyContent?: ReactNode; } @@ -68,13 +68,12 @@ function Root({ emptyContent = , }: RootProps) { const [open, setOpen] = useState(false); - const [internalProvider, setInternalProvider] = - useState( - defaultProvider ?? providers[0] ?? null, - ); + const [internalProvider, setInternalProvider] = useState( + defaultProvider ?? providers[0] ?? null, + ); const selectedProvider = value ?? internalProvider; - const setSelectedProvider = (provider: ApiTypes.ProviderDto) => { + const setSelectedProvider = (provider: Provider) => { if (!value) { setInternalProvider(provider); } @@ -234,9 +233,9 @@ function List({ className, children, ...props }: ListProps) { // Item component - individual provider item interface ItemProps extends Omit, "onSelect"> { - provider: ApiTypes.ProviderDto; + provider: Provider; selected?: boolean; - onSelect?: (provider: ApiTypes.ProviderDto) => void; + onSelect?: (provider: Provider) => void; } function Item({ diff --git a/packages/widget/src/components/molecules/sign/index.tsx b/packages/widget/src/components/molecules/sign/index.tsx index c440b50..b57265e 100644 --- a/packages/widget/src/components/molecules/sign/index.tsx +++ b/packages/widget/src/components/molecules/sign/index.tsx @@ -1,21 +1,23 @@ +import { useAtomValue } from "@effect/atom-react"; import { useNavigate } from "@tanstack/react-router"; -import { signActionAtoms } from "@yieldxyz/perps-common/atoms"; +import { + actionAtom, + transactionExecutionAtoms, +} from "@yieldxyz/perps-common/atoms"; import { Button, Text } from "@yieldxyz/perps-common/components"; -import type { WalletConnected } from "@yieldxyz/perps-common/domain"; import { BackButton } from "../navigation/back-button"; import { WalletProtectedRoute } from "../navigation/wallet-protected-route"; import { SignTransactions } from "./sign-content"; -function SignTransactionsWithWallet({ - wallet, - title, -}: { - title: string; - wallet: WalletConnected; -}) { +function SignTransactionsWithWallet({ title }: { title: string }) { const navigate = useNavigate(); + const action = useAtomValue(actionAtom); - const machineAtoms = signActionAtoms(wallet.signTransactions); + if (!action) { + return null; + } + + const machineAtoms = transactionExecutionAtoms(action); return (
@@ -47,7 +49,7 @@ function SignTransactionsWithWallet({ export function SignTransactionsRoute({ title }: { title: string }) { return ( - {(wallet) => } + {() => } ); } diff --git a/packages/widget/src/components/molecules/sign/sign-content.tsx b/packages/widget/src/components/molecules/sign/sign-content.tsx index b5337e1..6caf45f 100644 --- a/packages/widget/src/components/molecules/sign/sign-content.tsx +++ b/packages/widget/src/components/molecules/sign/sign-content.tsx @@ -1,6 +1,6 @@ -import { useAtomSet, useAtomValue } from "@effect/atom-react"; +import { useAtomValue } from "@effect/atom-react"; import { Navigate } from "@tanstack/react-router"; -import type { signActionAtoms } from "@yieldxyz/perps-common/atoms"; +import type { transactionExecutionAtoms } from "@yieldxyz/perps-common/atoms"; import { Skeleton, TransactionProgress, @@ -10,17 +10,16 @@ import * as Result from "effect/unstable/reactivity/AsyncResult"; interface SignTransactionsProps { state: SignTransactionsState; - retry: () => void; } -function SignTransactionsWithState({ state, retry }: SignTransactionsProps) { +function SignTransactionsWithState({ state }: SignTransactionsProps) { return (

Progress

- retry()} /> +
); } @@ -28,15 +27,12 @@ function SignTransactionsWithState({ state, retry }: SignTransactionsProps) { export function SignTransactions({ machineAtoms, }: { - machineAtoms: ReturnType; + machineAtoms: ReturnType; }) { - const { machineStreamAtom, retryMachineAtom } = machineAtoms; + const { machineStreamAtom } = machineAtoms; const state = useAtomValue(machineStreamAtom); - const retry = useAtomSet(retryMachineAtom); - const result = Result.all({ state, retry }); - - if (Result.isFailure(result)) { + if (Result.isFailure(state)) { return ( <> @@ -45,13 +41,8 @@ export function SignTransactions({ ); } - if (Result.isSuccess(result)) { - return ( - - ); + if (Result.isSuccess(state)) { + return ; } return ; diff --git a/packages/widget/src/index.ts b/packages/widget/src/index.ts new file mode 100644 index 0000000..8fc82d9 --- /dev/null +++ b/packages/widget/src/index.ts @@ -0,0 +1,14 @@ +export type { + ChainIdEncoded, + EvmTransactionRequestEncoded, + ExternalWalletSource, + LifecycleEvent, + SignedPayloadEncoded, + TransactionHashEncoded, + TypedDataRequestEncoded, + WalletAdapterStateEncoded, + WalletAddressEncoded, +} from "@yieldxyz/perps-common/domain"; +export type { PerpsConfig } from "@yieldxyz/perps-common/services"; + +export { Widget, type WidgetProps } from "./app"; diff --git a/packages/widget/src/main.tsx b/packages/widget/src/main.tsx index ba90f6b..b9a2059 100644 --- a/packages/widget/src/main.tsx +++ b/packages/widget/src/main.tsx @@ -1,11 +1,18 @@ +import "./styles.css"; import "./main.css"; +import type { PerpsConfig } from "@yieldxyz/perps-common/services"; import ReactDOM from "react-dom/client"; import { Widget } from "./app"; -import "@yieldxyz/perps-common/styles"; +const config: PerpsConfig = { + perpsBaseUrl: import.meta.env.VITE_PERPS_BASE_URL, + perpsApiKey: import.meta.env.VITE_PERPS_API_KEY, + reownProjectId: import.meta.env.VITE_REOWN_PROJECT_ID || undefined, + moralisApiKey: import.meta.env.VITE_MORALIS_API_KEY, +}; const rootElement = document.getElementById("app"); if (rootElement && !rootElement.innerHTML) { const root = ReactDOM.createRoot(rootElement); - root.render(); + root.render(); } diff --git a/packages/widget/src/styles-entry.ts b/packages/widget/src/styles-entry.ts new file mode 100644 index 0000000..fed29db --- /dev/null +++ b/packages/widget/src/styles-entry.ts @@ -0,0 +1 @@ +import "./styles.css"; diff --git a/packages/widget/src/vanilla.tsx b/packages/widget/src/vanilla.tsx new file mode 100644 index 0000000..1322ffb --- /dev/null +++ b/packages/widget/src/vanilla.tsx @@ -0,0 +1,37 @@ +import ReactDOM from "react-dom/client"; +import { Widget, type WidgetProps } from "./app"; + +export type WidgetMountTarget = Element | DocumentFragment | string; + +export type MountedWidget = { + readonly unmount: () => void; +}; + +const getMountTarget = (target: WidgetMountTarget) => { + if (typeof target !== "string") { + return target; + } + + const element = document.querySelector(target); + + if (!element) { + throw new Error(`Widget mount target not found: ${target}`); + } + + return element; +}; + +export const mountWidget = ( + target: WidgetMountTarget, + props: WidgetProps, +): MountedWidget => { + const root = ReactDOM.createRoot(getMountTarget(target)); + + root.render(); + + return { + unmount: () => root.unmount(), + }; +}; + +export type { WidgetProps } from "./app"; diff --git a/packages/widget/vite.react.config.ts b/packages/widget/vite.react.config.ts new file mode 100644 index 0000000..c59a4c8 --- /dev/null +++ b/packages/widget/vite.react.config.ts @@ -0,0 +1,50 @@ +import { resolve } from "node:path"; +import { + createNodePolyfillsPlugin, + createReactCompilerPlugin, + createTailwindPlugin, + createViteReactPlugin, +} from "@yieldxyz/perps-common/vite.config"; +import { defineConfig, esmExternalRequirePlugin } from "vite"; + +const reactExternals = [ + "react", + "react-dom", + "react-dom/client", + "react/jsx-runtime", + "react/jsx-dev-runtime", +]; + +export default defineConfig({ + plugins: [ + esmExternalRequirePlugin({ + external: [...reactExternals], + }), + createViteReactPlugin(), + createReactCompilerPlugin(), + createTailwindPlugin(), + createNodePolyfillsPlugin(), + ], + build: { + outDir: "dist", + emptyOutDir: false, + sourcemap: true, + lib: { + entry: { + index: resolve(__dirname, "src/index.ts"), + styles: resolve(__dirname, "src/styles-entry.ts"), + }, + formats: ["es"], + }, + rollupOptions: { + output: { + entryFileNames: "react/[name].js", + chunkFileNames: "react/chunks/[name]-[hash].js", + assetFileNames: (assetInfo) => + assetInfo.name?.endsWith(".css") + ? "styles.css" + : "react/assets/[name][extname]", + }, + }, + }, +}); diff --git a/packages/widget/vite.vanilla.config.ts b/packages/widget/vite.vanilla.config.ts new file mode 100644 index 0000000..db2096a --- /dev/null +++ b/packages/widget/vite.vanilla.config.ts @@ -0,0 +1,33 @@ +import { resolve } from "node:path"; +import { + createNodePolyfillsPlugin, + createReactCompilerPlugin, + createViteReactPlugin, +} from "@yieldxyz/perps-common/vite.config"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [ + createViteReactPlugin(), + createReactCompilerPlugin(), + createNodePolyfillsPlugin(), + ], + build: { + outDir: "dist", + emptyOutDir: false, + sourcemap: true, + lib: { + entry: { + vanilla: resolve(__dirname, "src/vanilla.tsx"), + }, + formats: ["es"], + }, + rollupOptions: { + output: { + entryFileNames: "vanilla/[name].js", + chunkFileNames: "vanilla/chunks/[name]-[hash].js", + assetFileNames: "vanilla/assets/[name][extname]", + }, + }, + }, +}); diff --git a/patches/vite-plugin-node-polyfills@0.26.0.patch b/patches/vite-plugin-node-polyfills@0.26.0.patch new file mode 100644 index 0000000..373e0b1 --- /dev/null +++ b/patches/vite-plugin-node-polyfills@0.26.0.patch @@ -0,0 +1,63 @@ +diff --git a/dist/index.cjs b/dist/index.cjs +index 835fc54b10d46f4f8e2153377c71f24f83eaa284..137ba1902b6129e93baee194f8bc0a92e3fdfb24 100644 +--- a/dist/index.cjs ++++ b/dist/index.cjs +@@ -1,3 +1,3 @@ + "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const T=require("node:module"),w=require("@rollup/plugin-inject"),x=require("node-stdlib-browser"),O=require("node-stdlib-browser/helpers/rollup/plugin"),P=require("node-stdlib-browser/helpers/esbuild/plugin");var h=typeof document<"u"?document.currentScript:null;const g=l=>l&&l.__esModule?l:{default:l},R=g(w),S=g(x),q=g(P),_=(l,e)=>b(l)===b(e),s=(l,e)=>l?l===!0?!0:l===e:!1,$=l=>l.startsWith("node:"),I=l=>{const e=l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`^${e}$`)},b=l=>l.replace(/^node:/,""),a={buffer:["import __buffer_polyfill from 'vite-plugin-node-polyfills/shims/buffer'","globalThis.Buffer = globalThis.Buffer || __buffer_polyfill"],global:["import __global_polyfill from 'vite-plugin-node-polyfills/shims/global'","globalThis.global = globalThis.global || __global_polyfill"],process:["import __process_polyfill from 'vite-plugin-node-polyfills/shims/process'","globalThis.process = globalThis.process || __process_polyfill"]},D=(l={})=>{const e={include:[],exclude:[],overrides:{},protocolImports:!0,...l,globals:{Buffer:!0,global:!0,process:!0,...l.globals}},y=o=>e.include.length>0?!e.include.some(r=>_(o,r)):e.exclude.some(r=>_(o,r)),B=o=>{if(s(e.globals.Buffer,"dev")&&/^buffer$/.test(o))return"vite-plugin-node-polyfills/shims/buffer";if(s(e.globals.global,"dev")&&/^global$/.test(o))return"vite-plugin-node-polyfills/shims/global";if(s(e.globals.process,"dev")&&/^process$/.test(o))return"vite-plugin-node-polyfills/shims/process";if(o in e.overrides)return e.overrides[o]},u=Object.entries(S.default).reduce((o,[r,i])=>(!e.protocolImports&&$(r)||y(r)||(o[r]=B(b(r))||i),o),{}),f=T.createRequire(typeof document>"u"?require("url").pathToFileURL(__filename).href:h&&h.src||new URL("index.cjs",document.baseURI).href),p=[...s(e.globals.Buffer,"dev")?[f.resolve("vite-plugin-node-polyfills/shims/buffer")]:[],...s(e.globals.global,"dev")?[f.resolve("vite-plugin-node-polyfills/shims/global")]:[],...s(e.globals.process,"dev")?[f.resolve("vite-plugin-node-polyfills/shims/process")]:[]],d=[...s(e.globals.Buffer,"dev")?a.buffer:[],...s(e.globals.global,"dev")?a.global:[],...s(e.globals.process,"dev")?a.process:[],""].join(` +-`);return{name:"vite-plugin-node-polyfills",config(o,r){const i=r.command==="serve",v=!!this?.meta?.rolldownVersion,m={...i&&s(e.globals.Buffer,"dev")?{Buffer:"Buffer"}:{},...i&&s(e.globals.global,"dev")?{global:"global"}:{},...i&&s(e.globals.process,"dev")?{process:"process"}:{}},c={...s(e.globals.Buffer,"build")?{Buffer:"vite-plugin-node-polyfills/shims/buffer"}:{},...s(e.globals.global,"build")?{global:"vite-plugin-node-polyfills/shims/global"}:{},...s(e.globals.process,"build")?{process:"vite-plugin-node-polyfills/shims/process"}:{}};return{build:{rollupOptions:{onwarn:(t,n)=>{O.handleCircularDependancyWarning(t,()=>{if(o.build?.rollupOptions?.onwarn)return o.build.rollupOptions.onwarn(t,n);n(t)})},...Object.keys(c).length>0?v?{transform:{inject:c}}:{plugins:[R.default(c)]}:{}}},esbuild:{banner:i?d:void 0},optimizeDeps:{exclude:[...p],...v?{rolldownOptions:{resolve:{alias:{...u}},transform:{define:m},plugins:[{name:"vite-plugin-node-polyfills:optimizer",banner:i?d:void 0}]}}:{esbuildOptions:{banner:i?{js:d}:void 0,define:m,inject:[...p],plugins:[q.default(u),{name:"vite-plugin-node-polyfills-shims-resolver",setup(t){for(const n of p){const j=I(n);t.onResolve({filter:j},()=>({external:!1,path:n}))}}}]}}},resolve:{alias:{...u}}}}}};exports.nodePolyfills=D; ++`),F=o=>/\.(m?ts|[jt]sx)$/.test(o.split("?",1)[0]);let E=!1;return{name:"vite-plugin-node-polyfills",config(o,r){const i=r.command==="serve",v=!!this?.meta?.rolldownVersion,m={...i&&s(e.globals.Buffer,"dev")?{Buffer:"Buffer"}:{},...i&&s(e.globals.global,"dev")?{global:"global"}:{},...i&&s(e.globals.process,"dev")?{process:"process"}:{}},c={...s(e.globals.Buffer,"build")?{Buffer:"vite-plugin-node-polyfills/shims/buffer"}:{},...s(e.globals.global,"build")?{global:"vite-plugin-node-polyfills/shims/global"}:{},...s(e.globals.process,"build")?{process:"vite-plugin-node-polyfills/shims/process"}:{}};E=i;return{build:{rollupOptions:{onwarn:(t,n)=>{O.handleCircularDependancyWarning(t,()=>{if(o.build?.rollupOptions?.onwarn)return o.build.rollupOptions.onwarn(t,n);n(t)})},...Object.keys(c).length>0?v?{transform:{inject:c}}:{plugins:[R.default(c)]}:{}}},optimizeDeps:{exclude:[...p],...v?{rolldownOptions:{resolve:{alias:{...u}},transform:{define:m},plugins:[{name:"vite-plugin-node-polyfills:optimizer",banner:i?d:void 0}]}}:{esbuildOptions:{banner:i?{js:d}:void 0,define:m,inject:[...p],plugins:[q.default(u),{name:"vite-plugin-node-polyfills-shims-resolver",setup(t){for(const n of p){const j=I(n);t.onResolve({filter:j},()=>({external:!1,path:n}))}}}]}}},resolve:{alias:{...u}}}},transform(o,r){if(E&&d&&F(r))return{code:d+o,map:null}}}};exports.nodePolyfills=D; + //# sourceMappingURL=index.cjs.map +diff --git a/dist/index.js b/dist/index.js +index 007d9a62c8b5c9d4fbcfd25f4352e765bddd986e..93a8ec9cac91445b73433bcdf627edd6f92baa42 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -19,7 +19,7 @@ const v = (s, l) => d(s) === d(l), e = (s, l) => s ? s === !0 ? !0 : s === l : ! + "import __process_polyfill from 'vite-plugin-node-polyfills/shims/process'", + "globalThis.process = globalThis.process || __process_polyfill" + ] +-}, D = (s = {}) => { ++}, E = (s) => /\.(m?ts|[jt]sx)$/.test(s.split("?", 1)[0]), D = (s = {}) => { + const l = { + include: [], + exclude: [], +@@ -52,6 +52,7 @@ const v = (s, l) => d(s) === d(l), e = (s, l) => s ? s === !0 ? !0 : s === l : ! + "" + ].join(` + `); ++ let _ = !1; + return { + name: "vite-plugin-node-polyfills", + config(o, r) { +@@ -65,6 +66,7 @@ const v = (s, l) => d(s) === d(l), e = (s, l) => s ? s === !0 ? !0 : s === l : ! + ...e(l.globals.global, "build") ? { global: "vite-plugin-node-polyfills/shims/global" } : {}, + ...e(l.globals.process, "build") ? { process: "vite-plugin-node-polyfills/shims/process" } : {} + }; ++ _ = i; + return { + build: { + rollupOptions: { +@@ -78,10 +80,6 @@ const v = (s, l) => d(s) === d(l), e = (s, l) => s ? s === !0 ? !0 : s === l : ! + ...Object.keys(b).length > 0 ? c ? { transform: { inject: b } } : { plugins: [x(b)] } : {} + } + }, +- esbuild: { +- // In dev, the global polyfills need to be injected as a banner in order for isolated scripts (such as Vue SFCs) to have access to them. +- banner: i ? a : void 0 +- }, + optimizeDeps: { + exclude: [ + ...u +@@ -139,6 +137,13 @@ const v = (s, l) => d(s) === d(l), e = (s, l) => s ? s === !0 ? !0 : s === l : ! + } + } + }; ++ }, ++ transform(o, r) { ++ if (_ && a && E(r)) ++ return { ++ code: a + o, ++ map: null ++ }; + } + }; + }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 47c49ef..71f4ae7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,23 +1,23 @@ lockfileVersion: '9.0' settings: - autoInstallPeers: false + autoInstallPeers: true excludeLinksFromLockfile: false catalogs: default: '@base-ui/react': - specifier: ^1.2.0 - version: 1.2.0 + specifier: ^1.4.1 + version: 1.4.1 '@biomejs/biome': - specifier: ^2.3.15 - version: 2.3.15 + specifier: ^2.4.14 + version: 2.4.14 '@commitlint/cli': - specifier: ^20.4.1 - version: 20.4.1 + specifier: ^21.0.0 + version: 21.0.0 '@commitlint/config-conventional': - specifier: ^20.4.1 - version: 20.4.1 + specifier: ^21.0.0 + version: 21.0.0 '@effect/atom-react': specifier: ^4.0.0-beta.65 version: 4.0.0-beta.65 @@ -30,54 +30,54 @@ catalogs: '@effect/platform-node': specifier: ^4.0.0-beta.65 version: 4.0.0-beta.65 - '@ledgerhq/wallet-api-client': - specifier: ^1.13.0 - version: 1.13.0 '@lucas-barake/effect-form-react': specifier: ^0.24.0 version: 0.24.0 '@nktkas/hyperliquid': - specifier: ^0.31.0 - version: 0.31.0 + specifier: ^0.32.2 + version: 0.32.2 '@reown/appkit': - specifier: ^1.8.18 - version: 1.8.18 + specifier: ^1.8.19 + version: 1.8.19 '@reown/appkit-adapter-wagmi': - specifier: ^1.8.18 - version: 1.8.18 + specifier: ^1.8.19 + version: 1.8.19 + '@rolldown/plugin-babel': + specifier: ^0.2.0 + version: 0.2.3 '@stakekit/common': specifier: ^0.0.61 version: 0.0.61 '@tailwindcss/vite': - specifier: ^4.0.6 - version: 4.1.18 + specifier: ^4.3.0 + version: 4.3.0 '@tanstack/devtools-vite': - specifier: ^0.5.1 - version: 0.5.1 + specifier: ^0.6.0 + version: 0.6.0 '@tanstack/react-devtools': - specifier: ^0.9.5 - version: 0.9.5 + specifier: ^0.10.2 + version: 0.10.2 '@tanstack/react-query': - specifier: ^5.90.21 - version: 5.90.21 + specifier: ^5.100.9 + version: 5.100.9 '@tanstack/react-router': - specifier: ^1.159.5 - version: 1.159.5 + specifier: ^1.169.2 + version: 1.169.2 '@tanstack/react-router-devtools': - specifier: ^1.159.5 - version: 1.159.5 + specifier: ^1.166.13 + version: 1.166.13 '@tanstack/react-virtual': - specifier: ^3.13.18 - version: 3.13.18 + specifier: ^3.13.24 + version: 3.13.24 '@tanstack/router-cli': - specifier: ^1.159.5 - version: 1.166.25 + specifier: ^1.166.43 + version: 1.166.43 '@tanstack/router-plugin': - specifier: ^1.159.5 - version: 1.159.5 + specifier: ^1.167.35 + version: 1.167.35 '@types/node': - specifier: ^25.2.3 - version: 25.2.3 + specifier: ^25.6.2 + version: 25.6.2 '@types/react': specifier: ^19.2.14 version: 19.2.14 @@ -88,11 +88,11 @@ catalogs: specifier: ^1.0.2 version: 1.0.2 '@vitejs/plugin-react': - specifier: ^5.1.4 - version: 5.1.4 + specifier: ^6.0.1 + version: 6.0.1 '@vitest/browser-playwright': - specifier: ^4.0.18 - version: 4.0.18 + specifier: ^4.1.5 + version: 4.1.5 babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -109,59 +109,59 @@ catalogs: specifier: ^9.1.7 version: 9.1.7 jsdom: - specifier: ^28.0.0 - version: 28.0.0 + specifier: ^29.1.1 + version: 29.1.1 lucide-react: - specifier: ^0.564.0 - version: 0.564.0 + specifier: ^1.14.0 + version: 1.14.0 openapi-filter: specifier: ^3.2.3 version: 3.2.3 react: - specifier: ^19.2.0 - version: 19.2.4 + specifier: ^19.2.6 + version: 19.2.6 react-dom: - specifier: ^19.2.0 - version: 19.2.4 + specifier: ^19.2.6 + version: 19.2.6 sonner: specifier: ^2.0.7 version: 2.0.7 tailwind-merge: - specifier: ^3.0.2 - version: 3.4.0 + specifier: ^3.5.0 + version: 3.5.0 tailwindcss: - specifier: ^4.0.6 - version: 4.1.18 + specifier: ^4.3.0 + version: 4.3.0 tsx: specifier: ^4.21.0 version: 4.21.0 turbo: - specifier: ^2.8.7 - version: 2.8.7 + specifier: ^2.9.12 + version: 2.9.12 tw-animate-css: specifier: ^1.3.6 version: 1.4.0 typescript: - specifier: ^5.7.2 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 viem: - specifier: ^2.45.3 - version: 2.45.3 + specifier: ^2.48.11 + version: 2.48.11 vite: - specifier: ^7.3.1 - version: 7.3.1 + specifier: ^8.0.11 + version: 8.0.11 vite-plugin-node-polyfills: - specifier: ^0.25.0 - version: 0.25.0 + specifier: ^0.26.0 + version: 0.26.0 vitest: - specifier: ^4.0.18 - version: 4.0.18 + specifier: ^4.1.5 + version: 4.1.5 vitest-browser-react: - specifier: ^2.0.4 - version: 2.0.5 + specifier: ^2.2.0 + version: 2.2.0 wagmi: - specifier: ^3.4.3 - version: 3.4.3 + specifier: ^3.6.11 + version: 3.6.11 patchedDependencies: '@lucas-barake/effect-form-react@0.24.0': @@ -170,6 +170,9 @@ patchedDependencies: '@lucas-barake/effect-form@0.23.0': hash: 4f4cbbb31f1466c5d108c52532d9dd5b21ce6cff1d6b86b2d96d8eb4e9dbe863 path: patches/@lucas-barake__effect-form@0.23.0.patch + vite-plugin-node-polyfills@0.26.0: + hash: 2f652eeb27eb59e7cd6a47bd85f51fe0133a1fdcd7fac68c42e21c232383a67a + path: patches/vite-plugin-node-polyfills@0.26.0.patch importers: @@ -177,13 +180,13 @@ importers: devDependencies: '@biomejs/biome': specifier: 'catalog:' - version: 2.3.15 + version: 2.4.14 '@commitlint/cli': specifier: 'catalog:' - version: 20.4.1(@types/node@25.2.3)(typescript@5.9.3) + version: 21.0.0(@types/node@25.6.2)(conventional-commits-parser@6.4.0)(typescript@6.0.3) '@commitlint/config-conventional': specifier: 'catalog:' - version: 20.4.1 + version: 21.0.0 '@effect/language-service': specifier: 'catalog:' version: 0.85.1 @@ -195,64 +198,137 @@ importers: version: 8.0.2 openapi-typescript: specifier: ^7.13.0 - version: 7.13.0(typescript@5.9.3) + version: 7.13.0(typescript@6.0.3) swagger2openapi: specifier: ^7.0.8 version: 7.0.8 turbo: specifier: 'catalog:' - version: 2.8.7 + version: 2.9.12 yaml: - specifier: ^2.9.0 - version: 2.9.0 + specifier: ^2.8.4 + version: 2.8.4 + + apps/dashboard-react-example: + dependencies: + '@yieldxyz/perps-dashboard': + specifier: workspace:* + version: link:../../packages/dashboard + react: + specifier: 'catalog:' + version: 19.2.6 + react-dom: + specifier: 'catalog:' + version: 19.2.6(react@19.2.6) + devDependencies: + '@types/react': + specifier: 'catalog:' + version: 19.2.14 + '@types/react-dom': + specifier: 'catalog:' + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: 'catalog:' + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.18)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) + typescript: + specifier: 'catalog:' + version: 6.0.3 + vite: + specifier: 'catalog:' + version: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) + + apps/dashboard-vanilla-example: + dependencies: + '@yieldxyz/perps-dashboard': + specifier: workspace:* + version: link:../../packages/dashboard + devDependencies: + vite: + specifier: 'catalog:' + version: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) + + apps/widget-react-example: + dependencies: + '@yieldxyz/perps-widget': + specifier: workspace:* + version: link:../../packages/widget + react: + specifier: 'catalog:' + version: 19.2.6 + react-dom: + specifier: 'catalog:' + version: 19.2.6(react@19.2.6) + devDependencies: + '@types/react': + specifier: 'catalog:' + version: 19.2.14 + '@types/react-dom': + specifier: 'catalog:' + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: 'catalog:' + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.18)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) + typescript: + specifier: 'catalog:' + version: 6.0.3 + vite: + specifier: 'catalog:' + version: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) + + apps/widget-vanilla-example: + dependencies: + '@yieldxyz/perps-widget': + specifier: workspace:* + version: link:../../packages/widget + devDependencies: + vite: + specifier: 'catalog:' + version: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) packages/common: dependencies: '@base-ui/react': specifier: 'catalog:' - version: 1.2.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.4.1(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@effect/atom-react': specifier: 'catalog:' - version: 4.0.0-beta.65(effect@4.0.0-beta.65)(react@19.2.4)(scheduler@0.27.0) + version: 4.0.0-beta.65(effect@4.0.0-beta.65)(react@19.2.6)(scheduler@0.27.0) '@effect/platform-node': specifier: 'catalog:' - version: 4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10) - '@ledgerhq/wallet-api-client': - specifier: 'catalog:' - version: 1.13.0 + version: 4.0.0-beta.65(effect@4.0.0-beta.65)(ioredis@5.10.1) '@lucas-barake/effect-form-react': specifier: 'catalog:' - version: 0.24.0(patch_hash=19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05)(effect@4.0.0-beta.65)(react@19.2.4) + version: 0.24.0(patch_hash=19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05)(@effect-atom/atom-react@0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(react@19.2.6)(scheduler@0.27.0))(@effect-atom/atom@0.5.3(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(react@19.2.6) '@nktkas/hyperliquid': specifier: 'catalog:' - version: 0.31.0(typescript@5.9.3) + version: 0.32.2(typescript@6.0.3) '@reown/appkit': specifier: 'catalog:' - version: 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + version: 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(zod@3.25.76) '@reown/appkit-adapter-wagmi': specifier: 'catalog:' - version: 1.8.18(9ee7863b275c29e516ad5604625576cd) + version: 1.8.19(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@types/react@19.2.14)(@wagmi/core@3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76))(wagmi@3.6.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@tanstack/query-core@5.100.9)(@tanstack/react-query@5.100.9(react@19.2.6))(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(zod@3.25.76) '@stakekit/common': specifier: 'catalog:' version: 0.0.61 '@tailwindcss/vite': specifier: 'catalog:' - version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.3.0(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) '@tanstack/react-devtools': specifier: 'catalog:' - version: 0.9.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@5.0.10) + version: 0.10.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(solid-js@1.9.12) '@tanstack/react-query': specifier: 'catalog:' - version: 5.90.21(react@19.2.4) + version: 5.100.9(react@19.2.6) '@tanstack/react-router': specifier: 'catalog:' - version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-router-devtools': specifier: 'catalog:' - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.168.9)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.166.13(@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.169.2)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-virtual': specifier: 'catalog:' - version: 3.13.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 3.13.24(react-dom@19.2.6(react@19.2.6))(react@19.2.6) class-variance-authority: specifier: 'catalog:' version: 0.7.1 @@ -264,44 +340,47 @@ importers: version: 4.0.0-beta.65 lucide-react: specifier: 'catalog:' - version: 0.564.0(react@19.2.4) + version: 1.14.0(react@19.2.6) react: specifier: 'catalog:' - version: 19.2.4 + version: 19.2.6 react-dom: specifier: 'catalog:' - version: 19.2.4(react@19.2.4) + version: 19.2.6(react@19.2.6) sonner: specifier: 'catalog:' - version: 2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 2.0.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) tailwind-merge: specifier: 'catalog:' - version: 3.4.0 + version: 3.5.0 tailwindcss: specifier: 'catalog:' - version: 4.1.18 + version: 4.3.0 tw-animate-css: specifier: 'catalog:' version: 1.4.0 viem: specifier: 'catalog:' - version: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 2.48.11(typescript@6.0.3)(zod@3.25.76) wagmi: specifier: 'catalog:' - version: 3.4.3(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.4))(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + version: 3.6.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@tanstack/query-core@5.100.9)(@tanstack/react-query@5.100.9(react@19.2.6))(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) devDependencies: '@effect/openapi-generator': specifier: 'catalog:' - version: 4.0.0-beta.65(@effect/platform-node@4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10))(effect@4.0.0-beta.65) + version: 4.0.0-beta.65(@effect/platform-node@4.0.0-beta.65(effect@4.0.0-beta.65)(ioredis@5.10.1))(effect@4.0.0-beta.65) + '@rolldown/plugin-babel': + specifier: 'catalog:' + version: 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.18)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) '@tanstack/devtools-vite': specifier: 'catalog:' - version: 0.5.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 0.6.0(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) '@tanstack/router-cli': specifier: 'catalog:' - version: 1.166.25 + version: 1.166.43 '@types/node': specifier: 'catalog:' - version: 25.2.3 + version: 25.6.2 '@types/react': specifier: 'catalog:' version: 19.2.14 @@ -313,16 +392,16 @@ importers: version: 1.0.2 '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.18)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18) + version: 4.1.5(playwright@1.59.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))(vitest@4.1.5) babel-plugin-react-compiler: specifier: 'catalog:' version: 1.0.0 jsdom: specifier: 'catalog:' - version: 28.0.0(@noble/hashes@2.0.1) + version: 29.1.1(@noble/hashes@2.2.0) openapi-filter: specifier: 'catalog:' version: 3.2.3 @@ -331,119 +410,76 @@ importers: version: 4.21.0 typescript: specifier: 'catalog:' - version: 5.9.3 + version: 6.0.3 vite: specifier: 'catalog:' - version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) + version: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 0.26.0(patch_hash=2f652eeb27eb59e7cd6a47bd85f51fe0133a1fdcd7fac68c42e21c232383a67a)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) vitest: specifier: 'catalog:' - version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) + version: 4.1.5(@types/node@25.6.2)(@vitest/browser-playwright@4.1.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) vitest-browser-react: specifier: 'catalog:' - version: 2.0.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18) + version: 2.2.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5) packages/dashboard: - dependencies: + devDependencies: '@base-ui/react': specifier: 'catalog:' - version: 1.2.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.4.1(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@effect/atom-react': specifier: 'catalog:' - version: 4.0.0-beta.65(effect@4.0.0-beta.65)(react@19.2.4)(scheduler@0.27.0) - '@effect/platform-node': + version: 4.0.0-beta.65(effect@4.0.0-beta.65)(react@19.2.6)(scheduler@0.27.0) + '@effect/openapi-generator': specifier: 'catalog:' - version: 4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10) - '@ledgerhq/wallet-api-client': + version: 4.0.0-beta.65(@effect/platform-node@4.0.0-beta.65(effect@4.0.0-beta.65)(ioredis@5.10.1))(effect@4.0.0-beta.65) + '@effect/platform-node': specifier: 'catalog:' - version: 1.13.0 + version: 4.0.0-beta.65(effect@4.0.0-beta.65)(ioredis@5.10.1) '@lucas-barake/effect-form-react': specifier: 'catalog:' - version: 0.24.0(patch_hash=19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05)(effect@4.0.0-beta.65)(react@19.2.4) + version: 0.24.0(patch_hash=19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05)(@effect-atom/atom-react@0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(react@19.2.6)(scheduler@0.27.0))(@effect-atom/atom@0.5.3(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(react@19.2.6) '@reown/appkit': specifier: 'catalog:' - version: 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + version: 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(zod@3.25.76) '@reown/appkit-adapter-wagmi': specifier: 'catalog:' - version: 1.8.18(9ee7863b275c29e516ad5604625576cd) + version: 1.8.19(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@types/react@19.2.14)(@wagmi/core@3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76))(wagmi@3.6.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@tanstack/query-core@5.100.9)(@tanstack/react-query@5.100.9(react@19.2.6))(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(zod@3.25.76) '@stakekit/common': specifier: 'catalog:' version: 0.0.61 '@tailwindcss/vite': specifier: 'catalog:' - version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.3.0(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) + '@tanstack/devtools-vite': + specifier: 'catalog:' + version: 0.6.0(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) '@tanstack/react-devtools': specifier: 'catalog:' - version: 0.9.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@5.0.10) + version: 0.10.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(solid-js@1.9.12) '@tanstack/react-query': specifier: 'catalog:' - version: 5.90.21(react@19.2.4) + version: 5.100.9(react@19.2.6) '@tanstack/react-router': specifier: 'catalog:' - version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-router-devtools': specifier: 'catalog:' - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.168.9)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.166.13(@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.169.2)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-virtual': specifier: 'catalog:' - version: 3.13.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@yieldxyz/perps-common': - specifier: workspace:* - version: link:../common - class-variance-authority: - specifier: 'catalog:' - version: 0.7.1 - clsx: - specifier: 'catalog:' - version: 2.1.1 - effect: - specifier: 'catalog:' - version: 4.0.0-beta.65 - lucide-react: - specifier: 'catalog:' - version: 0.564.0(react@19.2.4) - react: - specifier: 'catalog:' - version: 19.2.4 - react-dom: - specifier: 'catalog:' - version: 19.2.4(react@19.2.4) - sonner: - specifier: 'catalog:' - version: 2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - tailwind-merge: - specifier: 'catalog:' - version: 3.4.0 - tailwindcss: - specifier: 'catalog:' - version: 4.1.18 - tw-animate-css: - specifier: 'catalog:' - version: 1.4.0 - viem: - specifier: 'catalog:' - version: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - wagmi: - specifier: 'catalog:' - version: 3.4.3(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.4))(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - devDependencies: - '@effect/openapi-generator': - specifier: 'catalog:' - version: 4.0.0-beta.65(@effect/platform-node@4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10))(effect@4.0.0-beta.65) - '@tanstack/devtools-vite': - specifier: 'catalog:' - version: 0.5.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 3.13.24(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/router-cli': specifier: 'catalog:' - version: 1.166.25 + version: 1.166.43 '@tanstack/router-plugin': specifier: 'catalog:' - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 1.167.35(@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) '@types/node': specifier: 'catalog:' - version: 25.2.3 + version: 25.6.2 '@types/react': specifier: 'catalog:' version: 19.2.14 @@ -455,137 +491,133 @@ importers: version: 1.0.2 '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.18)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18) + version: 4.1.5(playwright@1.59.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))(vitest@4.1.5) + '@yieldxyz/perps-common': + specifier: workspace:* + version: link:../common babel-plugin-react-compiler: specifier: 'catalog:' version: 1.0.0 + class-variance-authority: + specifier: 'catalog:' + version: 0.7.1 + clsx: + specifier: 'catalog:' + version: 2.1.1 + effect: + specifier: 'catalog:' + version: 4.0.0-beta.65 jsdom: specifier: 'catalog:' - version: 28.0.0(@noble/hashes@2.0.1) + version: 29.1.1(@noble/hashes@2.2.0) + lucide-react: + specifier: 'catalog:' + version: 1.14.0(react@19.2.6) openapi-filter: specifier: 'catalog:' version: 3.2.3 + react: + specifier: 'catalog:' + version: 19.2.6 + react-dom: + specifier: 'catalog:' + version: 19.2.6(react@19.2.6) + sonner: + specifier: 'catalog:' + version: 2.0.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + tailwind-merge: + specifier: 'catalog:' + version: 3.5.0 + tailwindcss: + specifier: 'catalog:' + version: 4.3.0 tsx: specifier: 'catalog:' version: 4.21.0 + tw-animate-css: + specifier: 'catalog:' + version: 1.4.0 typescript: specifier: 'catalog:' - version: 5.9.3 + version: 6.0.3 + viem: + specifier: 'catalog:' + version: 2.48.11(typescript@6.0.3)(zod@3.25.76) vite: specifier: 'catalog:' - version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) + version: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 0.26.0(patch_hash=2f652eeb27eb59e7cd6a47bd85f51fe0133a1fdcd7fac68c42e21c232383a67a)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) vitest: specifier: 'catalog:' - version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) + version: 4.1.5(@types/node@25.6.2)(@vitest/browser-playwright@4.1.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) vitest-browser-react: specifier: 'catalog:' - version: 2.0.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18) + version: 2.2.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5) + wagmi: + specifier: 'catalog:' + version: 3.6.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@tanstack/query-core@5.100.9)(@tanstack/react-query@5.100.9(react@19.2.6))(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) packages/widget: - dependencies: + devDependencies: '@base-ui/react': specifier: 'catalog:' - version: 1.2.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.4.1(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@effect/atom-react': specifier: 'catalog:' - version: 4.0.0-beta.65(effect@4.0.0-beta.65)(react@19.2.4)(scheduler@0.27.0) - '@effect/platform-node': + version: 4.0.0-beta.65(effect@4.0.0-beta.65)(react@19.2.6)(scheduler@0.27.0) + '@effect/openapi-generator': specifier: 'catalog:' - version: 4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10) - '@ledgerhq/wallet-api-client': + version: 4.0.0-beta.65(@effect/platform-node@4.0.0-beta.65(effect@4.0.0-beta.65)(ioredis@5.10.1))(effect@4.0.0-beta.65) + '@effect/platform-node': specifier: 'catalog:' - version: 1.13.0 + version: 4.0.0-beta.65(effect@4.0.0-beta.65)(ioredis@5.10.1) '@lucas-barake/effect-form-react': specifier: 'catalog:' - version: 0.24.0(patch_hash=19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05)(effect@4.0.0-beta.65)(react@19.2.4) + version: 0.24.0(patch_hash=19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05)(@effect-atom/atom-react@0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(react@19.2.6)(scheduler@0.27.0))(@effect-atom/atom@0.5.3(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(react@19.2.6) '@reown/appkit': specifier: 'catalog:' - version: 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + version: 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(zod@3.25.76) '@reown/appkit-adapter-wagmi': specifier: 'catalog:' - version: 1.8.18(9ee7863b275c29e516ad5604625576cd) + version: 1.8.19(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@types/react@19.2.14)(@wagmi/core@3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76))(wagmi@3.6.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@tanstack/query-core@5.100.9)(@tanstack/react-query@5.100.9(react@19.2.6))(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(zod@3.25.76) '@stakekit/common': specifier: 'catalog:' version: 0.0.61 '@tailwindcss/vite': specifier: 'catalog:' - version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.3.0(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) + '@tanstack/devtools-vite': + specifier: 'catalog:' + version: 0.6.0(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) '@tanstack/react-devtools': specifier: 'catalog:' - version: 0.9.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@5.0.10) + version: 0.10.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(solid-js@1.9.12) '@tanstack/react-query': specifier: 'catalog:' - version: 5.90.21(react@19.2.4) + version: 5.100.9(react@19.2.6) '@tanstack/react-router': specifier: 'catalog:' - version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-router-devtools': specifier: 'catalog:' - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.168.9)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.166.13(@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.169.2)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-virtual': specifier: 'catalog:' - version: 3.13.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@yieldxyz/perps-common': - specifier: workspace:* - version: link:../common - class-variance-authority: - specifier: 'catalog:' - version: 0.7.1 - clsx: - specifier: 'catalog:' - version: 2.1.1 - effect: - specifier: 'catalog:' - version: 4.0.0-beta.65 - lucide-react: - specifier: 'catalog:' - version: 0.564.0(react@19.2.4) - react: - specifier: 'catalog:' - version: 19.2.4 - react-dom: - specifier: 'catalog:' - version: 19.2.4(react@19.2.4) - sonner: - specifier: 'catalog:' - version: 2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - tailwind-merge: - specifier: 'catalog:' - version: 3.4.0 - tailwindcss: - specifier: 'catalog:' - version: 4.1.18 - tw-animate-css: - specifier: 'catalog:' - version: 1.4.0 - viem: - specifier: 'catalog:' - version: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - wagmi: - specifier: 'catalog:' - version: 3.4.3(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.4))(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - devDependencies: - '@effect/openapi-generator': - specifier: 'catalog:' - version: 4.0.0-beta.65(@effect/platform-node@4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10))(effect@4.0.0-beta.65) - '@tanstack/devtools-vite': - specifier: 'catalog:' - version: 0.5.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 3.13.24(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/router-cli': specifier: 'catalog:' - version: 1.166.25 + version: 1.166.43 '@tanstack/router-plugin': specifier: 'catalog:' - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 1.167.35(@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) '@types/node': specifier: 'catalog:' - version: 25.2.3 + version: 25.6.2 '@types/react': specifier: 'catalog:' version: 19.2.14 @@ -597,51 +629,93 @@ importers: version: 1.0.2 '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.18)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18) + version: 4.1.5(playwright@1.59.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))(vitest@4.1.5) + '@yieldxyz/perps-common': + specifier: workspace:* + version: link:../common babel-plugin-react-compiler: specifier: 'catalog:' version: 1.0.0 + class-variance-authority: + specifier: 'catalog:' + version: 0.7.1 + clsx: + specifier: 'catalog:' + version: 2.1.1 + effect: + specifier: 'catalog:' + version: 4.0.0-beta.65 jsdom: specifier: 'catalog:' - version: 28.0.0(@noble/hashes@2.0.1) + version: 29.1.1(@noble/hashes@2.2.0) + lucide-react: + specifier: 'catalog:' + version: 1.14.0(react@19.2.6) openapi-filter: specifier: 'catalog:' version: 3.2.3 + react: + specifier: 'catalog:' + version: 19.2.6 + react-dom: + specifier: 'catalog:' + version: 19.2.6(react@19.2.6) + sonner: + specifier: 'catalog:' + version: 2.0.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + tailwind-merge: + specifier: 'catalog:' + version: 3.5.0 + tailwindcss: + specifier: 'catalog:' + version: 4.3.0 tsx: specifier: 'catalog:' version: 4.21.0 + tw-animate-css: + specifier: 'catalog:' + version: 1.4.0 typescript: specifier: 'catalog:' - version: 5.9.3 + version: 6.0.3 + viem: + specifier: 'catalog:' + version: 2.48.11(typescript@6.0.3)(zod@3.25.76) vite: specifier: 'catalog:' - version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) + version: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) + version: 0.26.0(patch_hash=2f652eeb27eb59e7cd6a47bd85f51fe0133a1fdcd7fac68c42e21c232383a67a)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) vitest: specifier: 'catalog:' - version: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) + version: 4.1.5(@types/node@25.6.2)(@vitest/browser-playwright@4.1.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) vitest-browser-react: specifier: 'catalog:' - version: 2.0.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18) + version: 2.2.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5) + wagmi: + specifier: 'catalog:' + version: 3.6.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@tanstack/query-core@5.100.9)(@tanstack/react-query@5.100.9(react@19.2.6))(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) packages: - '@acemir/cssom@0.9.31': - resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} - '@adraffy/ens-normalize@1.11.1': resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} - '@asamuzakjp/css-color@4.1.1': - resolution: {integrity: sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==} + '@asamuzakjp/css-color@5.1.11': + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@asamuzakjp/dom-selector@6.7.7': - resolution: {integrity: sha512-8CO/UQ4tzDd7ula+/CVimJIVWez99UJlbMyIgk8xOnhAVPKLnBZmUFYVgugS441v2ZqUq5EnSh6B0Ua0liSFAA==} + '@asamuzakjp/dom-selector@7.1.1': + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/generational-cache@1.0.1': + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} @@ -650,8 +724,8 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + '@babel/compat-data@7.29.3': + resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} engines: {node: '>=6.9.0'} '@babel/core@7.29.0': @@ -696,12 +770,12 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} engines: {node: '>=6.0.0'} hasBin: true @@ -717,20 +791,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} '@babel/template@7.28.6': @@ -752,19 +814,25 @@ packages: '@base-org/account@2.4.0': resolution: {integrity: sha512-A4Umpi8B9/pqR78D1Yoze4xHyQaujioVRqqO3d6xuDFw9VRtjg6tK3bPlwE0aW+nVH/ntllCpPa2PbI8Rnjcug==} - '@base-ui/react@1.2.0': - resolution: {integrity: sha512-O6aEQHcm+QyGTFY28xuwRD3SEJGZOBDpyjN2WvpfWYFVhg+3zfXPysAILqtM0C1kWC82MccOE/v1j+GHXE4qIw==} + '@base-ui/react@1.4.1': + resolution: {integrity: sha512-Ab5/LIhcmL8BQcsBUYiOfkSDRdLpvgUBzMK30cu684JPcLclYlztharvCZyNNgzJtbAiREzI9q0pI5erHCMgCw==} engines: {node: '>=14.0.0'} peerDependencies: + '@date-fns/tz': ^1.2.0 '@types/react': ^17 || ^18 || ^19 + date-fns: ^4.0.0 react: ^17 || ^18 || ^19 react-dom: ^17 || ^18 || ^19 peerDependenciesMeta: + '@date-fns/tz': + optional: true '@types/react': optional: true + date-fns: + optional: true - '@base-ui/utils@0.2.5': - resolution: {integrity: sha512-oYC7w0gp76RI5MxprlGLV0wze0SErZaRl3AAkeP3OnNB/UBMb6RqNf6ZSIlxOc9Qp68Ab3C2VOcJQyRs7Xc7Vw==} + '@base-ui/utils@0.2.8': + resolution: {integrity: sha512-jvOi+c+ftGlGotNcKnzPVg2IhCaDTB6/6R3JeqdjdXktuAJi3wKH9T7+svuaKh1mmfVU11UWzUZVH74JDfi/wQ==} peerDependencies: '@types/react': ^17 || ^18 || ^19 react: ^17 || ^18 || ^19 @@ -773,168 +841,207 @@ packages: '@types/react': optional: true - '@biomejs/biome@2.3.15': - resolution: {integrity: sha512-u+jlPBAU2B45LDkjjNNYpc1PvqrM/co4loNommS9/sl9oSxsAQKsNZejYuUztvToB5oXi1tN/e62iNd6ESiY3g==} + '@biomejs/biome@2.4.14': + resolution: {integrity: sha512-TmAvxOEgrpLypzVGJ8FulIZnlyA9TxrO1hyqYrCz9r+bwma9xXxuLA5IuYnj55XQneFx460KjRbx6SWGLkg3bQ==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.3.15': - resolution: {integrity: sha512-SDCdrJ4COim1r8SNHg19oqT50JfkI/xGZHSyC6mGzMfKrpNe/217Eq6y98XhNTc0vGWDjznSDNXdUc6Kg24jbw==} + '@biomejs/cli-darwin-arm64@2.4.14': + resolution: {integrity: sha512-XvgoE9XOawUOQPdmvs4J7wPhi/DLwSCGks3AlPJDmh34O0awRTqCED1HRcRDdpf1Zrp4us4MGOOdIxNpbqNF5Q==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.3.15': - resolution: {integrity: sha512-RkyeSosBtn3C3Un8zQnl9upX0Qbq4E3QmBa0qjpOh1MebRbHhNlRC16jk8HdTe/9ym5zlfnpbb8cKXzW+vlTxw==} + '@biomejs/cli-darwin-x64@2.4.14': + resolution: {integrity: sha512-jE7hKBCFhOx3uUh+ZkWBfOHxAcILPfhFplNkuID/eZeSTLHzfZzoZxW8fbqY9xXRnPi7jGNAf1iPVR+0yWsM/Q==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.3.15': - resolution: {integrity: sha512-SSSIj2yMkFdSkXqASzIBdjySBXOe65RJlhKEDlri7MN19RC4cpez+C0kEwPrhXOTgJbwQR9QH1F4+VnHkC35pg==} + '@biomejs/cli-linux-arm64-musl@2.4.14': + resolution: {integrity: sha512-/z+6gqAqqUQTHazwStxSXKHg9b8UvqBmDFRp+c4wYbq2KXhELQDon9EoC9RpmQ8JWkqQx/lIUy/cs+MhzDZp6A==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.3.15': - resolution: {integrity: sha512-FN83KxrdVWANOn5tDmW6UBC0grojchbGmcEz6JkRs2YY6DY63sTZhwkQ56x6YtKhDVV1Unz7FJexy8o7KwuIhg==} + '@biomejs/cli-linux-arm64@2.4.14': + resolution: {integrity: sha512-2TELhZnW5RSLL063l9rc5xLpA0ZIw0Ccwy/0q384rvNAgFw3yI76bd59547yxowdQr5MNPET/xDLrLuvgSeeWQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.3.15': - resolution: {integrity: sha512-dbjPzTh+ijmmNwojFYbQNMFp332019ZDioBYAMMJj5Ux9d8MkM+u+J68SBJGVwVeSHMYj+T9504CoxEzQxrdNw==} + '@biomejs/cli-linux-x64-musl@2.4.14': + resolution: {integrity: sha512-R6BWgJdQOwW9ulJatuTVrQkjnODjqHZkKNOqb1sz++3Noe5LYd0i3PchnOBUCYAPHoPWHhjJqbdZlHEu0hpjdA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.3.15': - resolution: {integrity: sha512-T8n9p8aiIKOrAD7SwC7opiBM1LYGrE5G3OQRXWgbeo/merBk8m+uxJ1nOXMPzfYyFLfPlKF92QS06KN1UW+Zbg==} + '@biomejs/cli-linux-x64@2.4.14': + resolution: {integrity: sha512-zHrlQZDBDUz4OLAraYpWKcnLS6HOewBFWYOzY91d1ZjdqZwibOyb6BEu6WuWLugyo0P3riCmsbV9UqV1cSXwQg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.3.15': - resolution: {integrity: sha512-puMuenu/2brQdgqtQ7geNwQlNVxiABKEZJhMRX6AGWcmrMO8EObMXniFQywy2b81qmC+q+SDvlOpspNwz0WiOA==} + '@biomejs/cli-win32-arm64@2.4.14': + resolution: {integrity: sha512-M3EH5hqOI/F/FUA2u4xcLoUgmxd218mvuj/6JL7Hv2toQvr2/AdOvKSpGkoRuWFCtQPVa+ZqkEV3Q5xBA9+XSA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.3.15': - resolution: {integrity: sha512-kDZr/hgg+igo5Emi0LcjlgfkoGZtgIpJKhnvKTRmMBv6FF/3SDyEV4khBwqNebZIyMZTzvpca9sQNSXJ39pI2A==} + '@biomejs/cli-win32-x64@2.4.14': + resolution: {integrity: sha512-WL0EG5qE+EAKomGXbf2g6VnSKJhTL3tXC0QRzWRwA5VpjxNYa6H4P7ZWfymbGE4IhZZQi1KXQ2R0YjwInmz2fA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] + '@blazediff/core@1.9.1': + resolution: {integrity: sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==} + + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true + '@canvas/image-data@1.1.0': resolution: {integrity: sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==} - '@coinbase/cdp-sdk@1.44.0': - resolution: {integrity: sha512-0I5O1DzbchR91GAYQAU8lxx6q9DBvN0no9IBwrTKLHW8t5bABMg8dzQ/jrGRd6lr/QFJJW4L0ZSLGae5jsxGWw==} + '@coinbase/cdp-sdk@1.48.3': + resolution: {integrity: sha512-1fldOyJw/vjk42GsOCQ2pys/3r3LXHq8wZyhnt6OXkFfKirCjZiw966PT0vFcI/IzIQnhDgSeG7Tlt7kul3osg==} - '@commitlint/cli@20.4.1': - resolution: {integrity: sha512-uuFKKpc7OtQM+6SRqT+a4kV818o1pS+uvv/gsRhyX7g4x495jg+Q7P0+O9VNGyLXBYP0syksS7gMRDJKcekr6A==} - engines: {node: '>=v18'} + '@commitlint/cli@21.0.0': + resolution: {integrity: sha512-p3y2oC0G2R45zaadMwBxCiSesS8digi5RDplP3Zrfpzm7xIgrgAj0W4fGzONjpHyg8obDVJDU45g5txzeMcblg==} + engines: {node: '>=22.12.0'} hasBin: true - '@commitlint/config-conventional@20.4.1': - resolution: {integrity: sha512-0YUvIeBtpi86XriqrR+TCULVFiyYTIOEPjK7tTRMxjcBm1qlzb+kz7IF2WxL6Fq5DaundG8VO37BNgMkMTBwqA==} - engines: {node: '>=v18'} + '@commitlint/config-conventional@21.0.0': + resolution: {integrity: sha512-QJX/rPK4Yu3f5J4OCIBy5aXq2e0EEdwSDFZ3NQvFAXTm3gs12ipyZ+yjhZxm3hHn6DB8wuv3zhFTL1I2tYzUBA==} + engines: {node: '>=22.12.0'} - '@commitlint/config-validator@20.4.0': - resolution: {integrity: sha512-zShmKTF+sqyNOfAE0vKcqnpvVpG0YX8F9G/ZIQHI2CoKyK+PSdladXMSns400aZ5/QZs+0fN75B//3Q5CHw++w==} - engines: {node: '>=v18'} + '@commitlint/config-validator@21.0.0': + resolution: {integrity: sha512-v0UplTYryNUB463X5WrelzKq5/qyYm9/iUNk38S7ZLnd56Uuk2T9awhYKGlgD2/4L5YuN2gsKkyy4EHpRPPz2Q==} + engines: {node: '>=22.12.0'} - '@commitlint/ensure@20.4.1': - resolution: {integrity: sha512-WLQqaFx1pBooiVvBrA1YfJNFqZF8wS/YGOtr5RzApDbV9tQ52qT5VkTsY65hFTnXhW8PcDfZLaknfJTmPejmlw==} - engines: {node: '>=v18'} + '@commitlint/ensure@21.0.0': + resolution: {integrity: sha512-n+OYs0Ws9GKC2WlmAeLNoPz9CUg6n/ZyYMkFF8rJ0aMn2kDTDTG0VqK/2Dco0EB4fhuF3JPIllJmU9/LKTl4aw==} + engines: {node: '>=22.12.0'} - '@commitlint/execute-rule@20.0.0': - resolution: {integrity: sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==} - engines: {node: '>=v18'} + '@commitlint/execute-rule@21.0.0': + resolution: {integrity: sha512-3OhTq2gQX1tEheMsbDNqxfcNHsAM6g9cub9plf05I9jCxtbNfn8Y+mhClKyUwhX4dbtmC4OLZ9i+HNmoL1aksA==} + engines: {node: '>=22.12.0'} - '@commitlint/format@20.4.0': - resolution: {integrity: sha512-i3ki3WR0rgolFVX6r64poBHXM1t8qlFel1G1eCBvVgntE3fCJitmzSvH5JD/KVJN/snz6TfaX2CLdON7+s4WVQ==} - engines: {node: '>=v18'} + '@commitlint/format@21.0.0': + resolution: {integrity: sha512-RTfGSrueEgofs1piqwi42U05d85wfxiMH2ncMCZnltx1XqPR3N2S48oACBtTy4xRAhWlf5XlHkK2RaDzEQu3dA==} + engines: {node: '>=22.12.0'} - '@commitlint/is-ignored@20.4.1': - resolution: {integrity: sha512-In5EO4JR1lNsAv1oOBBO24V9ND1IqdAJDKZiEpdfjDl2HMasAcT7oA+5BKONv1pRoLG380DGPE2W2RIcUwdgLA==} - engines: {node: '>=v18'} + '@commitlint/is-ignored@21.0.0': + resolution: {integrity: sha512-K3SaaOTVY9VKhge7vl0R3ng7GENRzJQ9MPV43Tu53kAwEgSx/E0HF4US3AcVqdvlvsDUbF2yXvED95dhela83w==} + engines: {node: '>=22.12.0'} - '@commitlint/lint@20.4.1': - resolution: {integrity: sha512-g94LrGl/c6UhuhDQqNqU232aslLEN2vzc7MPfQTHzwzM4GHNnEAwVWWnh0zX8S5YXecuLXDwbCsoGwmpAgPWKA==} - engines: {node: '>=v18'} + '@commitlint/lint@21.0.0': + resolution: {integrity: sha512-dlUJA0Ka14R1YaR46JVRWE3m/8dOQAgE/D0heUfzYua5Jogtq/zzu2ITAIaB/u25DaKjtEO6kuvASzsFDyrPMw==} + engines: {node: '>=22.12.0'} - '@commitlint/load@20.4.0': - resolution: {integrity: sha512-Dauup/GfjwffBXRJUdlX/YRKfSVXsXZLnINXKz0VZkXdKDcaEILAi9oflHGbfydonJnJAbXEbF3nXPm9rm3G6A==} - engines: {node: '>=v18'} + '@commitlint/load@21.0.0': + resolution: {integrity: sha512-l0nBfO/20PKcJXHZqDIgh7kw/TWVVwn8zZJOkVGBK/ig/h328jBu9jK7OiDl2oZr5mLphmKGjYDR2ffEyb2lIA==} + engines: {node: '>=22.12.0'} - '@commitlint/message@20.4.0': - resolution: {integrity: sha512-B5lGtvHgiLAIsK5nLINzVW0bN5hXv+EW35sKhYHE8F7V9Uz1fR4tx3wt7mobA5UNhZKUNgB/+ldVMQE6IHZRyA==} - engines: {node: '>=v18'} + '@commitlint/message@21.0.0': + resolution: {integrity: sha512-+daU92JaOHhI2En9KcH+2mvZGJ6D4YSxb/32QDwqkOwSj1Vanjio8PbAqX7dneACdg6B7RgQ7i3mpyYZAws4nw==} + engines: {node: '>=22.12.0'} - '@commitlint/parse@20.4.1': - resolution: {integrity: sha512-XNtZjeRcFuAfUnhYrCY02+mpxwY4OmnvD3ETbVPs25xJFFz1nRo/25nHj+5eM+zTeRFvWFwD4GXWU2JEtoK1/w==} - engines: {node: '>=v18'} + '@commitlint/parse@21.0.0': + resolution: {integrity: sha512-1dbvFBcQK79aTbpc2QCrgEDc6/MMkQ0Mdz4gGmYkN4AHMnAK9HesSewTHqGTrW5mALrMlYSgcWyvKjloY2w19A==} + engines: {node: '>=22.12.0'} - '@commitlint/read@20.4.0': - resolution: {integrity: sha512-QfpFn6/I240ySEGv7YWqho4vxqtPpx40FS7kZZDjUJ+eHxu3azfhy7fFb5XzfTqVNp1hNoI3tEmiEPbDB44+cg==} - engines: {node: '>=v18'} + '@commitlint/read@21.0.0': + resolution: {integrity: sha512-8VKLKLl2vBSKoTMm1LwcySsyxrBeotnqcT5qJi9pPuPfqSapdAD870Ckgh79c41UFywL6kMqtiyY+kxtfcqZGg==} + engines: {node: '>=22.12.0'} - '@commitlint/resolve-extends@20.4.0': - resolution: {integrity: sha512-ay1KM8q0t+/OnlpqXJ+7gEFQNlUtSU5Gxr8GEwnVf2TPN3+ywc5DzL3JCxmpucqxfHBTFwfRMXxPRRnR5Ki20g==} - engines: {node: '>=v18'} + '@commitlint/resolve-extends@21.0.0': + resolution: {integrity: sha512-hrJYSZRpmecmSoxYrpuJ/1Q4J9JHt4AVVtr5/Ac6upLO/jJ1DnIm2AjD+38gru3KGOec4aHCVqETuWWLJhydWw==} + engines: {node: '>=22.12.0'} - '@commitlint/rules@20.4.1': - resolution: {integrity: sha512-WtqypKEPbQEuJwJS4aKs0OoJRBKz1HXPBC9wRtzVNH68FLhPWzxXlF09hpUXM9zdYTpm4vAdoTGkWiBgQ/vL0g==} - engines: {node: '>=v18'} + '@commitlint/rules@21.0.0': + resolution: {integrity: sha512-NgQhX1qENA+rbrMw5KKyvVZpZG4D/0wgK8Z4INtcwKbfKtVDFMbn0oNc/Rs8wdyBPBj7ue8Lo/GllUL2Mqjwkg==} + engines: {node: '>=22.12.0'} - '@commitlint/to-lines@20.0.0': - resolution: {integrity: sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==} - engines: {node: '>=v18'} + '@commitlint/to-lines@21.0.0': + resolution: {integrity: sha512-qMwvrJK/x3dPcXsIAtQAMKV5Q0wTioyqyHKR06vVN4wmBF4cCrrLq5x81FDeY3Ba+GWgDt0/P3Zw/IHGM8lwgg==} + engines: {node: '>=22.12.0'} - '@commitlint/top-level@20.4.0': - resolution: {integrity: sha512-NDzq8Q6jmFaIIBC/GG6n1OQEaHdmaAAYdrZRlMgW6glYWGZ+IeuXmiymDvQNXPc82mVxq2KiE3RVpcs+1OeDeA==} - engines: {node: '>=v18'} + '@commitlint/top-level@21.0.0': + resolution: {integrity: sha512-8jPqyWZueuN4hU6/ArKVsZ6i8xWtjIrbzHEOaLaTGUfjhhbZNBfXef/DGjzxy55hAv3yFNxHLINfI1bCJ0/MzA==} + engines: {node: '>=22.12.0'} - '@commitlint/types@20.4.0': - resolution: {integrity: sha512-aO5l99BQJ0X34ft8b0h7QFkQlqxC6e7ZPVmBKz13xM9O8obDaM1Cld4sQlJDXXU/VFuUzQ30mVtHjVz74TuStw==} - engines: {node: '>=v18'} + '@commitlint/types@21.0.0': + resolution: {integrity: sha512-6nEz+M7I90iix4sviA8NLwskOuyt0M98KUU2aYgiKbn46jMSxUm1l2ACtzRd9ec+y38aKyJhW4Fp6NW0z35kJQ==} + engines: {node: '>=22.12.0'} - '@csstools/color-helpers@5.1.0': - resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + '@conventional-changelog/git-client@2.7.0': + resolution: {integrity: sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==} engines: {node: '>=18'} + peerDependencies: + conventional-commits-filter: ^5.0.0 + conventional-commits-parser: ^6.4.0 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true - '@csstools/css-calc@2.1.4': - resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} - engines: {node: '>=18'} + '@csstools/color-helpers@6.0.2': + resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} + engines: {node: '>=20.19.0'} + + '@csstools/css-calc@3.2.0': + resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@3.1.0': - resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} - engines: {node: '>=18'} + '@csstools/css-color-parser@4.1.0': + resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-parser-algorithms@3.0.5': - resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} - engines: {node: '>=18'} + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.3': + resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true - '@csstools/css-syntax-patches-for-csstree@1.0.26': - resolution: {integrity: sha512-6boXK0KkzT5u5xOgF6TKB+CLq9SOpEGmkZw0g5n9/7yg85wab3UzSxB8TxhLJ31L4SGJ6BCFRw/iftTha1CJXA==} + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} - '@csstools/css-tokenizer@3.0.4': - resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} - engines: {node: '>=18'} + '@effect-atom/atom-react@0.5.0': + resolution: {integrity: sha512-aFfjWi4rEJCqfM12Oi36/EKaDm/W6n4/N6yM5vL0t/QozKhJhK05rQL/GY4XMxlH2eqkQ4ih8jBQa3Yyp0Fiqw==} + peerDependencies: + effect: ^3.19 + react: '>=18 <20' + scheduler: '*' + + '@effect-atom/atom@0.5.3': + resolution: {integrity: sha512-TRZv/i+YT3TtnN0oFORJqXdxSs1fc7lrJlH+1xZvDFyjC9hgoVnrcKbeZsDFmr6r0wYRqVo7U3IftxiQNjpNZA==} + peerDependencies: + '@effect/experimental': ^0.58.0 + '@effect/platform': ^0.94.2 + '@effect/rpc': ^0.73.0 + effect: ^3.19.15 '@effect/atom-react@4.0.0-beta.65': resolution: {integrity: sha512-QU8U4qXzMcPPd484px7SIFxyt7dybR7KcMqA6xilAvqRVE1O7wzOtayfejw/NPTKTFEvy94z8c1w53Wk6PcIaw==} @@ -943,6 +1050,19 @@ packages: react: ^19.2.4 scheduler: '*' + '@effect/experimental@0.58.0': + resolution: {integrity: sha512-IEP9sapjF6rFy5TkoqDPc86st/fnqUfjT7Xa3pWJrFGr1hzaMXHo+mWsYOZS9LAOVKnpHuVziDK97EP5qsCHVA==} + peerDependencies: + '@effect/platform': ^0.94.0 + effect: ^3.19.13 + ioredis: ^5 + lmdb: ^3 + peerDependenciesMeta: + ioredis: + optional: true + lmdb: + optional: true + '@effect/language-service@0.85.1': resolution: {integrity: sha512-EXnJjIy6zQ3nUO/MZ+ynWUb8B895KZPotd1++oTs9JjDkplwM7cb6zo8Zq2zU6piwq+KflO7amXbEfj1UMpHkw==} hasBin: true @@ -967,9 +1087,29 @@ packages: effect: ^4.0.0-beta.65 ioredis: ^5.7.0 + '@effect/platform@0.94.5': + resolution: {integrity: sha512-z05APUiDDPbodhTkH/RJqOLoCU11bU2IZLfcwLFrld03+ob1VeqRnELQlmueLIYm6NZifHAtjl32V+GRt34y4A==} + peerDependencies: + effect: ^3.19.17 + + '@effect/rpc@0.73.2': + resolution: {integrity: sha512-td7LHDgBOYKg+VgGWEelD8rSAmvjXz7am17vfxZROX5qIYuvH7drL/z4p5xQFadhHZ7DYdlFpqdO9ggc77OCIw==} + peerDependencies: + '@effect/platform': ^0.94.5 + effect: ^3.19.18 + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.8.1': resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@esbuild/aix-ppc64@0.27.2': resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} @@ -1126,8 +1266,8 @@ packages: cpu: [x64] os: [win32] - '@exodus/bytes@1.11.0': - resolution: {integrity: sha512-wO3vd8nsEHdumsXrjGO/v4p6irbg7hy9kvIeR6i2AwylZSk4HJdWgL0FNaVquW1+AweJcdvU1IEpuIWk/WaPnA==} + '@exodus/bytes@1.15.0': + resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 @@ -1138,20 +1278,20 @@ packages: '@exodus/schemasafe@1.3.0': resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} - '@floating-ui/core@1.7.4': - resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} - '@floating-ui/dom@1.7.5': - resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} - '@floating-ui/react-dom@2.1.7': - resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.10': - resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} @@ -1270,6 +1410,9 @@ packages: cpu: [x64] os: [win32] + '@ioredis/commands@1.5.1': + resolution: {integrity: sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1286,24 +1429,6 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@ledgerhq/devices@8.10.0': - resolution: {integrity: sha512-ytT66KI8MizFX6dGJKthOzPDw5uNRmmg+RaMta62jbFePKYqfXtYTp6Wc0ErTXaL8nFS3IujHENwKthPmsj6jw==} - - '@ledgerhq/errors@6.29.0': - resolution: {integrity: sha512-mmDsGN662zd0XGKyjzSKkg+5o1/l9pvV1HkVHtbzaydvHAtRypghmVoWMY9XAQDLXiUBXGIsLal84NgmGeuKWA==} - - '@ledgerhq/hw-transport@6.32.0': - resolution: {integrity: sha512-bf2nxzDQ21DV/bsmExfWI0tatoVeoqhu/ePWalD/nPgPnTn/ZIDq7VBU+TY5p0JZaE87NQwmRUAjm6C1Exe61A==} - - '@ledgerhq/logs@6.14.0': - resolution: {integrity: sha512-kJFu1+asWQmU9XlfR1RM3lYR76wuEoPyZvkI/CNjpft78BQr3+MMf3Nu77ABzcKFnhIcmAkOLlDQ6B8L6hDXHA==} - - '@ledgerhq/wallet-api-client@1.13.0': - resolution: {integrity: sha512-excbMcQG8CUX3CQz1mz7ZWLu3QHZAo4vHhl+VxvPTOxyLasx0rnIRLir+lPaoXqAEfh6yLc46ZIiC9Q3MbDVrw==} - - '@ledgerhq/wallet-api-core@1.28.0': - resolution: {integrity: sha512-bR+sp6DaRqOR6z8dGM3+yHkNDh1VMe0DMpFGa4Ur7BPSI8K2dulsryfjmnKho3le/gdJsQUpIZrvb4sf5oL3OQ==} - '@lit-labs/ssr-dom-shim@1.5.1': resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} @@ -1329,8 +1454,8 @@ packages: '@effect-atom/atom': ^0.5.0 effect: ^3.19.15 - '@msgpack/msgpack@3.1.2': - resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} + '@msgpack/msgpack@3.1.3': + resolution: {integrity: sha512-47XIizs9XZXvuJgoaJUIE2lFoID8ugvc0jzSHP+Ptfk8nTbnR8g788wv48N03Kx0UkAv559HWRQ3yzOgzlRNUA==} engines: {node: '>= 18'} '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': @@ -1363,14 +1488,20 @@ packages: cpu: [x64] os: [win32] - '@nktkas/hyperliquid@0.31.0': - resolution: {integrity: sha512-yK8f0ObhiX5jrK0kCLe5DXMNaG9gbJfvCFvIjYCumbo1L/EZcjHXbhVJ24rEWnw8OkWCS9zHcncJhspZQ7MTFg==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@nktkas/hyperliquid@0.32.2': + resolution: {integrity: sha512-0Wh/keNAgnfdA/cLmdJDDzTZq/CSoT3lL/eY+MzF9R5U10d5J6nin/sEaH5HA+9K8CIag36ZtZ9dCxDvYEb0nw==} engines: {node: '>=20.19.0'} hasBin: true - '@nktkas/rews@1.2.3': - resolution: {integrity: sha512-cpfcIlkUpYlbAI1cvfCTBCajWZfUM6gWyuCJXszECKxdetsU3vURKC8Sz//MDR6RWoULk9T48eJ+0agxT7yB1w==} - engines: {node: '>=20.19.0'} + '@nktkas/rews@2.1.1': + resolution: {integrity: sha512-jB1dy7lQY3ygin1k9FyOioUvPq1QxoolUPDYXd7y73uF6QE+ntbpbMj96nO5Akl8g/b86l6w6HnWo0V5nhR4+g==} + engines: {node: '>=18'} '@noble/ciphers@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} @@ -1388,13 +1519,6 @@ packages: resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@2.0.1': - resolution: {integrity: sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==} - engines: {node: '>= 20.19.0'} - - '@noble/hashes@1.1.5': - resolution: {integrity: sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==} - '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} @@ -1407,12 +1531,12 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} - '@noble/hashes@2.0.1': - resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} + '@noble/hashes@2.2.0': + resolution: {integrity: sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==} engines: {node: '>= 20.19.0'} - '@noble/secp256k1@1.7.1': - resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + '@oxc-project/types@0.128.0': + resolution: {integrity: sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==} '@phosphor-icons/webcomponents@2.1.5': resolution: {integrity: sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q==} @@ -1433,198 +1557,177 @@ packages: resolution: {integrity: sha512-y+xFx+Zz54Xhr8jUdnLENYnt7Y7GEDL6Q03ga7rTtX8DVwefX9H+hQEPgJp1nda7vdH+wJ9/HBVvyfBuW9x6rA==} engines: {node: '>=18.17.0', npm: '>=9.5.0'} - '@reown/appkit-adapter-wagmi@1.8.18': - resolution: {integrity: sha512-6FaSRG6I7GBFzqsLrVDs8369B9SgC3rw+zz+CEjfw4o+I1zeOoIt/MupO7dv1FkxM48wgeCrTD/hGSDPKv0vtw==} + '@reown/appkit-adapter-wagmi@1.8.19': + resolution: {integrity: sha512-KY2sbIXJDLlUVBAKdHBQ8KT8aQY67rWwW9aIz4XthRIt8WCjZQBEf4JGy/kd0LwRS78XSSpZcxDxEBarMPLpaA==} peerDependencies: '@wagmi/core': '>=2.21.2' viem: '>=2.45.0' wagmi: '>=2.19.5' - '@reown/appkit-common@1.8.18': - resolution: {integrity: sha512-IaEZ/t2NoQwt9rUJArwJmFzzhznFoV33bHuF9JpSg1tASqe2ibnzxEVU6lM+SfjiO5cjlW8r3tYhPkieEUxpYg==} - - '@reown/appkit-controllers@1.8.18': - resolution: {integrity: sha512-pUbq4tfA3Ca27KA6pmM0TEhWPCCHualo9z0WuiZxPgR0Daak3FelhpFM+eyNAAcz7OBbiLQmy+isnDXaVyN0Mg==} - - '@reown/appkit-pay@1.8.18': - resolution: {integrity: sha512-MjGYOJiT5ie2Ize0m/IbVoeA7009hasiAP/62uBgE47WicmVMRr6013d5VlKK6AN/RR63D3TVhkw7k5F8ZJ+Sg==} - - '@reown/appkit-polyfills@1.8.18': - resolution: {integrity: sha512-K0Uzrs0QjSZam1B0OZRCh3PfzJqeiZ2sVw9B0ln2qAVvAlNQ2Yt3MItA06j2IGwoS4YACf9vgWYgOjFVQfz4ZQ==} + '@reown/appkit-common@1.8.19': + resolution: {integrity: sha512-z5wDrYjUGY7YbM4b14NHVo54WKZ5++PQtGkcsXhiOP39yAVijubBQD8BfHs/Pu2fSFqnqLIFoCVvIEfNWWccRw==} - '@reown/appkit-scaffold-ui@1.8.18': - resolution: {integrity: sha512-//42qeCET6jMKzdvPRwuGVr3idsXRFbIHj75JnFln3LEveK6kgCew/KhRgKhMq3/zJ78l8NTqJFNd9yUvFFCVA==} + '@reown/appkit-controllers@1.8.19': + resolution: {integrity: sha512-JFNT8CfAVit9FJXh596Ye4U8A/oIapW+Y0KQqjB59DXyTCDZbxZDB32rULBQrSkZ6PufTEa239Dil4kABCQKtg==} - '@reown/appkit-ui@1.8.18': - resolution: {integrity: sha512-ozfZxfr9JZqiAgBbu4CAtjSjxmLQ4Ak8hT4G4IojB9ZiStGfw+VCJHeNC44oac5G4do4bfmOsDPcbbKpE6AbnQ==} + '@reown/appkit-pay@1.8.19': + resolution: {integrity: sha512-HO/tQT0TbTQO3eONxNNPJAOZAOzUiHvjM0Mty1rFFeRBH68auiqQxQi2YFNMs014gNkRN+cb84VYau7+MCC0fQ==} - '@reown/appkit-utils@1.8.18': - resolution: {integrity: sha512-wB49IwYrhon7ZnLIA70Af9E2zV2U3aUm8fZWDwnU9Sx8cagHCXoMPXt6/SH/plvU3EKgplkiOXqfwc7QmV5UEQ==} + '@reown/appkit-polyfills@1.8.19': + resolution: {integrity: sha512-PSoetRSuZg7f2YFPzdfs4BayQl51zcGqYr7frwOe6td0XEsspLrrVFn/zk5QFbFHZVsMdfRZ+TTunt84ozRdnQ==} - '@reown/appkit-wallet@1.8.18': - resolution: {integrity: sha512-1FWTkh269iBm2XzN0plHFIgIM1wMUmXrdeNmQK3NcJvGHpZ1YO1z2zFHTkWCPFVMZCHoQH28fcP6Aobq1FuFbA==} + '@reown/appkit-scaffold-ui@1.8.19': + resolution: {integrity: sha512-Ak767x0VzeDIXb0wbzkl19kx6udw7vkb1EU0SAweG3iKc9BunW87Rfcd48/YimzMZycJaYmlbtfmqQQDYs6Few==} - '@reown/appkit@1.8.18': - resolution: {integrity: sha512-NdLSO2HzFZzflLeik5QX0o6DQSk9wC+MbMp55jHFBJZCX99VNzO6EVtJ9OaQ4uHn58fEvkrM/NwdPomwVmg+LQ==} + '@reown/appkit-ui@1.8.19': + resolution: {integrity: sha512-fCAwW8yyyC3JcgKLBPvCtYuDGC4H8anO7u4LTaAXGEzdcU5H+IrCgNFSPNK7NuTSmgXm1TnoYxPxRFKNiNwFdA==} - '@rolldown/pluginutils@1.0.0-rc.3': - resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} - - '@rollup/plugin-inject@5.0.5': - resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} - engines: {node: '>=14.0.0'} + '@reown/appkit-utils@1.8.19': + resolution: {integrity: sha512-VQPgUMTFqoh4UD3EDZSw9wyMkyZsmIVmu8CdQ2FUxIuqYW4fLd0VIpkDeO64MMhSv8b0X8Vd6m4+eGcqSwlUAg==} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + valtio: 2.1.7 - '@rollup/pluginutils@5.3.0': - resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@reown/appkit-wallet@1.8.19': + resolution: {integrity: sha512-NVdIKceUhkXYtsG32925ctmVn0QJFNyDlr+mWheMLCEZ/IUPn+6aA53vTVaSUquhyeFxUXtrCOh3ln6v1tup5w==} - '@rollup/rollup-android-arm-eabi@4.57.1': - resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} - cpu: [arm] - os: [android] + '@reown/appkit@1.8.19': + resolution: {integrity: sha512-wB+xatkRbOy0AY1cZxxtcKzzPk3l3CTFulDbaISLVmZI6ZnQrOFuLnYc285zGsC6DB4d6bmwYUh89zcMLa4PvQ==} - '@rollup/rollup-android-arm64@4.57.1': - resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + '@rolldown/binding-android-arm64@1.0.0-rc.18': + resolution: {integrity: sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.57.1': - resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.18': + resolution: {integrity: sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.57.1': - resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + '@rolldown/binding-darwin-x64@1.0.0-rc.18': + resolution: {integrity: sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.57.1': - resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.57.1': - resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.18': + resolution: {integrity: sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': - resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': + resolution: {integrity: sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.57.1': - resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} - cpu: [arm] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-arm64-gnu@4.57.1': - resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': + resolution: {integrity: sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.57.1': - resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': + resolution: {integrity: sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.57.1': - resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} - cpu: [loong64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-loong64-musl@4.57.1': - resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} - cpu: [loong64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-ppc64-gnu@4.57.1': - resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-ppc64-musl@4.57.1': - resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': + resolution: {integrity: sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [musl] - - '@rollup/rollup-linux-riscv64-gnu@4.57.1': - resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} - cpu: [riscv64] - os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.57.1': - resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-s390x-gnu@4.57.1': - resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': + resolution: {integrity: sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.57.1': - resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': + resolution: {integrity: sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.57.1': - resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': + resolution: {integrity: sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.57.1': - resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.57.1': - resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': + resolution: {integrity: sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.57.1': - resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} - cpu: [arm64] - os: [win32] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': + resolution: {integrity: sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] - '@rollup/rollup-win32-ia32-msvc@4.57.1': - resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} - cpu: [ia32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': + resolution: {integrity: sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.57.1': - resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': + resolution: {integrity: sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.57.1': - resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} - cpu: [x64] - os: [win32] + '@rolldown/plugin-babel@0.2.3': + resolution: {integrity: sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==} + engines: {node: '>=22.12.0 || ^24.0.0'} + peerDependencies: + '@babel/core': ^7.29.0 || ^8.0.0-rc.1 + '@babel/plugin-transform-runtime': ^7.29.0 || ^8.0.0-rc.1 + '@babel/runtime': ^7.27.0 || ^8.0.0-rc.1 + rolldown: ^1.0.0-rc.5 + vite: ^8.0.0 + peerDependenciesMeta: + '@babel/plugin-transform-runtime': + optional: true + '@babel/runtime': + optional: true + vite: + optional: true + + '@rolldown/pluginutils@1.0.0-rc.18': + resolution: {integrity: sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==} + + '@rolldown/pluginutils@1.0.0-rc.7': + resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true '@safe-global/safe-apps-provider@0.18.6': resolution: {integrity: sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==} @@ -1635,19 +1738,25 @@ packages: '@safe-global/safe-gateway-typescript-sdk@3.23.1': resolution: {integrity: sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==} engines: {node: '>=16'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@scure/base@1.2.6': resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} - '@scure/base@2.0.0': - resolution: {integrity: sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==} - '@scure/bip32@1.7.0': resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@simple-libs/child-process-utils@1.0.2': + resolution: {integrity: sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==} + engines: {node: '>=18'} + + '@simple-libs/stream-utils@1.2.0': + resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} + engines: {node: '>=18'} + '@solana-program/system@0.10.0': resolution: {integrity: sha512-Go+LOEZmqmNlfr+Gjy5ZWAdY5HbYzk2RBewD9QinEU/bBSzpFfzqDRT55JjFRBGJUvMgf3C2vfXEGT4i8DSI4g==} peerDependencies: @@ -1685,16 +1794,6 @@ packages: typescript: optional: true - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - '@solana/codecs-core@5.5.1': resolution: {integrity: sha512-TgBt//bbKBct0t6/MpA8ElaOA3sa8eYVvR7LGslCZ84WiAwwjCY0lW/lOYsFHJQzwREMdUyuEyy5YWBKtdh8Rw==} engines: {node: '>=20.18.0'} @@ -1713,12 +1812,6 @@ packages: typescript: optional: true - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - '@solana/codecs-numbers@5.5.1': resolution: {integrity: sha512-rllMIZAHqmtvC0HO/dc/21wDuWaD0B8Ryv8o+YtsICQBuiL/0U4AGwH7Pi5GNFySYk0/crSuwfIqQFtmxNSPFw==} engines: {node: '>=20.18.0'} @@ -1749,13 +1842,6 @@ packages: typescript: optional: true - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - '@solana/errors@5.5.1': resolution: {integrity: sha512-vFO3p+S7HoyyrcAectnXbdsMfwUzY2zYFUc2DEe5BwpiE9J1IAxPBGjOWO6hL1bbYdBrlmjNx8DXCslqS+Kcmg==} engines: {node: '>=20.18.0'} @@ -2036,120 +2122,106 @@ packages: typescript: optional: true - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@solid-primitives/event-listener@2.4.3': - resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} + '@solid-primitives/event-listener@2.4.5': + resolution: {integrity: sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/keyboard@1.3.3': - resolution: {integrity: sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==} + '@solid-primitives/keyboard@1.3.5': + resolution: {integrity: sha512-sav+l+PL+74z3yaftVs7qd8c2SXkqzuxPOVibUe5wYMt+U5Hxp3V3XCPgBPN2I6cANjvoFtz0NiU8uHVLdi9FQ==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/resize-observer@2.1.3': - resolution: {integrity: sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==} + '@solid-primitives/resize-observer@2.1.5': + resolution: {integrity: sha512-AiyTknKcNBaKHbcSMuxtSNM8FjIuiSuFyFghdD0TcCMU9hKi9EmsC5pjfjDwxE+5EueB1a+T/34PLRI5vbBbKw==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/rootless@1.5.2': - resolution: {integrity: sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==} + '@solid-primitives/rootless@1.5.3': + resolution: {integrity: sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/static-store@0.1.2': - resolution: {integrity: sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==} + '@solid-primitives/static-store@0.1.3': + resolution: {integrity: sha512-uxez7SXnr5GiRnzqO2IEDjOJRIXaG+0LZLBizmUA1FwSi+hrpuMzVBwyk70m4prcl8X6FDDXUl9O8hSq8wHbBQ==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/utils@6.3.2': - resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==} + '@solid-primitives/utils@6.4.0': + resolution: {integrity: sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A==} peerDependencies: solid-js: ^1.6.12 - '@stacks/common@6.16.0': - resolution: {integrity: sha512-PnzvhrdGRMVZvxTulitlYafSK4l02gPCBBoI9QEoTqgSnv62oaOXhYAUUkTMFKxdHW1seVEwZsrahuXiZPIAwg==} - - '@stacks/network@6.17.0': - resolution: {integrity: sha512-numHbfKjwco/rbkGPOEz8+FcJ2nBnS/tdJ8R422Q70h3SiA9eqk9RjSzB8p4JP8yW1SZvW+eihADHfMpBuZyfw==} - - '@stacks/transactions@6.17.0': - resolution: {integrity: sha512-FUah2BRgV66ApLcEXGNGhwyFTRXqX5Zco3LpiM3essw8PF0NQlHwwdPgtDko5RfrJl3LhGXXe/30nwsfNnB3+g==} - '@stakekit/common@0.0.61': resolution: {integrity: sha512-NHaJ9Yq5ykjryWB/EIACcHvq5mUrqU5eNfMIcv9Ovadq0TOqfKAJSs8FcFQu6/p2zAHcFywJQUbNOunOsTR8xg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@swc/helpers@0.5.18': - resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} - - '@tailwindcss/node@4.1.18': - resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} - '@tailwindcss/oxide-android-arm64@4.1.18': - resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.18': - resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.18': - resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.18': - resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': - resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': - resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': - resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': - resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.1.18': - resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.1.18': - resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -2160,66 +2232,69 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': - resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': - resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.18': - resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} - engines: {node: '>= 10'} + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} - '@tailwindcss/vite@4.1.18': - resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} peerDependencies: - vite: ^5.2.0 || ^6 || ^7 + vite: ^5.2.0 || ^6 || ^7 || ^8 - '@tanstack/devtools-client@0.0.5': - resolution: {integrity: sha512-hsNDE3iu4frt9cC2ppn1mNRnLKo2uc1/1hXAyY9z4UYb+o40M2clFAhiFoo4HngjfGJDV3x18KVVIq7W4Un+zA==} + '@tanstack/devtools-client@0.0.6': + resolution: {integrity: sha512-f85ZJXJnDIFOoykG/BFIixuAevJovCvJF391LPs6YjBAPhGYC50NWlx1y4iF/UmK5/cCMx+/JqI5SBOz7FanQQ==} engines: {node: '>=18'} '@tanstack/devtools-event-bus@0.4.1': resolution: {integrity: sha512-cNnJ89Q021Zf883rlbBTfsaxTfi2r73/qejGtyTa7ksErF3hyDyAq1aTbo5crK9dAL7zSHh9viKY1BtMls1QOA==} engines: {node: '>=18'} - '@tanstack/devtools-event-client@0.4.0': - resolution: {integrity: sha512-RPfGuk2bDZgcu9bAJodvO2lnZeHuz4/71HjZ0bGb/SPg8+lyTA+RLSKQvo7fSmPSi8/vcH3aKQ8EM9ywf1olaw==} + '@tanstack/devtools-event-client@0.4.3': + resolution: {integrity: sha512-OZI6QyULw0FI0wjgmeYzCIfbgPsOEzwJtCpa69XrfLMtNXLGnz3d/dIabk7frg0TmHo+Ah49w5I4KC7Tufwsvw==} engines: {node: '>=18'} + hasBin: true - '@tanstack/devtools-ui@0.4.4': - resolution: {integrity: sha512-5xHXFyX3nom0UaNfiOM92o6ziaHjGo3mcSGe2HD5Xs8dWRZNpdZ0Smd0B9ddEhy0oB+gXyMzZgUJb9DmrZV0Mg==} + '@tanstack/devtools-ui@0.5.1': + resolution: {integrity: sha512-T9JjAdqMSnxsVO6AQykD5vhxPF4iFLKtbYxee/bU3OLlk446F5C1220GdCmhDSz7y4lx+m8AvIS0bq6zzvdDUA==} engines: {node: '>=18'} + peerDependencies: + solid-js: '>=1.9.7' - '@tanstack/devtools-vite@0.5.1': - resolution: {integrity: sha512-5dXxMznSxx8NNpO9IbDC011sIdvTVvsoLaLAxm69dgDAX0+2OB8gdXrQp8dnzeNMvszKCgRxI2cgr/pjPgmnNw==} + '@tanstack/devtools-vite@0.6.0': + resolution: {integrity: sha512-h0r0ct7zlrgjkhmn4QW6wRjgUXd4JMs+r7gtx+BXo9f5H9Y+jtUdtvC0rnZcPto6gw/9yMUq7yOmMK5qDWRExg==} engines: {node: '>=18'} + hasBin: true peerDependencies: - vite: ^6.0.0 || ^7.0.0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@tanstack/devtools@0.10.6': - resolution: {integrity: sha512-STB3pS49gPoe7UHgDshOMkWPXPZmezsQBLkCrh6l+mcsRs+/Jk1OvfVF8HspiMA1RTuNRkTeGXZDA8LoGWmxyQ==} + '@tanstack/devtools@0.11.2': + resolution: {integrity: sha512-K8+tsBx+ptTLqqd4dOF10B6laj1g+XYImqYZL9n0jBINGaT+sOf17PKV9pbBt8kdbZeIGsHaJ5OZWCyZoHqN4A==} engines: {node: '>=18'} - - '@tanstack/history@1.154.14': - resolution: {integrity: sha512-xyIfof8eHBuub1CkBnbKNKQXeRZC4dClhmzePHVOEel4G7lk/dW+TQ16da7CFdeNLv6u6Owf5VoBQxoo6DFTSA==} - engines: {node: '>=12'} + hasBin: true + peerDependencies: + solid-js: '>=1.9.7' '@tanstack/history@1.161.6': resolution: {integrity: sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==} engines: {node: '>=20.19'} - '@tanstack/query-core@5.90.20': - resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} + '@tanstack/query-core@5.100.9': + resolution: {integrity: sha512-SJSFw1S8+kQ0+knv/XGfrbocWoAlT7vDKsSImtLx3ZPQmEcR46hkDjLSvynSy25N8Ms4tIEini1FuBd5k7IscQ==} - '@tanstack/react-devtools@0.9.5': - resolution: {integrity: sha512-/YsSSobbWfSZ0khLZ5n4cz/isa8Ac21PAVdgrX0qOEkPkS6J63JTEgFR0Ch2n2ka511dm2pIEuTvCsL7WVu1XQ==} + '@tanstack/react-devtools@0.10.2': + resolution: {integrity: sha512-1BmZyxOrI5SqmRJ5MgkYZNNdnlLsJxQRI2YgorrAvcF2MxK6x5RcuStvD8+YlXoMw3JtNukPxoITirKAnKYDQA==} engines: {node: '>=18'} peerDependencies: '@types/react': '>=16.8' @@ -2227,82 +2302,73 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-query@5.90.21': - resolution: {integrity: sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==} + '@tanstack/react-query@5.100.9': + resolution: {integrity: sha512-Oa44XkaI3kCNN6ME0KByU3xT3SEUNOMfZpHxL6+wFoTm+OeUFYHKdeYVe0aOXlRDm/f15sgLwEt2HDorIdW8+A==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.159.5': - resolution: {integrity: sha512-IIyomu+ypWTxyoYT32mxamVmdTs7ZCGcTbdj7HVvtD3xp1lvo/bwRXj9oERENmb+OAPOaWF2doRYC/pmKjK5vg==} - engines: {node: '>=12'} + '@tanstack/react-router-devtools@1.166.13': + resolution: {integrity: sha512-6yKRFFJrEEOiGp5RAAuGCYsl81M4XAhJmLcu9PKj+HZle4A3dsP60lwHoqQYWHMK9nKKFkdXR+D8qxzxqtQbEA==} + engines: {node: '>=20.19'} peerDependencies: - '@tanstack/react-router': ^1.159.5 - '@tanstack/router-core': ^1.159.4 + '@tanstack/react-router': ^1.168.15 + '@tanstack/router-core': ^1.168.11 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' peerDependenciesMeta: '@tanstack/router-core': optional: true - '@tanstack/react-router@1.159.5': - resolution: {integrity: sha512-rVb0MtKzP5c0BkWIoFgWBiRAJHYSU3bhsEHbT0cRdRLmlJiw21Awb6VEjgYq3hJiEhowcKKm6J8AdRD/8oZ5dQ==} - engines: {node: '>=12'} + '@tanstack/react-router@1.169.2': + resolution: {integrity: sha512-OJM7Kguc7ERnweaNRWsyWgIKcl3z23rD1B4jaxjzd9RGdnzpt2HfrWa9rggbT0Hfzhfo4D2ZmsfoTme035tniQ==} + engines: {node: '>=20.19'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-store@0.8.0': - resolution: {integrity: sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==} + '@tanstack/react-store@0.9.3': + resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} 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/react-virtual@3.13.18': - resolution: {integrity: sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==} + '@tanstack/react-virtual@3.13.24': + resolution: {integrity: sha512-aIJvz5OSkhNIhZIpYivrxrPTKYsjW9Uzy+sP/mx0S3sev2HyvPb7xmjbYvokzEpfgYHy/HjzJ2zFAETuUfgCpg==} 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/router-cli@1.166.25': - resolution: {integrity: sha512-COkW3lKmVw2lDgw75zEmHzE1FaWMoHJQfuCGrAUrNnpkPIXwVQgIP0O3+COToELxbegPktXozEpYnGD0m9YoVg==} + '@tanstack/router-cli@1.166.43': + resolution: {integrity: sha512-XvKFA47F5KjL0R8PzUdkBQrVDPjSzE7FgWeKnYLVRGytDTlZOJhgVzoznITdiAsNe9KPe93xHE1z5h80hhOGWg==} engines: {node: '>=20.19'} hasBin: true - '@tanstack/router-core@1.159.4': - resolution: {integrity: sha512-MFzPH39ijNO83qJN3pe7x4iAlhZyqgao3sJIzv3SJ4Pnk12xMnzuDzIAQT/1WV6JolPQEcw0Wr4L5agF8yxoeg==} - engines: {node: '>=12'} - - '@tanstack/router-core@1.168.9': - resolution: {integrity: sha512-18oeEwEDyXOIuO1VBP9ACaK7tYHZUjynGDCoUh/5c/BNhia9vCJCp9O0LfhZXOorDc/PmLSgvmweFhVmIxF10g==} + '@tanstack/router-core@1.169.2': + resolution: {integrity: sha512-5sm0DJF1A7Mz+9gy4Gz/lLovNailK3yot4vYvz9MkBUPw26uLnhQiR8hSCYxucjE0wD6Mdlc5l+Z0/XTlZ7xHw==} engines: {node: '>=20.19'} - hasBin: true - '@tanstack/router-devtools-core@1.159.4': - resolution: {integrity: sha512-qMUeIv+6n1mZOcO2raCIbdOeDeMpJEmgm6oMs/nWEG61lYrzJYaCcpBTviAX0nRhSiQSUCX9cHiosUEA0e2HAw==} - engines: {node: '>=12'} + '@tanstack/router-devtools-core@1.167.3': + resolution: {integrity: sha512-fJ1VMhyQgnoashTrP763c2HRc9kofgF61L7Jb3F6eTHAmCKtGVx8BRtiFt37sr3U0P0jmaaiiSPGP6nT5JtVNg==} + engines: {node: '>=20.19'} peerDependencies: - '@tanstack/router-core': ^1.159.4 + '@tanstack/router-core': ^1.168.11 csstype: ^3.0.10 peerDependenciesMeta: csstype: optional: true - '@tanstack/router-generator@1.159.4': - resolution: {integrity: sha512-O8tICQoSuvK6vs3mvBdI3zVLFmYfj/AYDCX0a5msSADP/2S0GsgDDTB5ah731TqYCtjeNriaWz9iqst38cjF/Q==} - engines: {node: '>=12'} - - '@tanstack/router-generator@1.166.24': - resolution: {integrity: sha512-vdaGKwuH+r+DPe6R1mjk+TDDmDH6NTG7QqwxHqGEvOH4aGf9sPjhmRKNJZqQr8cPIbfp6u5lXyZ1TeDcSNMVEA==} + '@tanstack/router-generator@1.166.42': + resolution: {integrity: sha512-2qBWC0t78r6b3vI+AbnvCZcFAvbYBDlLuWZrTjQbcjUmwG3qyeQp983tJyDuj9wb5//adG1tgAGXZkJ3aDwdBg==} engines: {node: '>=20.19'} - '@tanstack/router-plugin@1.159.5': - resolution: {integrity: sha512-i2LR3WRaBOAZ1Uab5QBG9UxZIRJ3V56JVu890NysbuX15rgzRiL5yLAbfenOHdhaHy2+4joX35VICAHuVWy7Og==} - engines: {node: '>=12'} + '@tanstack/router-plugin@1.167.35': + resolution: {integrity: sha512-UAScU5VAzLYVY4FML/Cbc5S5TucT4I8Ata05yozGOe4ZfepTKRffA5xWLtD2N+ov5svdv0KTX/kqlZnYPe28mA==} + engines: {node: '>=20.19'} peerDependencies: - '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.159.5 - vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' - vite-plugin-solid: ^2.11.10 + '@rsbuild/core': '>=1.0.2 || ^2.0.0' + '@tanstack/react-router': ^1.169.2 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' + vite-plugin-solid: ^2.11.10 || ^3.0.0-0 webpack: '>=5.92.0' peerDependenciesMeta: '@rsbuild/core': @@ -2316,69 +2382,65 @@ packages: webpack: optional: true - '@tanstack/router-utils@1.158.0': - resolution: {integrity: sha512-qZ76eaLKU6Ae9iI/mc5zizBX149DXXZkBVVO3/QRIll79uKLJZHQlMKR++2ba7JsciBWz1pgpIBcCJPE9S0LVg==} - engines: {node: '>=12'} - - '@tanstack/router-utils@1.161.6': - resolution: {integrity: sha512-nRcYw+w2OEgK6VfjirYvGyPLOK+tZQz1jkYcmH5AjMamQ9PycnlxZF2aEZtPpNoUsaceX2bHptn6Ub5hGXqNvw==} + '@tanstack/router-utils@1.161.8': + resolution: {integrity: sha512-xyiLWEKjfBAVhauDSSjXxyf7s8elU6SM+V050sbkofvGmIIvkwPFtDsX7Gvwh14kBd6iCwAT+RiPvXTxAptY0Q==} engines: {node: '>=20.19'} - '@tanstack/store@0.8.0': - resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} - - '@tanstack/virtual-core@3.13.18': - resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==} + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} - '@tanstack/virtual-file-routes@1.154.7': - resolution: {integrity: sha512-cHHDnewHozgjpI+MIVp9tcib6lYEQK5MyUr0ChHpHFGBl8Xei55rohFK0I0ve/GKoHeioaK42Smd8OixPp6CTg==} - engines: {node: '>=12'} + '@tanstack/virtual-core@3.14.0': + resolution: {integrity: sha512-JLANqGy/D6k4Ujmh8Tr25lGimuOXNiaVyXaCAZS0W+1390sADdGnyUdSWNIfd49gebtIxGMij4IktRVzrdr12Q==} '@tanstack/virtual-file-routes@1.161.7': resolution: {integrity: sha512-olW33+Cn+bsCsZKPwEGhlkqS6w3M2slFv11JIobdnCFKMLG97oAI2kWKdx5/zsywTL8flpnoIgaZZPlQTFYhdQ==} engines: {node: '>=20.19'} hasBin: true - '@ton/core@0.62.1': - resolution: {integrity: sha512-RaEGBo9gCf6ZHyS8SKq1K53pswvYW9E5A6vwUuzFBTRX14g4qMDlB9F+fq4aBE5kN7XyVr8ScQtOJfQj41usCw==} - peerDependencies: - '@ton/crypto': '>=3.2.0' + '@turbo/darwin-64@2.9.12': + resolution: {integrity: sha512-eu3eFRmE9NjgZ0wPdRJ44l+LGSeIky+tz5ZQd8zQkw/Yqi+BM7wq+8nbabeoiVUcICi/IZweMOKl/MCmkrd1+g==} + cpu: [x64] + os: [darwin] - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@turbo/darwin-arm64@2.9.12': + resolution: {integrity: sha512-RUkAE404z/J8NsyrUosMcBaXT6M4bRFxTQrmkDQBLQVXaC8Jl0e9bMvYDSX0GW7Ffm2m3j9y7RXgR1foeUAM9w==} + cpu: [arm64] + os: [darwin] - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + '@turbo/linux-64@2.9.12': + resolution: {integrity: sha512-InIUtH7cw/vqXNX1Gr7QgWfmw3ct08pV5CpfdEOR48z2u2rzdmpIuk00B/Q2xCb0PMWtKgiMQynfuphmEuUyTQ==} + cpu: [x64] + os: [linux] - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@turbo/linux-arm64@2.9.12': + resolution: {integrity: sha512-lC6nD//Xh67fmJM0LKaLsg74Wry0aYrgMklpiNgCbUaMdPIOqj0A00iri3NU7Lb7pZHx8ViisgpeDKlpSgFUCA==} + cpu: [arm64] + os: [linux] - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@turbo/windows-64@2.9.12': + resolution: {integrity: sha512-conYri8VUl72JOdYnLDPYwzqbPcY5ECoHmo9FWoKznemhaAIilj4maHqs9Uar0aKfNoZIULniy+6iWaLtLO34A==} + cpu: [x64] + os: [win32] - '@types/bn.js@5.2.0': - resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + '@turbo/windows-arm64@2.9.12': + resolution: {integrity: sha512-XoR4bsg62/L/esRVcmoMESEiNZ36+YmyjYGLpoqk8nwMgXzzVjNOgX0lRSz5w/U/ajLGv3nhMsS0Q2QOdvp2AQ==} + cpu: [arm64] + os: [win32] + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@18.19.130': - resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - - '@types/node@25.2.3': - resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} + '@types/node@25.6.2': + resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} @@ -2391,12 +2453,6 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -2405,63 +2461,70 @@ packages: engines: {node: '>=16.14.0'} hasBin: true - '@vitejs/plugin-react@5.1.4': - resolution: {integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==} + '@vitejs/plugin-react@6.0.1': + resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true - '@vitest/browser-playwright@4.0.18': - resolution: {integrity: sha512-gfajTHVCiwpxRj1qh0Sh/5bbGLG4F/ZH/V9xvFVoFddpITfMta9YGow0W6ZpTTORv2vdJuz9TnrNSmjKvpOf4g==} + '@vitest/browser-playwright@4.1.5': + resolution: {integrity: sha512-CWy0lBQJq97nionyJJdnaU4961IXTl43a7UCu5nHy51IoKxAt6PVIJLo+76rVl7KOOgcWHNkG4kbJu/pW7knvA==} peerDependencies: playwright: '*' - vitest: 4.0.18 + vitest: 4.1.5 - '@vitest/browser@4.0.18': - resolution: {integrity: sha512-gVQqh7paBz3gC+ZdcCmNSWJMk70IUjDeVqi+5m5vYpEHsIwRgw3Y545jljtajhkekIpIp5Gg8oK7bctgY0E2Ng==} + '@vitest/browser@4.1.5': + resolution: {integrity: sha512-iCDGI8c4yg+xmjUg2VsygdAUSIIB4x5Rht/P68OXy1hPELKXHDkzh87lkuTcdYmemRChDkEpB426MmDjzC0ziA==} peerDependencies: - vitest: 4.0.18 + vitest: 4.1.5 - '@vitest/expect@4.0.18': - resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + '@vitest/expect@4.1.5': + resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} - '@vitest/mocker@4.0.18': - resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + '@vitest/mocker@4.1.5': + resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.0.18': - resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + '@vitest/pretty-format@4.1.5': + resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} - '@vitest/runner@4.0.18': - resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + '@vitest/runner@4.1.5': + resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} - '@vitest/snapshot@4.0.18': - resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + '@vitest/snapshot@4.1.5': + resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} - '@vitest/spy@4.0.18': - resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + '@vitest/spy@4.1.5': + resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} - '@vitest/utils@4.0.18': - resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + '@vitest/utils@4.1.5': + resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} - '@wagmi/connectors@7.1.7': - resolution: {integrity: sha512-KCnbx6jgfIT6U5/s7v66W/Pgf+FbRUt4RVtJcKQPemvawu2lvBd81+BtDc0zHWcIRnO0KJrYQiuudpzMep+jhw==} + '@wagmi/connectors@8.0.11': + resolution: {integrity: sha512-FELwiWAoRNty7D/TJtSoojjv7wmX/vCydSsXGkLPEJs7aQF8oTN6aoFcATY8dD4x47BpkF/pv3icX5pib5KSaQ==} peerDependencies: '@base-org/account': ^2.5.1 '@coinbase/wallet-sdk': ^4.3.6 - '@gemini-wallet/core': ~0.3.1 - '@metamask/sdk': ~0.33.1 + '@metamask/connect-evm': ^1.0.0 '@safe-global/safe-apps-provider': ~0.18.6 '@safe-global/safe-apps-sdk': ^9.1.0 - '@wagmi/core': 3.3.3 + '@wagmi/core': 3.4.9 '@walletconnect/ethereum-provider': ^2.21.1 + accounts: ~0.8.1 porto: ~0.2.35 typescript: '>=5.7.3' viem: 2.x @@ -2470,9 +2533,7 @@ packages: optional: true '@coinbase/wallet-sdk': optional: true - '@gemini-wallet/core': - optional: true - '@metamask/sdk': + '@metamask/connect-evm': optional: true '@safe-global/safe-apps-provider': optional: true @@ -2480,22 +2541,24 @@ packages: optional: true '@walletconnect/ethereum-provider': optional: true + accounts: + optional: true porto: optional: true typescript: optional: true - '@wagmi/core@3.3.3': - resolution: {integrity: sha512-Yg7fZgLDReh5TzCyFEHsaoDgk9FaQ0lAI+RSGYk7qFBs3SAnRXlHzc9NxEsv9E91JEzWaEzYI0WvgDFALT0Msw==} + '@wagmi/core@3.4.9': + resolution: {integrity: sha512-/0siD63iayC/gRR+PQs9Isbr5y57taw1Oubzn/NZ81TYkPNkjKe9cLu0myYNX8WB6/itBQdHTH7nwLznPDGTxw==} peerDependencies: '@tanstack/query-core': '>=5.0.0' - ox: '>=0.11.1' + accounts: ~0.8.1 typescript: '>=5.7.3' viem: 2.x peerDependenciesMeta: '@tanstack/query-core': optional: true - ox: + accounts: optional: true typescript: optional: true @@ -2508,8 +2571,8 @@ packages: resolution: {integrity: sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==} engines: {node: '>=16'} - '@walletconnect/core@2.23.2': - resolution: {integrity: sha512-KkaTELRu8t/mt3J9doCQ1fBGCbYsCNfpo2JpKdCwKQR7PVjVKeVpYQK/blVkA5m6uLPpBtVRbOMKjnHW1m7JLw==} + '@walletconnect/core@2.23.7': + resolution: {integrity: sha512-yTyymn9mFaDZkUfLfZ3E9VyaSDPeHAXlrPxQRmNx2zFsEt/25GmTU2A848aomimLxZnAG2jNLhxbJ8I0gyNV+w==} engines: {node: '>=18.20.8'} '@walletconnect/environment@1.0.1': @@ -2556,20 +2619,20 @@ packages: '@walletconnect/safe-json@1.0.2': resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} - '@walletconnect/sign-client@2.23.2': - resolution: {integrity: sha512-LL5KgmJHvY5NqQn+ZHQJLia1p6fpUWXHtiG97S5rNfyuPx6gT/Jkkwqc2LwdmAjFkr61t8zTagHC9ETq203mNA==} + '@walletconnect/sign-client@2.23.7': + resolution: {integrity: sha512-SX61lzb1bTl/LijlcHQttnoHPBzzoY5mW9ArR6qhFtDNDTS7yr2rcH7rCngxHlYeb4rAYcWLHgbiGSrdKxl/mg==} '@walletconnect/time@1.0.2': resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} - '@walletconnect/types@2.23.2': - resolution: {integrity: sha512-5dxBCdUM+4Dqe1/A7uqkm2tWPXce4UUGSr+ImfI0YjwEExQS8+TzdOlhMt3n32ncnBCllU5paG+fsndT06R0iw==} + '@walletconnect/types@2.23.7': + resolution: {integrity: sha512-6PAKK+iR2IntmlkCFLMAHjYeIaerCJJYRDmdRimhon0u+aNmQT+HyGM6zxDAth0rdpBD7qEvKP5IXZTE7KFUhw==} - '@walletconnect/universal-provider@2.23.2': - resolution: {integrity: sha512-vs9iorPUAiVesFJ95O6XvLjmRgF+B2TspxJNL90ZULbrkRw4JFsmaRdb965PZKc+s182k1MkS/MQ0o964xRcEw==} + '@walletconnect/universal-provider@2.23.7': + resolution: {integrity: sha512-6UicU/Mhr/1bh7MNoajypz7BhigORbHpP1LFTf8FYLQGDqzmqHMqmMH2GDAImtaY2sFTi2jBvc22tLl8VMze/A==} - '@walletconnect/utils@2.23.2': - resolution: {integrity: sha512-ReSjU3kX+3i3tYJQZbVfetY5SSUL+iM6uiIVVD1PJalePa/5A40VgLVRTF7sDCJTIFfpf3Mt4bFjeaYuoxWtIw==} + '@walletconnect/utils@2.23.7': + resolution: {integrity: sha512-3p38gNrkVcIiQixVrlsWSa66Gjs5PqHOug2TxDgYUVBW5NcKjwQA08GkC6CKBQUfr5iaCtbfy6uZJW1LKSIvWQ==} '@walletconnect/window-getters@1.0.1': resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} @@ -2599,21 +2662,23 @@ packages: zod: optional: true - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true + abitype@1.2.4: + resolution: {integrity: sha512-dpKH+N27vRjarMVTFFkeY445VTKftzGWpL0FiT7xmVmzQRKazZexzC5uHG0f6XKsVLAuUlndnbGau6lRejClxg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -2623,10 +2688,18 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + ansis@4.2.0: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} @@ -2651,10 +2724,6 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -2671,8 +2740,8 @@ packages: peerDependencies: axios: 0.x || 1.x - axios@1.13.5: - resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} + axios@1.13.6: + resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==} babel-dead-code-elimination@1.0.12: resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} @@ -2683,20 +2752,15 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base-x@4.0.1: - resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} - base-x@5.0.1: resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.9.19: - resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + baseline-browser-mapping@2.10.28: + resolution: {integrity: sha512-Ic44hnOtFIgravCunj1ifSoQPSUrkNiJuH9Mf6jr2jjoA74icqV8wU0KuadXeOR8zuIJMOoTv0GuQjZ9ZYNMeA==} + engines: {node: '>=6.0.0'} hasBin: true bidi-js@1.0.3: @@ -2705,9 +2769,6 @@ packages: big.js@6.2.2: resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2715,14 +2776,11 @@ packages: blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} - bn.js@4.12.2: - resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + bn.js@4.12.3: + resolution: {integrity: sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==} - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + bn.js@5.2.3: + resolution: {integrity: sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==} brace-expansion@2.1.0: resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} @@ -2757,14 +2815,11 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - bs58@6.0.0: resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} @@ -2777,17 +2832,9 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bufferutil@4.1.0: - resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} - engines: {node: '>=6.14.2'} - builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - c32check@2.0.0: - resolution: {integrity: sha512-rpwfAcS/CMqo0oCqDf3r9eeLgScRE3l/xHDCXhM3UyrfvIn7PrLq63uHh7yYbv8NzaZn5MVsVhIRpQ+5GZ5HyA==} - engines: {node: '>=8'} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2796,8 +2843,8 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} engines: {node: '>= 0.4'} call-bound@1.0.4: @@ -2815,8 +2862,8 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - caniuse-lite@1.0.30001769: - resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} + caniuse-lite@1.0.30001792: + resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} @@ -2854,6 +2901,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -2862,6 +2913,10 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2890,13 +2945,6 @@ packages: resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} @@ -2910,41 +2958,41 @@ packages: constants-browserify@1.0.0: resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} - conventional-changelog-angular@8.1.0: - resolution: {integrity: sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==} + conventional-changelog-angular@8.3.1: + resolution: {integrity: sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==} engines: {node: '>=18'} - conventional-changelog-conventionalcommits@9.1.0: - resolution: {integrity: sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA==} + conventional-changelog-conventionalcommits@9.3.1: + resolution: {integrity: sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==} engines: {node: '>=18'} - conventional-commits-parser@6.2.1: - resolution: {integrity: sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==} + conventional-commits-parser@6.4.0: + resolution: {integrity: sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==} engines: {node: '>=18'} hasBin: true convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-es@1.2.2: - resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} - cookie-es@2.0.0: - resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + cookie-es@3.1.1: + resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cosmiconfig-typescript-loader@6.2.0: - resolution: {integrity: sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==} + cosmiconfig-typescript-loader@6.3.0: + resolution: {integrity: sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==} engines: {node: '>=v18'} peerDependencies: '@types/node': '*' cosmiconfig: '>=9' typescript: '>=5' - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + cosmiconfig@9.0.1: + resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -2977,21 +3025,13 @@ packages: resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} engines: {node: '>= 0.10'} - css-tree@3.1.0: - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - cssstyle@5.3.7: - resolution: {integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==} - engines: {node: '>=20'} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - data-urls@7.0.0: resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -2999,6 +3039,9 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -3034,14 +3077,17 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + des.js@1.1.0: resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} @@ -3055,8 +3101,8 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - diff@8.0.3: - resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} diffie-hellman@5.0.3: @@ -3080,25 +3126,28 @@ packages: effect@4.0.0-beta.65: resolution: {integrity: sha512-QYKvQPAj3CmtsvWkHQww15wX4KG2gNsszDWEcOO5sZCMknp66u6Si/Opmt3wwWCwsyvRmDAdIg+JIz5qzbbFIw==} - electron-to-chromium@1.5.286: - resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} + electron-to-chromium@1.5.353: + resolution: {integrity: sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} encode-utf8@1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} - enhanced-resolve@5.18.4: - resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + enhanced-resolve@5.21.2: + resolution: {integrity: sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==} engines: {node: '>=10.13.0'} - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} @@ -3115,8 +3164,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -3126,18 +3175,15 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-toolkit@1.39.3: - resolution: {integrity: sha512-Qb/TCFCldgOy8lZ5uC7nLGdqJwSabkQiYQShmw4jyiPk1pZzaYWTwaYKYP7EgLccWYgZocMrtItrwh683voaww==} + es-toolkit@1.44.0: + resolution: {integrity: sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==} + + es-toolkit@1.46.1: + resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - esbuild@0.27.2: resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} @@ -3147,11 +3193,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -3172,10 +3213,6 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - fast-check@4.7.0: resolution: {integrity: sha512-NsZRtqvSSoCP0HbNjUD+r1JH8zqZalyp6gLY9e7OYs7NK9b6AHOs2baBFeBG7bVNsuoukh89x2Yg3rPsul8ziQ==} engines: {node: '>=12.17.0'} @@ -3186,11 +3223,8 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -3216,8 +3250,8 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -3233,6 +3267,11 @@ packages: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3253,6 +3292,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -3264,18 +3307,18 @@ packages: get-tsconfig@4.13.0: resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} - git-raw-commits@4.0.0: - resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} - engines: {node: '>=16'} + git-raw-commits@5.0.1: + resolution: {integrity: sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==} + engines: {node: '>=18'} hasBin: true glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} + global-directory@5.0.0: + resolution: {integrity: sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==} + engines: {node: '>=20'} goober@2.1.18: resolution: {integrity: sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==} @@ -3289,8 +3332,8 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - h3@1.15.5: - resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -3314,8 +3357,8 @@ packages: hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} hmac-drbg@1.0.1: @@ -3325,10 +3368,6 @@ packages: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - http2-client@1.3.5: resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} @@ -3339,9 +3378,6 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -3363,9 +3399,6 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-meta-resolve@4.2.0: - resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - index-to-position@1.2.0: resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} engines: {node: '>=18'} @@ -3373,14 +3406,14 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ini@6.0.0: resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} engines: {node: ^20.17.0 || >=22.9.0} + ioredis@5.10.1: + resolution: {integrity: sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA==} + engines: {node: '>=12.22.0'} + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -3405,8 +3438,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-extglob@2.1.1: @@ -3462,35 +3495,29 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.35: - resolution: {integrity: sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg==} + isbot@5.1.40: + resolution: {integrity: sha512-yNeeynhhtIVRBk12tBV4eHNxwB42HzR4Q3Ea7vCOiJhImGaAIdIMrbJtacQlBizGLjUPw+akkFI5Dn9T70XoVQ==} engines: {node: '>=18'} isomorphic-timers-promises@1.0.1: resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} engines: {node: '>=10'} - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - isows@1.0.7: resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} peerDependencies: ws: '*' - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true - jose@6.1.3: - resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} js-levenshtein@1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} @@ -3503,9 +3530,9 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsdom@28.0.0: - resolution: {integrity: sha512-KDYJgZ6T2TKdU8yBfYueq5EPG/EylMsBvCaenWMJb2OXmjgczzwveRCoJ+Hgj1lXPDyasvrgneSn4GBuR1hYyA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + jsdom@29.1.1: + resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -3526,9 +3553,6 @@ packages: json-schema-typed@8.0.2: resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -3540,81 +3564,81 @@ packages: kubernetes-types@1.30.0: resolution: {integrity: sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q==} - launch-editor@2.12.0: - resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} + launch-editor@2.13.2: + resolution: {integrity: sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==} - lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.30.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.30.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.30.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.30.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.30.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.30.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.30.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.30.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.30.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.30.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.30.2: - resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} lines-and-columns@1.2.4: @@ -3637,40 +3661,21 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - - lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - - lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - - lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - - lru-cache@11.2.5: - resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} - engines: {node: 20 || >=22} - - lru-cache@11.2.6: - resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + lru-cache@11.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} engines: {node: 20 || >=22} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@0.564.0: - resolution: {integrity: sha512-JJ8GVTQqFwuliifD48U6+h7DXEHdkhJ/E87kksGByII3qHxtPciVb8T8woQONHBQgHVOl7rSMrrip3SeVNy7Fg==} + lucide-react@1.14.0: + resolution: {integrity: sha512-+1mdWcfSJVUsaTIjN9zoezmUhfXo5l0vP7ekBMPo3jcS/aIkxHnXqAPsByszMZx/Y8oQBRJxJx5xg+RH3urzxA==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3687,25 +3692,13 @@ packages: md5@2.3.0: resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} - mdn-data@2.12.2: - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - - meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} - micro-eth-signer@0.18.1: - resolution: {integrity: sha512-vXKhCZxrytpl+dXR9JeaE41ZVFndi7wCKc1Jd22smOMAeDErvRcXaTxhYUf1yQxis4n2kIdv/pH7iuf+5/cj+Q==} - engines: {node: '>= 20.19.0'} - - micro-packed@0.8.0: - resolution: {integrity: sha512-AKb8znIvg9sooythbXzyFeChEY0SkW0C6iXECpy/ls0e5BtwXO45J9wD9SLzBztnS4XmF/5kwZknsq+jyynd/A==} - engines: {node: '>= 20.19.0'} - miller-rabin@4.0.1: resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} hasBin: true @@ -3733,9 +3726,6 @@ packages: resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - mipd@0.0.7: resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} peerDependencies: @@ -3764,8 +3754,8 @@ packages: multipasta@0.2.7: resolution: {integrity: sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -3789,18 +3779,14 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - node-mock-http@1.0.4: resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} node-readfiles@0.2.0: resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} node-stdlib-browser@1.3.1: resolution: {integrity: sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==} @@ -3865,8 +3851,8 @@ packages: os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - ox@0.12.1: - resolution: {integrity: sha512-uU0llpthaaw4UJoXlseCyBHmQ3bLrQmz9rRLIAUHqv46uHuae9SE+ukYBRIPVCnlEnHKuWjDUcDFHWx9gbGNoA==} + ox@0.14.20: + resolution: {integrity: sha512-rby38C3nDn8eQkf29Zgw4hkCZJ64Qqi0zRPWL8ENUQ7JVuoITqrVtwWQgM/He19SCMUEc7hS/Sjw0jIOSLJhOw==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -3928,8 +3914,8 @@ packages: resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} - parse5@8.0.0: - resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -3951,12 +3937,12 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} pino-abstract-transport@2.0.0: @@ -3969,14 +3955,20 @@ packages: resolution: {integrity: sha512-eI9pKwWEix40kfvSzqEP6ldqOoBIN7dwD/o91TY5z8vQI12sAffpR/pOqAD1IVVwIVHDpHjkq0joBPdJD0rafA==} hasBin: true - pixelmatch@7.1.0: - resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} - hasBin: true - pkg-dir@5.0.0: resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} engines: {node: '>=10'} + playwright-core@1.59.1: + resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.59.1: + resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} + engines: {node: '>=18'} + hasBin: true + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -3993,15 +3985,15 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} preact@10.24.2: resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} hasBin: true @@ -4039,8 +4031,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + qs@6.15.1: + resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} quansync@1.0.0: @@ -4062,17 +4054,13 @@ packages: randomfill@1.0.4: resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} - react-dom@19.2.4: - resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + react-dom@19.2.6: + resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} peerDependencies: - react: ^19.2.4 + react: ^19.2.6 - react-refresh@0.18.0: - resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} - engines: {node: '>=0.10.0'} - - react@19.2.4: - resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + react@19.2.6: + resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} engines: {node: '>=0.10.0'} readable-stream@2.3.8: @@ -4094,9 +4082,13 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} - recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} - engines: {node: '>= 4'} + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} reftools@1.1.9: resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} @@ -4126,8 +4118,8 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} hasBin: true @@ -4135,17 +4127,11 @@ packages: resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} engines: {node: '>= 0.8'} - rollup@4.57.1: - resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + rolldown@1.0.0-rc.18: + resolution: {integrity: sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rpc-websockets@9.3.3: - resolution: {integrity: sha512-OkCsBBzrwxX4DoSv4Zlf9DgXKRB0MzVfCFg5MC+fNnf9ktr4SMWjsri0VNZQlDbCnGcImT6KNEv4ZoxktQhdpA==} - - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -4181,14 +4167,19 @@ packages: engines: {node: '>=10'} hasBin: true - seroval-plugins@1.5.0: - resolution: {integrity: sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA==} + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} + engines: {node: '>=10'} + hasBin: true + + seroval-plugins@1.5.4: + resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 - seroval@1.5.0: - resolution: {integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==} + seroval@1.5.4: + resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} engines: {node: '>=10'} set-blocking@2.0.0: @@ -4235,8 +4226,8 @@ packages: should@13.2.3: resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} side-channel-map@1.0.1: @@ -4264,8 +4255,8 @@ packages: slow-redact@0.3.2: resolution: {integrity: sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==} - solid-js@1.9.11: - resolution: {integrity: sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==} + solid-js@1.9.12: + resolution: {integrity: sha512-QzKaSJq2/iDrWR1As6MHZQ8fQkdOBf8GReYb7L5iKwMGceg7HxDcaOHk0at66tNgn9U2U7dXo8ZZpLIAmGMzgw==} sonic-boom@4.2.1: resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} @@ -4280,14 +4271,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -4295,25 +4278,26 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - stream-http@3.2.0: resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -4324,9 +4308,9 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} supports-color@10.2.2: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} @@ -4343,22 +4327,16 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tabbable@6.4.0: - resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} - - tailwind-merge@3.4.0: - resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + tailwind-merge@3.5.0: + resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} - tailwindcss@4.1.18: - resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} @@ -4366,32 +4344,26 @@ packages: resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} engines: {node: '>=0.6.0'} - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - - tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} engines: {node: '>=18'} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} - tinyrainbow@3.0.3: - resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} - tldts-core@7.0.22: - resolution: {integrity: sha512-KgbTDC5wzlL6j/x6np6wCnDSMUq4kucHNm00KXPbfNzmllCmtmvtykJHfmgdHntwIeupW04y8s1N/43S1PkQDw==} + tldts-core@7.0.30: + resolution: {integrity: sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==} - tldts@7.0.22: - resolution: {integrity: sha512-nqpKFC53CgopKPjT6Wfb6tpIcZXHcI6G37hesvikhx0EmUGPkZrujRyAjgnmp1SHNgpQfKVanZ+KfpANFt2Hxw==} + tldts@7.0.30: + resolution: {integrity: sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw==} hasBin: true to-buffer@1.2.2: @@ -4413,8 +4385,8 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tough-cookie@6.0.0: - resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + tough-cookie@6.0.1: + resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} tr46@0.0.3: @@ -4438,38 +4410,8 @@ packages: tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} - turbo-darwin-64@2.8.7: - resolution: {integrity: sha512-Xr4TO/oDDwoozbDtBvunb66g//WK8uHRygl72vUthuwzmiw48pil4IuoG/QbMHd9RE8aBnVmzC0WZEWk/WWt3A==} - cpu: [x64] - os: [darwin] - - turbo-darwin-arm64@2.8.7: - resolution: {integrity: sha512-p8Xbmb9kZEY/NoshQUcFmQdO80s2PCGoLYj5DbpxjZr3diknipXxzOK7pcmT7l2gNHaMCpFVWLkiFY9nO3EU5w==} - cpu: [arm64] - os: [darwin] - - turbo-linux-64@2.8.7: - resolution: {integrity: sha512-nwfEPAH3m5y/nJeYly3j1YJNYU2EG5+2ysZUxvBNM+VBV2LjQaLxB9CsEIpIOKuWKCjnFHKIADTSDPZ3D12J5Q==} - cpu: [x64] - os: [linux] - - turbo-linux-arm64@2.8.7: - resolution: {integrity: sha512-mgA/M6xiJzyxtXV70TtWGDPh+I6acOKmeQGtOzbFQZYEf794pu5jax26bCk5skAp1gqZu3vacPr6jhYHoHU9IQ==} - cpu: [arm64] - os: [linux] - - turbo-windows-64@2.8.7: - resolution: {integrity: sha512-sHTYMaXuCcyHnGUQgfUUt7S8407TWoP14zc/4N2tsM0wZNK6V9h4H2t5jQPtqKEb6Fg8313kygdDgEwuM4vsHg==} - cpu: [x64] - os: [win32] - - turbo-windows-arm64@2.8.7: - resolution: {integrity: sha512-WyGiOI2Zp3AhuzVagzQN+T+iq0fWx0oGxDfAWT3ZiLEd4U0cDUkwUZDKVGb3rKqPjDL6lWnuxKKu73ge5xtovQ==} - cpu: [arm64] - os: [win32] - - turbo@2.8.7: - resolution: {integrity: sha512-RBLh5caMAu1kFdTK1jgH2gH/z+jFsvX5rGbhgJ9nlIAWXSvxlzwId05uDlBA1+pBd3wO/UaKYzaQZQBXDd7kcA==} + turbo@2.9.12: + resolution: {integrity: sha512-lCPgus1NuTiBdaITWqzSH/Ff6HVL8HHGBtOXHg1dHRfcshN79XkygSdh0M6g8b0td91ILLG5MTkLOkp5UvyPJw==} hasBin: true tw-animate-css@1.4.0: @@ -4483,13 +4425,13 @@ packages: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true - ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} uint8arrays@3.1.1: resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} @@ -4503,29 +4445,26 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} - undici-types@7.21.0: - resolution: {integrity: sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==} + undici-types@7.25.0: + resolution: {integrity: sha512-AXNgS1Byr27fTI+2bsPEkV9CxkT8H6xNyRI68b3TatlZo3RkzlqQBLL+w7SmGPVpokjHbcuNVQUWE7FRTg+LRA==} - undici@7.20.0: - resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==} + undici@7.25.0: + resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} undici@8.2.0: resolution: {integrity: sha512-Z+4Hx9GE26Lh9Upwfnc8C7SsrpBPGaM/Gm6kMFtiG7c+5IvQKlXi/t+9x9DrrCh29cww5TSP9YdVaBcnLDs5fQ==} engines: {node: '>=22.19.0'} - unplugin@2.3.11: - resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} - engines: {node: '>=18.12.0'} + unplugin@3.0.0: + resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} + engines: {node: ^20.19.0 || >=22.12.0} - unstorage@1.17.4: - resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 @@ -4609,31 +4548,22 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - uuid@13.0.2: - resolution: {integrity: sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + uuid@11.1.1: + resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} hasBin: true - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + uuid@13.0.2: + resolution: {integrity: sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==} hasBin: true - valibot@1.2.0: - resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} + valibot@1.3.1: + resolution: {integrity: sha512-sfdRir/QFM0JaF22hqTroPc5xy4DimuGQVKFrzF1YfGwaS1nJot3Y8VqMdLO2Lg27fMzat2yD3pY5PbAYO39Gg==} peerDependencies: typescript: '>=5' peerDependenciesMeta: @@ -4652,28 +4582,29 @@ packages: react: optional: true - viem@2.45.3: - resolution: {integrity: sha512-axOD7rIbGiDHHA1MHKmpqqTz3CMCw7YpE/FVypddQMXL5i364VkNZh9JeEJH17NO484LaZUOMueo35IXyL76Mw==} + viem@2.48.11: + resolution: {integrity: sha512-+WZ5E0dBS6GtKb+1wEk5DeYRRRW42+pFnXCo67Ydodf42sBwO+hu3wnQy66lc4MKmHz+llPVdbyehYr9oTE2iw==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - vite-plugin-node-polyfills@0.25.0: - resolution: {integrity: sha512-rHZ324W3LhfGPxWwQb2N048TThB6nVvnipsqBUJEzh3R9xeK9KI3si+GMQxCuAcpPJBVf0LpDtJ+beYzB3/chg==} + vite-plugin-node-polyfills@0.26.0: + resolution: {integrity: sha512-BAe5YzJf368XGev02hDvioidx4uVH8dqEJlG73bjQSxM26/AQnGcKFomq9n3vGq5yqpSHKN4h1XQNxx9l98mBg==} peerDependencies: - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + vite@8.0.11: + resolution: {integrity: sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 - lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: '>=0.54.8' @@ -4684,12 +4615,14 @@ packages: peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -4705,8 +4638,8 @@ packages: yaml: optional: true - vitest-browser-react@2.0.5: - resolution: {integrity: sha512-YODQX8mHTJCyKNVYTWJrLEYrUtw+QfLl78owgvuE7C5ydgmGBq6v5s4jK2w6wdPhIZsN9PpV1rQbmAevWJjO9g==} + vitest-browser-react@2.2.0: + resolution: {integrity: sha512-oY3KM6305kwJMa6nHo92vVtkOsih7mjEf12dLKuphaF+9ywWPEc+qanIBd394SZ6m5LadVEaG6dicvvizOzmjA==} peerDependencies: '@types/react': ^18.0.0 || ^19.0.0 '@types/react-dom': ^18.0.0 || ^19.0.0 @@ -4719,20 +4652,23 @@ packages: '@types/react-dom': optional: true - vitest@4.0.18: - resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + vitest@4.1.5: + resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.18 - '@vitest/browser-preview': 4.0.18 - '@vitest/browser-webdriverio': 4.0.18 - '@vitest/ui': 4.0.18 + '@vitest/browser-playwright': 4.1.5 + '@vitest/browser-preview': 4.1.5 + '@vitest/browser-webdriverio': 4.1.5 + '@vitest/coverage-istanbul': 4.1.5 + '@vitest/coverage-v8': 4.1.5 + '@vitest/ui': 4.1.5 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -4746,6 +4682,10 @@ packages: optional: true '@vitest/browser-webdriverio': optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true '@vitest/ui': optional: true happy-dom: @@ -4760,8 +4700,8 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} - wagmi@3.4.3: - resolution: {integrity: sha512-g13P1O+1UmCHOi2qgY8Jx0y8xaMPTtgyQN036UQ9ktZtBKfM6GI3O4Ech1ENdlORsedD2Po7WxKw2Ay1FnpTSg==} + wagmi@3.6.11: + resolution: {integrity: sha512-dSNcPB4bGlRzNSzzFdFcTKDefJRNZZhVhY/R/fl/SV3+w/6hO2JS/dJRMSRuHr3xM3GyLC1P3FTe+3+l3sJMhA==} peerDependencies: '@tanstack/react-query': '>=5.0.0' react: '>=18' @@ -4785,8 +4725,8 @@ packages: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} - whatwg-url@16.0.0: - resolution: {integrity: sha512-9CcxtEKsf53UFwkSUZjG+9vydAsFO4lFHBpJUtjBcoJOCJpKnSJNwCw813zrYJHpCJ7sgfbtOe0V5Ku7Pa1XMQ==} + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} whatwg-url@5.0.0: @@ -4812,6 +4752,10 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -4836,18 +4780,6 @@ packages: utf-8-validate: optional: true - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.20.0: resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} @@ -4892,8 +4824,8 @@ packages: resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} engines: {node: '>= 14'} - yaml@2.9.0: - resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + yaml@2.8.4: + resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==} engines: {node: '>= 14.6'} hasBin: true @@ -4905,6 +4837,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -4913,6 +4849,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -4961,25 +4901,25 @@ packages: snapshots: - '@acemir/cssom@0.9.31': {} - '@adraffy/ens-normalize@1.11.1': {} - '@asamuzakjp/css-color@4.1.1': + '@asamuzakjp/css-color@5.1.11': dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - lru-cache: 11.2.5 + '@asamuzakjp/generational-cache': 1.0.1 + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@asamuzakjp/dom-selector@6.7.7': + '@asamuzakjp/dom-selector@7.1.1': dependencies: + '@asamuzakjp/generational-cache': 1.0.1 '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 - css-tree: 3.1.0 + css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.5 + + '@asamuzakjp/generational-cache@1.0.1': {} '@asamuzakjp/nwsapi@2.3.9': {} @@ -4989,7 +4929,7 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.0': {} + '@babel/compat-data@7.29.3': {} '@babel/core@7.29.0': dependencies: @@ -4997,8 +4937,8 @@ snapshots: '@babel/generator': 7.29.1 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.3 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -5013,7 +4953,7 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.3 '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -5021,9 +4961,9 @@ snapshots: '@babel/helper-compilation-targets@7.28.6': dependencies: - '@babel/compat-data': 7.29.0 + '@babel/compat-data': 7.29.3 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -5053,12 +4993,12 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.28.6': + '@babel/helpers@7.29.2': dependencies: '@babel/template': 7.28.6 '@babel/types': 7.29.0 - '@babel/parser@7.29.0': + '@babel/parser@7.29.3': dependencies: '@babel/types': 7.29.0 @@ -5072,22 +5012,12 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/runtime@7.28.6': {} + '@babel/runtime@7.29.2': {} '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.3 '@babel/types': 7.29.0 '@babel/traverse@7.29.0': @@ -5095,7 +5025,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.3 '@babel/template': 7.28.6 '@babel/types': 7.29.0 debug: 4.4.3(supports-color@10.2.2) @@ -5112,22 +5042,45 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@base-org/account@2.4.0(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': + '@base-org/account@2.4.0(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(zod@3.25.76)': dependencies: - '@coinbase/cdp-sdk': 1.44.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@coinbase/cdp-sdk': 1.48.3(typescript@6.0.3) '@noble/hashes': 1.4.0 clsx: 1.2.1 eventemitter3: 5.0.1 idb-keyval: 6.2.1 - ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) + ox: 0.6.9(typescript@6.0.3)(zod@3.25.76) preact: 10.24.2 - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zustand: 5.0.3(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) + zustand: 5.0.3(@types/react@19.2.14)(react@19.2.6)(use-sync-external-store@1.4.0(react@19.2.6)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - debug + - fastestsmallesttextencoderdecoder + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + optional: true + + '@base-org/account@2.4.0(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(zod@3.25.76)': + dependencies: + '@coinbase/cdp-sdk': 1.48.3(typescript@6.0.3) + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@6.0.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) + zustand: 5.0.3(@types/react@19.2.14)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)) transitivePeerDependencies: - '@types/react' - bufferutil - debug - - encoding - fastestsmallesttextencoderdecoder - immer - react @@ -5137,258 +5090,327 @@ snapshots: - zod optional: true - '@base-ui/react@1.2.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@base-ui/react@1.4.1(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@babel/runtime': 7.28.6 - '@base-ui/utils': 0.2.5(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@floating-ui/utils': 0.2.10 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - tabbable: 6.4.0 - use-sync-external-store: 1.6.0(react@19.2.4) + '@babel/runtime': 7.29.2 + '@base-ui/utils': 0.2.8(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@floating-ui/utils': 0.2.11 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + use-sync-external-store: 1.6.0(react@19.2.6) optionalDependencies: '@types/react': 19.2.14 - '@base-ui/utils@0.2.5(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@base-ui/utils@0.2.8(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@babel/runtime': 7.28.6 - '@floating-ui/utils': 0.2.10 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@babel/runtime': 7.29.2 + '@floating-ui/utils': 0.2.11 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) reselect: 5.1.1 - use-sync-external-store: 1.6.0(react@19.2.4) + use-sync-external-store: 1.6.0(react@19.2.6) optionalDependencies: '@types/react': 19.2.14 - '@biomejs/biome@2.3.15': + '@biomejs/biome@2.4.14': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.3.15 - '@biomejs/cli-darwin-x64': 2.3.15 - '@biomejs/cli-linux-arm64': 2.3.15 - '@biomejs/cli-linux-arm64-musl': 2.3.15 - '@biomejs/cli-linux-x64': 2.3.15 - '@biomejs/cli-linux-x64-musl': 2.3.15 - '@biomejs/cli-win32-arm64': 2.3.15 - '@biomejs/cli-win32-x64': 2.3.15 + '@biomejs/cli-darwin-arm64': 2.4.14 + '@biomejs/cli-darwin-x64': 2.4.14 + '@biomejs/cli-linux-arm64': 2.4.14 + '@biomejs/cli-linux-arm64-musl': 2.4.14 + '@biomejs/cli-linux-x64': 2.4.14 + '@biomejs/cli-linux-x64-musl': 2.4.14 + '@biomejs/cli-win32-arm64': 2.4.14 + '@biomejs/cli-win32-x64': 2.4.14 - '@biomejs/cli-darwin-arm64@2.3.15': + '@biomejs/cli-darwin-arm64@2.4.14': optional: true - '@biomejs/cli-darwin-x64@2.3.15': + '@biomejs/cli-darwin-x64@2.4.14': optional: true - '@biomejs/cli-linux-arm64-musl@2.3.15': + '@biomejs/cli-linux-arm64-musl@2.4.14': optional: true - '@biomejs/cli-linux-arm64@2.3.15': + '@biomejs/cli-linux-arm64@2.4.14': optional: true - '@biomejs/cli-linux-x64-musl@2.3.15': + '@biomejs/cli-linux-x64-musl@2.4.14': optional: true - '@biomejs/cli-linux-x64@2.3.15': + '@biomejs/cli-linux-x64@2.4.14': optional: true - '@biomejs/cli-win32-arm64@2.3.15': + '@biomejs/cli-win32-arm64@2.4.14': optional: true - '@biomejs/cli-win32-x64@2.3.15': + '@biomejs/cli-win32-x64@2.4.14': optional: true + '@blazediff/core@1.9.1': {} + + '@bramus/specificity@2.4.2': + dependencies: + css-tree: 3.2.1 + '@canvas/image-data@1.1.0': {} - '@coinbase/cdp-sdk@1.44.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@coinbase/cdp-sdk@1.48.3(typescript@6.0.3)': dependencies: - '@solana-program/system': 0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana-program/token': 0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - abitype: 1.0.6(typescript@5.9.3)(zod@3.25.76) - axios: 1.13.5 - axios-retry: 4.5.0(axios@1.13.5) - jose: 6.1.3 + '@solana-program/system': 0.10.0(@solana/kit@5.5.1(typescript@6.0.3)) + '@solana-program/token': 0.9.0(@solana/kit@5.5.1(typescript@6.0.3)) + '@solana/kit': 5.5.1(typescript@6.0.3) + abitype: 1.0.6(typescript@6.0.3)(zod@3.25.76) + axios: 1.13.6 + axios-retry: 4.5.0(axios@1.13.6) + bs58: 6.0.0 + jose: 6.2.3 md5: 2.3.0 uncrypto: 0.1.3 - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - bufferutil - debug - - encoding - fastestsmallesttextencoderdecoder - typescript - utf-8-validate optional: true - '@commitlint/cli@20.4.1(@types/node@25.2.3)(typescript@5.9.3)': + '@commitlint/cli@21.0.0(@types/node@25.6.2)(conventional-commits-parser@6.4.0)(typescript@6.0.3)': dependencies: - '@commitlint/format': 20.4.0 - '@commitlint/lint': 20.4.1 - '@commitlint/load': 20.4.0(@types/node@25.2.3)(typescript@5.9.3) - '@commitlint/read': 20.4.0 - '@commitlint/types': 20.4.0 - tinyexec: 1.0.2 - yargs: 17.7.2 + '@commitlint/format': 21.0.0 + '@commitlint/lint': 21.0.0 + '@commitlint/load': 21.0.0(@types/node@25.6.2)(typescript@6.0.3) + '@commitlint/read': 21.0.0(conventional-commits-parser@6.4.0) + '@commitlint/types': 21.0.0 + tinyexec: 1.1.2 + yargs: 18.0.0 transitivePeerDependencies: - '@types/node' + - conventional-commits-filter + - conventional-commits-parser - typescript - '@commitlint/config-conventional@20.4.1': + '@commitlint/config-conventional@21.0.0': dependencies: - '@commitlint/types': 20.4.0 - conventional-changelog-conventionalcommits: 9.1.0 + '@commitlint/types': 21.0.0 + conventional-changelog-conventionalcommits: 9.3.1 - '@commitlint/config-validator@20.4.0': + '@commitlint/config-validator@21.0.0': dependencies: - '@commitlint/types': 20.4.0 - ajv: 8.17.1 + '@commitlint/types': 21.0.0 + ajv: 8.20.0 - '@commitlint/ensure@20.4.1': + '@commitlint/ensure@21.0.0': dependencies: - '@commitlint/types': 20.4.0 - lodash.camelcase: 4.3.0 - lodash.kebabcase: 4.1.1 - lodash.snakecase: 4.1.1 - lodash.startcase: 4.4.0 - lodash.upperfirst: 4.3.1 + '@commitlint/types': 21.0.0 + es-toolkit: 1.46.1 - '@commitlint/execute-rule@20.0.0': {} + '@commitlint/execute-rule@21.0.0': {} - '@commitlint/format@20.4.0': + '@commitlint/format@21.0.0': dependencies: - '@commitlint/types': 20.4.0 + '@commitlint/types': 21.0.0 picocolors: 1.1.1 - '@commitlint/is-ignored@20.4.1': + '@commitlint/is-ignored@21.0.0': dependencies: - '@commitlint/types': 20.4.0 - semver: 7.7.3 + '@commitlint/types': 21.0.0 + semver: 7.8.0 - '@commitlint/lint@20.4.1': + '@commitlint/lint@21.0.0': dependencies: - '@commitlint/is-ignored': 20.4.1 - '@commitlint/parse': 20.4.1 - '@commitlint/rules': 20.4.1 - '@commitlint/types': 20.4.0 + '@commitlint/is-ignored': 21.0.0 + '@commitlint/parse': 21.0.0 + '@commitlint/rules': 21.0.0 + '@commitlint/types': 21.0.0 - '@commitlint/load@20.4.0(@types/node@25.2.3)(typescript@5.9.3)': + '@commitlint/load@21.0.0(@types/node@25.6.2)(typescript@6.0.3)': dependencies: - '@commitlint/config-validator': 20.4.0 - '@commitlint/execute-rule': 20.0.0 - '@commitlint/resolve-extends': 20.4.0 - '@commitlint/types': 20.4.0 - cosmiconfig: 9.0.0(typescript@5.9.3) - cosmiconfig-typescript-loader: 6.2.0(@types/node@25.2.3)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) + '@commitlint/config-validator': 21.0.0 + '@commitlint/execute-rule': 21.0.0 + '@commitlint/resolve-extends': 21.0.0 + '@commitlint/types': 21.0.0 + cosmiconfig: 9.0.1(typescript@6.0.3) + cosmiconfig-typescript-loader: 6.3.0(@types/node@25.6.2)(cosmiconfig@9.0.1(typescript@6.0.3))(typescript@6.0.3) + es-toolkit: 1.46.1 is-plain-obj: 4.1.0 - lodash.mergewith: 4.6.2 picocolors: 1.1.1 transitivePeerDependencies: - '@types/node' - typescript - '@commitlint/message@20.4.0': {} + '@commitlint/message@21.0.0': {} - '@commitlint/parse@20.4.1': + '@commitlint/parse@21.0.0': dependencies: - '@commitlint/types': 20.4.0 - conventional-changelog-angular: 8.1.0 - conventional-commits-parser: 6.2.1 + '@commitlint/types': 21.0.0 + conventional-changelog-angular: 8.3.1 + conventional-commits-parser: 6.4.0 - '@commitlint/read@20.4.0': + '@commitlint/read@21.0.0(conventional-commits-parser@6.4.0)': dependencies: - '@commitlint/top-level': 20.4.0 - '@commitlint/types': 20.4.0 - git-raw-commits: 4.0.0 - minimist: 1.2.8 - tinyexec: 1.0.2 + '@commitlint/top-level': 21.0.0 + '@commitlint/types': 21.0.0 + git-raw-commits: 5.0.1(conventional-commits-parser@6.4.0) + tinyexec: 1.1.2 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser - '@commitlint/resolve-extends@20.4.0': + '@commitlint/resolve-extends@21.0.0': dependencies: - '@commitlint/config-validator': 20.4.0 - '@commitlint/types': 20.4.0 - global-directory: 4.0.1 - import-meta-resolve: 4.2.0 - lodash.mergewith: 4.6.2 + '@commitlint/config-validator': 21.0.0 + '@commitlint/types': 21.0.0 + es-toolkit: 1.46.1 + global-directory: 5.0.0 resolve-from: 5.0.0 - '@commitlint/rules@20.4.1': + '@commitlint/rules@21.0.0': dependencies: - '@commitlint/ensure': 20.4.1 - '@commitlint/message': 20.4.0 - '@commitlint/to-lines': 20.0.0 - '@commitlint/types': 20.4.0 + '@commitlint/ensure': 21.0.0 + '@commitlint/message': 21.0.0 + '@commitlint/to-lines': 21.0.0 + '@commitlint/types': 21.0.0 - '@commitlint/to-lines@20.0.0': {} + '@commitlint/to-lines@21.0.0': {} - '@commitlint/top-level@20.4.0': + '@commitlint/top-level@21.0.0': dependencies: escalade: 3.2.0 - '@commitlint/types@20.4.0': + '@commitlint/types@21.0.0': dependencies: - conventional-commits-parser: 6.2.1 + conventional-commits-parser: 6.4.0 picocolors: 1.1.1 - '@csstools/color-helpers@5.1.0': {} + '@conventional-changelog/git-client@2.7.0(conventional-commits-parser@6.4.0)': + dependencies: + '@simple-libs/child-process-utils': 1.0.2 + '@simple-libs/stream-utils': 1.2.0 + semver: 7.8.0 + optionalDependencies: + conventional-commits-parser: 6.4.0 + + '@csstools/color-helpers@6.0.2': {} - '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/color-helpers': 5.1.0 - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 + '@csstools/color-helpers': 6.0.2 + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.26': {} + '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.0': {} + + '@effect-atom/atom-react@0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(react@19.2.6)(scheduler@0.27.0)': + dependencies: + '@effect-atom/atom': 0.5.3(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65) + effect: 4.0.0-beta.65 + react: 19.2.6 + scheduler: 0.27.0 + transitivePeerDependencies: + - '@effect/experimental' + - '@effect/platform' + - '@effect/rpc' - '@csstools/css-tokenizer@3.0.4': {} + '@effect-atom/atom@0.5.3(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)': + dependencies: + '@effect/experimental': 0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1) + '@effect/platform': 0.94.5(effect@4.0.0-beta.65) + '@effect/rpc': 0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65) + effect: 4.0.0-beta.65 - '@effect/atom-react@4.0.0-beta.65(effect@4.0.0-beta.65)(react@19.2.4)(scheduler@0.27.0)': + '@effect/atom-react@4.0.0-beta.65(effect@4.0.0-beta.65)(react@19.2.6)(scheduler@0.27.0)': dependencies: effect: 4.0.0-beta.65 - react: 19.2.4 + react: 19.2.6 scheduler: 0.27.0 + '@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1)': + dependencies: + '@effect/platform': 0.94.5(effect@4.0.0-beta.65) + effect: 4.0.0-beta.65 + uuid: 11.1.1 + optionalDependencies: + ioredis: 5.10.1 + '@effect/language-service@0.85.1': {} - '@effect/openapi-generator@4.0.0-beta.65(@effect/platform-node@4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10))(effect@4.0.0-beta.65)': + '@effect/openapi-generator@4.0.0-beta.65(@effect/platform-node@4.0.0-beta.65(effect@4.0.0-beta.65)(ioredis@5.10.1))(effect@4.0.0-beta.65)': dependencies: - '@effect/platform-node': 4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10) + '@effect/platform-node': 4.0.0-beta.65(effect@4.0.0-beta.65)(ioredis@5.10.1) effect: 4.0.0-beta.65 - '@effect/platform-node-shared@4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10)': + '@effect/platform-node-shared@4.0.0-beta.65(effect@4.0.0-beta.65)': dependencies: '@types/ws': 8.18.1 effect: 4.0.0-beta.65 - ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 8.20.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node@4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10)': + '@effect/platform-node@4.0.0-beta.65(effect@4.0.0-beta.65)(ioredis@5.10.1)': dependencies: - '@effect/platform-node-shared': 4.0.0-beta.65(bufferutil@4.1.0)(effect@4.0.0-beta.65)(utf-8-validate@5.0.10) + '@effect/platform-node-shared': 4.0.0-beta.65(effect@4.0.0-beta.65) effect: 4.0.0-beta.65 + ioredis: 5.10.1 mime: 4.1.0 undici: 8.2.0 transitivePeerDependencies: - bufferutil - utf-8-validate + '@effect/platform@0.94.5(effect@4.0.0-beta.65)': + dependencies: + effect: 4.0.0-beta.65 + find-my-way-ts: 0.1.6 + msgpackr: 1.11.12 + multipasta: 0.2.7 + + '@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)': + dependencies: + '@effect/platform': 0.94.5(effect@4.0.0-beta.65) + effect: 4.0.0-beta.65 + msgpackr: 1.11.12 + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.27.2': optional: true @@ -5467,28 +5489,28 @@ snapshots: '@esbuild/win32-x64@0.27.2': optional: true - '@exodus/bytes@1.11.0(@noble/hashes@2.0.1)': + '@exodus/bytes@1.15.0(@noble/hashes@2.2.0)': optionalDependencies: - '@noble/hashes': 2.0.1 + '@noble/hashes': 2.2.0 '@exodus/schemasafe@1.3.0': {} - '@floating-ui/core@1.7.4': + '@floating-ui/core@1.7.5': dependencies: - '@floating-ui/utils': 0.2.10 + '@floating-ui/utils': 0.2.11 - '@floating-ui/dom@1.7.5': + '@floating-ui/dom@1.7.6': dependencies: - '@floating-ui/core': 1.7.4 - '@floating-ui/utils': 0.2.10 + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 - '@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@floating-ui/react-dom@2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@floating-ui/dom': 1.7.5 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@floating-ui/dom': 1.7.6 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) - '@floating-ui/utils@0.2.10': {} + '@floating-ui/utils@0.2.11': {} '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: @@ -5565,6 +5587,8 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@ioredis/commands@1.5.1': {} + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -5584,45 +5608,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@ledgerhq/devices@8.10.0': - dependencies: - '@ledgerhq/errors': 6.29.0 - '@ledgerhq/logs': 6.14.0 - rxjs: 7.8.2 - semver: 7.7.3 - - '@ledgerhq/errors@6.29.0': {} - - '@ledgerhq/hw-transport@6.32.0': - dependencies: - '@ledgerhq/devices': 8.10.0 - '@ledgerhq/errors': 6.29.0 - '@ledgerhq/logs': 6.14.0 - events: 3.3.0 - - '@ledgerhq/logs@6.14.0': {} - - '@ledgerhq/wallet-api-client@1.13.0': - dependencies: - '@ledgerhq/hw-transport': 6.32.0 - '@ledgerhq/wallet-api-core': 1.28.0 - bignumber.js: 9.3.1 - transitivePeerDependencies: - - '@ton/crypto' - - encoding - - '@ledgerhq/wallet-api-core@1.28.0': - dependencies: - '@ledgerhq/errors': 6.29.0 - '@stacks/transactions': 6.17.0 - '@ton/core': 0.62.1 - bignumber.js: 9.3.1 - uuid: 9.0.1 - zod: 3.25.76 - transitivePeerDependencies: - - '@ton/crypto' - - encoding - '@lit-labs/ssr-dom-shim@1.5.1': {} '@lit/react@1.0.8(@types/react@19.2.14)': @@ -5634,17 +5619,20 @@ snapshots: dependencies: '@lit-labs/ssr-dom-shim': 1.5.1 - '@lucas-barake/effect-form-react@0.24.0(patch_hash=19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05)(effect@4.0.0-beta.65)(react@19.2.4)': + '@lucas-barake/effect-form-react@0.24.0(patch_hash=19c0ff14a2aebc29aae100b27c5f4b79b5028608884ec77182804f7f1560ad05)(@effect-atom/atom-react@0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(react@19.2.6)(scheduler@0.27.0))(@effect-atom/atom@0.5.3(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(react@19.2.6)': dependencies: - '@lucas-barake/effect-form': 0.23.0(patch_hash=4f4cbbb31f1466c5d108c52532d9dd5b21ce6cff1d6b86b2d96d8eb4e9dbe863)(effect@4.0.0-beta.65) + '@effect-atom/atom': 0.5.3(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65) + '@effect-atom/atom-react': 0.5.0(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(react@19.2.6)(scheduler@0.27.0) + '@lucas-barake/effect-form': 0.23.0(patch_hash=4f4cbbb31f1466c5d108c52532d9dd5b21ce6cff1d6b86b2d96d8eb4e9dbe863)(@effect-atom/atom@0.5.3(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65) effect: 4.0.0-beta.65 - react: 19.2.4 + react: 19.2.6 - '@lucas-barake/effect-form@0.23.0(patch_hash=4f4cbbb31f1466c5d108c52532d9dd5b21ce6cff1d6b86b2d96d8eb4e9dbe863)(effect@4.0.0-beta.65)': + '@lucas-barake/effect-form@0.23.0(patch_hash=4f4cbbb31f1466c5d108c52532d9dd5b21ce6cff1d6b86b2d96d8eb4e9dbe863)(@effect-atom/atom@0.5.3(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)': dependencies: + '@effect-atom/atom': 0.5.3(@effect/experimental@0.58.0(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65)(ioredis@5.10.1))(@effect/platform@0.94.5(effect@4.0.0-beta.65))(@effect/rpc@0.73.2(@effect/platform@0.94.5(effect@4.0.0-beta.65))(effect@4.0.0-beta.65))(effect@4.0.0-beta.65) effect: 4.0.0-beta.65 - '@msgpack/msgpack@3.1.2': {} + '@msgpack/msgpack@3.1.3': {} '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': optional: true @@ -5664,16 +5652,22 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@nktkas/hyperliquid@0.31.0(typescript@5.9.3)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@nktkas/hyperliquid@0.32.2(typescript@6.0.3)': dependencies: - '@nktkas/rews': 1.2.3 - '@noble/hashes': 2.0.1 - micro-eth-signer: 0.18.1 - valibot: 1.2.0(typescript@5.9.3) + '@nktkas/rews': 2.1.1 + '@noble/hashes': 2.2.0 + valibot: 1.3.1(typescript@6.0.3) transitivePeerDependencies: - typescript - '@nktkas/rews@1.2.3': {} + '@nktkas/rews@2.1.1': {} '@noble/ciphers@1.3.0': {} @@ -5689,12 +5683,6 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 - '@noble/curves@2.0.1': - dependencies: - '@noble/hashes': 2.0.1 - - '@noble/hashes@1.1.5': {} - '@noble/hashes@1.4.0': optional: true @@ -5702,9 +5690,9 @@ snapshots: '@noble/hashes@1.8.0': {} - '@noble/hashes@2.0.1': {} + '@noble/hashes@2.2.0': {} - '@noble/secp256k1@1.7.1': {} + '@oxc-project/types@0.128.0': {} '@phosphor-icons/webcomponents@2.1.5': dependencies: @@ -5739,22 +5727,78 @@ snapshots: transitivePeerDependencies: - supports-color - '@reown/appkit-adapter-wagmi@1.8.18(9ee7863b275c29e516ad5604625576cd)': - dependencies: - '@reown/appkit': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-polyfills': 1.8.18 - '@reown/appkit-scaffold-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@wagmi/core': 3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - valtio: 2.1.7(@types/react@19.2.14)(react@19.2.4) - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - wagmi: 3.4.3(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.4))(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@reown/appkit-adapter-wagmi@1.8.19(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@types/react@19.2.14)(@wagmi/core@3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76))(wagmi@3.6.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@tanstack/query-core@5.100.9)(@tanstack/react-query@5.100.9(react@19.2.6))(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(zod@3.25.76)': + dependencies: + '@reown/appkit': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(zod@3.25.76) + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-polyfills': 1.8.19 + '@reown/appkit-scaffold-ui': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76) + '@reown/appkit-utils': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.19(typescript@6.0.3) + '@wagmi/core': 3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) + '@walletconnect/universal-provider': 2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76) + valtio: 2.1.7(@types/react@19.2.14)(react@19.2.6) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) + wagmi: 3.6.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@tanstack/query-core@5.100.9)(@tanstack/react-query@5.100.9(react@19.2.6))(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) + optionalDependencies: + '@wagmi/connectors': 8.0.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@wagmi/core@3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@base-org/account' + - '@capacitor/preferences' + - '@coinbase/wallet-sdk' + - '@deno/kv' + - '@metamask/connect-evm' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@safe-global/safe-apps-provider' + - '@safe-global/safe-apps-sdk' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@walletconnect/ethereum-provider' + - accounts + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - porto + - react + - typescript + - uploadthing + - use-sync-external-store + - utf-8-validate + - zod + + '@reown/appkit-adapter-wagmi@1.8.19(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@types/react@19.2.14)(@wagmi/core@3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76))(wagmi@3.6.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@tanstack/query-core@5.100.9)(@tanstack/react-query@5.100.9(react@19.2.6))(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(zod@3.25.76)': + dependencies: + '@reown/appkit': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(zod@3.25.76) + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-polyfills': 1.8.19 + '@reown/appkit-scaffold-ui': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76) + '@reown/appkit-utils': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.19(typescript@6.0.3) + '@wagmi/core': 3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) + '@walletconnect/universal-provider': 2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76) + valtio: 2.1.7(@types/react@19.2.14)(react@19.2.6) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) + wagmi: 3.6.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@tanstack/query-core@5.100.9)(@tanstack/react-query@5.100.9(react@19.2.6))(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) optionalDependencies: - '@wagmi/connectors': 7.1.7(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/connectors': 8.0.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@wagmi/core@3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -5766,8 +5810,7 @@ snapshots: - '@capacitor/preferences' - '@coinbase/wallet-sdk' - '@deno/kv' - - '@gemini-wallet/core' - - '@metamask/sdk' + - '@metamask/connect-evm' - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' @@ -5779,6 +5822,7 @@ snapshots: - '@vercel/functions' - '@vercel/kv' - '@walletconnect/ethereum-provider' + - accounts - aws4fetch - bufferutil - db0 @@ -5795,35 +5839,71 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-common@1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4)': + '@reown/appkit-common@1.8.19(typescript@6.0.3)(zod@3.22.4)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.48.11(typescript@6.0.3)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-common@1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-common@1.8.19(typescript@6.0.3)(zod@3.25.76)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-controllers@1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-wallet': 1.8.19(typescript@6.0.3) + '@walletconnect/universal-provider': 2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76) + valtio: 2.1.7(@types/react@19.2.14)(react@19.2.6) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) 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 - '@reown/appkit-controllers@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-pay@1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - valtio: 2.1.7(@types/react@19.2.14)(react@19.2.4) - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-ui': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-utils': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76) + lit: 3.3.0 + valtio: 2.1.7(@types/react@19.2.14)(react@19.2.6) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -5844,22 +5924,26 @@ snapshots: - aws4fetch - bufferutil - db0 + - debug - encoding + - fastestsmallesttextencoderdecoder + - immer - ioredis - react - typescript - uploadthing + - use-sync-external-store - utf-8-validate - zod - '@reown/appkit-pay@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-pay@1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-ui': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-utils': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76) lit: 3.3.0 - valtio: 2.1.7(@types/react@19.2.14)(react@19.2.4) + valtio: 2.1.7(@types/react@19.2.14)(react@19.2.6) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -5892,18 +5976,60 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-polyfills@1.8.18': + '@reown/appkit-polyfills@1.8.19': dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-scaffold-ui@1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-pay': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(zod@3.25.76) + '@reown/appkit-ui': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-utils': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.19(typescript@6.0.3) + lit: 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' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react + - typescript + - uploadthing + - use-sync-external-store + - utf-8-validate + - valtio + - zod + + '@reown/appkit-scaffold-ui@1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-pay': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-pay': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(zod@3.25.76) + '@reown/appkit-ui': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-utils': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.19(typescript@6.0.3) lit: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -5935,14 +6061,15 @@ snapshots: - uploadthing - use-sync-external-store - utf-8-validate + - valtio - zod - '@reown/appkit-ui@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-ui@1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76)': dependencies: '@phosphor-icons/webcomponents': 2.1.5 - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-wallet': 1.8.19(typescript@6.0.3) lit: 3.3.0 qrcode: 1.5.3 transitivePeerDependencies: @@ -5973,21 +6100,68 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-utils@1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-polyfills': 1.8.19 + '@reown/appkit-wallet': 1.8.19(typescript@6.0.3) + '@wallet-standard/wallet': 1.1.0 + '@walletconnect/logger': 3.0.2 + '@walletconnect/universal-provider': 2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76) + valtio: 2.1.7(@types/react@19.2.14)(react@19.2.6) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) + optionalDependencies: + '@base-org/account': 2.4.0(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(zod@3.25.76) + '@safe-global/safe-apps-provider': 0.18.6(typescript@6.0.3)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(typescript@6.0.3)(zod@3.25.76) + 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 + - debug + - encoding + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react + - typescript + - uploadthing + - use-sync-external-store + - utf-8-validate + - zod + + '@reown/appkit-utils@1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-polyfills': 1.8.18 - '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-polyfills': 1.8.19 + '@reown/appkit-wallet': 1.8.19(typescript@6.0.3) '@wallet-standard/wallet': 1.1.0 '@walletconnect/logger': 3.0.2 - '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - valtio: 2.1.7(@types/react@19.2.14)(react@19.2.4) - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76) + valtio: 2.1.7(@types/react@19.2.14)(react@19.2.6) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) optionalDependencies: - '@base-org/account': 2.4.0(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@base-org/account': 2.4.0(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(zod@3.25.76) + '@safe-global/safe-apps-provider': 0.18.6(typescript@6.0.3)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(typescript@6.0.3)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6020,10 +6194,10 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-wallet@1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@reown/appkit-wallet@1.8.19(typescript@6.0.3)': dependencies: - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) - '@reown/appkit-polyfills': 1.8.18 + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.22.4) + '@reown/appkit-polyfills': 1.8.19 '@walletconnect/logger': 3.0.2 zod: 3.22.4 transitivePeerDependencies: @@ -6031,21 +6205,21 @@ snapshots: - typescript - utf-8-validate - '@reown/appkit@1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@reown/appkit-common': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-pay': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-polyfills': 1.8.18 - '@reown/appkit-scaffold-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.18(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.18(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit@1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-pay': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(zod@3.25.76) + '@reown/appkit-polyfills': 1.8.19 + '@reown/appkit-scaffold-ui': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76) + '@reown/appkit-ui': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-utils': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.19(typescript@6.0.3) + '@walletconnect/universal-provider': 2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76) bs58: 6.0.0 semver: 7.7.2 - valtio: 2.1.7(@types/react@19.2.14)(react@19.2.4) - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 2.1.7(@types/react@19.2.14)(react@19.2.6) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) optionalDependencies: '@lit/react': 1.0.8(@types/react@19.2.14) transitivePeerDependencies: @@ -6080,102 +6254,132 @@ snapshots: - utf-8-validate - zod - '@rolldown/pluginutils@1.0.0-rc.3': {} - - '@rollup/plugin-inject@5.0.5(rollup@4.57.1)': - dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.57.1) - estree-walker: 2.0.2 - magic-string: 0.30.21 - optionalDependencies: - rollup: 4.57.1 - - '@rollup/pluginutils@5.3.0(rollup@4.57.1)': - dependencies: - '@types/estree': 1.0.8 - estree-walker: 2.0.2 - picomatch: 4.0.3 + '@reown/appkit@1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.8.19(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-pay': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(zod@3.25.76) + '@reown/appkit-polyfills': 1.8.19 + '@reown/appkit-scaffold-ui': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76) + '@reown/appkit-ui': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(zod@3.25.76) + '@reown/appkit-utils': 1.8.19(@types/react@19.2.14)(ioredis@5.10.1)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(valtio@2.1.7(@types/react@19.2.14)(react@19.2.6))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.19(typescript@6.0.3) + '@walletconnect/universal-provider': 2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76) + bs58: 6.0.0 + semver: 7.7.2 + valtio: 2.1.7(@types/react@19.2.14)(react@19.2.6) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) optionalDependencies: - rollup: 4.57.1 - - '@rollup/rollup-android-arm-eabi@4.57.1': - optional: true - - '@rollup/rollup-android-arm64@4.57.1': - optional: true - - '@rollup/rollup-darwin-arm64@4.57.1': - optional: true - - '@rollup/rollup-darwin-x64@4.57.1': - optional: true - - '@rollup/rollup-freebsd-arm64@4.57.1': - optional: true + '@lit/react': 1.0.8(@types/react@19.2.14) + 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 + - debug + - encoding + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react + - typescript + - uploadthing + - use-sync-external-store + - utf-8-validate + - zod - '@rollup/rollup-freebsd-x64@4.57.1': + '@rolldown/binding-android-arm64@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + '@rolldown/binding-darwin-arm64@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.57.1': + '@rolldown/binding-darwin-x64@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-arm64-gnu@4.57.1': + '@rolldown/binding-freebsd-x64@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-arm64-musl@4.57.1': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-loong64-gnu@4.57.1': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-loong64-musl@4.57.1': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.57.1': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-ppc64-musl@4.57.1': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.57.1': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-riscv64-musl@4.57.1': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-s390x-gnu@4.57.1': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-x64-gnu@4.57.1': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rollup/rollup-linux-x64-musl@4.57.1': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': optional: true - '@rollup/rollup-openbsd-x64@4.57.1': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': optional: true - '@rollup/rollup-openharmony-arm64@4.57.1': - optional: true + '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.18)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))': + dependencies: + '@babel/core': 7.29.0 + picomatch: 4.0.4 + rolldown: 1.0.0-rc.18 + optionalDependencies: + '@babel/runtime': 7.29.2 + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) - '@rollup/rollup-win32-arm64-msvc@4.57.1': - optional: true + '@rolldown/pluginutils@1.0.0-rc.18': {} - '@rollup/rollup-win32-ia32-msvc@4.57.1': - optional: true + '@rolldown/pluginutils@1.0.0-rc.7': {} - '@rollup/rollup-win32-x64-gnu@4.57.1': - optional: true + '@rollup/plugin-inject@5.0.5': + dependencies: + '@rollup/pluginutils': 5.3.0 + estree-walker: 2.0.2 + magic-string: 0.30.21 - '@rollup/rollup-win32-x64-msvc@4.57.1': - optional: true + '@rollup/pluginutils@5.3.0': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.4 - '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76)': dependencies: - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(typescript@6.0.3)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -6184,10 +6388,10 @@ snapshots: - zod optional: true - '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -6200,8 +6404,6 @@ snapshots: '@scure/base@1.2.6': {} - '@scure/base@2.0.0': {} - '@scure/bip32@1.7.0': dependencies: '@noble/curves': 1.9.1 @@ -6213,836 +6415,739 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 - '@solana-program/system@0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@simple-libs/child-process-utils@1.0.2': + dependencies: + '@simple-libs/stream-utils': 1.2.0 + + '@simple-libs/stream-utils@1.2.0': {} + + '@solana-program/system@0.10.0(@solana/kit@5.5.1(typescript@6.0.3))': dependencies: - '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/kit': 5.5.1(typescript@6.0.3) optional: true - '@solana-program/token@0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana-program/token@0.9.0(@solana/kit@5.5.1(typescript@6.0.3))': dependencies: - '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/kit': 5.5.1(typescript@6.0.3) optional: true - '@solana/accounts@5.5.1(typescript@5.9.3)': + '@solana/accounts@5.5.1(typescript@6.0.3)': dependencies: - '@solana/addresses': 5.5.1(typescript@5.9.3) - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/codecs-strings': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/rpc-spec': 5.5.1(typescript@5.9.3) - '@solana/rpc-types': 5.5.1(typescript@5.9.3) + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/addresses@5.5.1(typescript@5.9.3)': + '@solana/addresses@5.5.1(typescript@6.0.3)': dependencies: - '@solana/assertions': 5.5.1(typescript@5.9.3) - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/codecs-strings': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/nominal-types': 5.5.1(typescript@5.9.3) + '@solana/assertions': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/assertions@5.5.1(typescript@5.9.3)': + '@solana/assertions@5.5.1(typescript@6.0.3)': dependencies: - '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 - optional: true - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - optional: true - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/codecs-core@5.5.1(typescript@5.9.3)': + '@solana/codecs-core@5.5.1(typescript@6.0.3)': dependencies: - '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/codecs-data-structures@5.5.1(typescript@5.9.3)': + '@solana/codecs-data-structures@5.5.1(typescript@6.0.3)': dependencies: - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 - optional: true - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/codecs-numbers@5.5.1(typescript@5.9.3)': + '@solana/codecs-numbers@5.5.1(typescript@6.0.3)': dependencies: - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/codecs-strings@5.5.1(typescript@5.9.3)': + '@solana/codecs-strings@5.5.1(typescript@6.0.3)': dependencies: - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/codecs@5.5.1(typescript@5.9.3)': + '@solana/codecs@5.5.1(typescript@6.0.3)': dependencies: - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) - '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) - '@solana/codecs-strings': 5.5.1(typescript@5.9.3) - '@solana/options': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-data-structures': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/options': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 5.9.3 - optional: true - - '@solana/errors@5.5.1(typescript@5.9.3)': + '@solana/errors@5.5.1(typescript@6.0.3)': dependencies: chalk: 5.6.2 commander: 14.0.2 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/fast-stable-stringify@5.5.1(typescript@5.9.3)': + '@solana/fast-stable-stringify@5.5.1(typescript@6.0.3)': optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/functional@5.5.1(typescript@5.9.3)': + '@solana/functional@5.5.1(typescript@6.0.3)': optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/instruction-plans@5.5.1(typescript@5.9.3)': + '@solana/instruction-plans@5.5.1(typescript@6.0.3)': dependencies: - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/instructions': 5.5.1(typescript@5.9.3) - '@solana/keys': 5.5.1(typescript@5.9.3) - '@solana/promises': 5.5.1(typescript@5.9.3) - '@solana/transaction-messages': 5.5.1(typescript@5.9.3) - '@solana/transactions': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/instructions': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/promises': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + '@solana/transactions': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/instructions@5.5.1(typescript@5.9.3)': + '@solana/instructions@5.5.1(typescript@6.0.3)': dependencies: - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/keys@5.5.1(typescript@5.9.3)': + '@solana/keys@5.5.1(typescript@6.0.3)': dependencies: - '@solana/assertions': 5.5.1(typescript@5.9.3) - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/codecs-strings': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/nominal-types': 5.5.1(typescript@5.9.3) + '@solana/assertions': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/accounts': 5.5.1(typescript@5.9.3) - '@solana/addresses': 5.5.1(typescript@5.9.3) - '@solana/codecs': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/functional': 5.5.1(typescript@5.9.3) - '@solana/instruction-plans': 5.5.1(typescript@5.9.3) - '@solana/instructions': 5.5.1(typescript@5.9.3) - '@solana/keys': 5.5.1(typescript@5.9.3) - '@solana/offchain-messages': 5.5.1(typescript@5.9.3) - '@solana/plugin-core': 5.5.1(typescript@5.9.3) - '@solana/programs': 5.5.1(typescript@5.9.3) - '@solana/rpc': 5.5.1(typescript@5.9.3) - '@solana/rpc-api': 5.5.1(typescript@5.9.3) - '@solana/rpc-parsed-types': 5.5.1(typescript@5.9.3) - '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) - '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-types': 5.5.1(typescript@5.9.3) - '@solana/signers': 5.5.1(typescript@5.9.3) - '@solana/sysvars': 5.5.1(typescript@5.9.3) - '@solana/transaction-confirmation': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/transaction-messages': 5.5.1(typescript@5.9.3) - '@solana/transactions': 5.5.1(typescript@5.9.3) + '@solana/kit@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/accounts': 5.5.1(typescript@6.0.3) + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/instruction-plans': 5.5.1(typescript@6.0.3) + '@solana/instructions': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/offchain-messages': 5.5.1(typescript@6.0.3) + '@solana/plugin-core': 5.5.1(typescript@6.0.3) + '@solana/programs': 5.5.1(typescript@6.0.3) + '@solana/rpc': 5.5.1(typescript@6.0.3) + '@solana/rpc-api': 5.5.1(typescript@6.0.3) + '@solana/rpc-parsed-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + '@solana/signers': 5.5.1(typescript@6.0.3) + '@solana/sysvars': 5.5.1(typescript@6.0.3) + '@solana/transaction-confirmation': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + '@solana/transactions': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - bufferutil - fastestsmallesttextencoderdecoder - utf-8-validate optional: true - '@solana/nominal-types@5.5.1(typescript@5.9.3)': + '@solana/nominal-types@5.5.1(typescript@6.0.3)': optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/offchain-messages@5.5.1(typescript@5.9.3)': + '@solana/offchain-messages@5.5.1(typescript@6.0.3)': dependencies: - '@solana/addresses': 5.5.1(typescript@5.9.3) - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) - '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) - '@solana/codecs-strings': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/keys': 5.5.1(typescript@5.9.3) - '@solana/nominal-types': 5.5.1(typescript@5.9.3) + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-data-structures': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/options@5.5.1(typescript@5.9.3)': + '@solana/options@5.5.1(typescript@6.0.3)': dependencies: - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) - '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) - '@solana/codecs-strings': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-data-structures': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/plugin-core@5.5.1(typescript@5.9.3)': + '@solana/plugin-core@5.5.1(typescript@6.0.3)': optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/programs@5.5.1(typescript@5.9.3)': + '@solana/programs@5.5.1(typescript@6.0.3)': dependencies: - '@solana/addresses': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/promises@5.5.1(typescript@5.9.3)': + '@solana/promises@5.5.1(typescript@6.0.3)': optionalDependencies: - typescript: 5.9.3 - optional: true - - '@solana/rpc-api@5.5.1(typescript@5.9.3)': - dependencies: - '@solana/addresses': 5.5.1(typescript@5.9.3) - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/codecs-strings': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/keys': 5.5.1(typescript@5.9.3) - '@solana/rpc-parsed-types': 5.5.1(typescript@5.9.3) - '@solana/rpc-spec': 5.5.1(typescript@5.9.3) - '@solana/rpc-transformers': 5.5.1(typescript@5.9.3) - '@solana/rpc-types': 5.5.1(typescript@5.9.3) - '@solana/transaction-messages': 5.5.1(typescript@5.9.3) - '@solana/transactions': 5.5.1(typescript@5.9.3) + typescript: 6.0.3 + optional: true + + '@solana/rpc-api@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/rpc-parsed-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec': 5.5.1(typescript@6.0.3) + '@solana/rpc-transformers': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + '@solana/transactions': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/rpc-parsed-types@5.5.1(typescript@5.9.3)': + '@solana/rpc-parsed-types@5.5.1(typescript@6.0.3)': optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/rpc-spec-types@5.5.1(typescript@5.9.3)': + '@solana/rpc-spec-types@5.5.1(typescript@6.0.3)': optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/rpc-spec@5.5.1(typescript@5.9.3)': + '@solana/rpc-spec@5.5.1(typescript@6.0.3)': dependencies: - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/rpc-subscriptions-api@5.5.1(typescript@5.9.3)': + '@solana/rpc-subscriptions-api@5.5.1(typescript@6.0.3)': dependencies: - '@solana/addresses': 5.5.1(typescript@5.9.3) - '@solana/keys': 5.5.1(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.9.3) - '@solana/rpc-transformers': 5.5.1(typescript@5.9.3) - '@solana/rpc-types': 5.5.1(typescript@5.9.3) - '@solana/transaction-messages': 5.5.1(typescript@5.9.3) - '@solana/transactions': 5.5.1(typescript@5.9.3) + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@6.0.3) + '@solana/rpc-transformers': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + '@solana/transactions': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/rpc-subscriptions-channel-websocket@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/rpc-subscriptions-channel-websocket@5.5.1(typescript@6.0.3)': dependencies: - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/functional': 5.5.1(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.9.3) - '@solana/subscribable': 5.5.1(typescript@5.9.3) - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@6.0.3) + '@solana/subscribable': 5.5.1(typescript@6.0.3) + ws: 8.20.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - bufferutil - utf-8-validate optional: true - '@solana/rpc-subscriptions-spec@5.5.1(typescript@5.9.3)': + '@solana/rpc-subscriptions-spec@5.5.1(typescript@6.0.3)': dependencies: - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/promises': 5.5.1(typescript@5.9.3) - '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) - '@solana/subscribable': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/promises': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + '@solana/subscribable': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 - optional: true - - '@solana/rpc-subscriptions@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/fast-stable-stringify': 5.5.1(typescript@5.9.3) - '@solana/functional': 5.5.1(typescript@5.9.3) - '@solana/promises': 5.5.1(typescript@5.9.3) - '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) - '@solana/rpc-subscriptions-api': 5.5.1(typescript@5.9.3) - '@solana/rpc-subscriptions-channel-websocket': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.9.3) - '@solana/rpc-transformers': 5.5.1(typescript@5.9.3) - '@solana/rpc-types': 5.5.1(typescript@5.9.3) - '@solana/subscribable': 5.5.1(typescript@5.9.3) + typescript: 6.0.3 + optional: true + + '@solana/rpc-subscriptions@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/fast-stable-stringify': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/promises': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions-api': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions-channel-websocket': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@6.0.3) + '@solana/rpc-transformers': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + '@solana/subscribable': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - bufferutil - fastestsmallesttextencoderdecoder - utf-8-validate optional: true - '@solana/rpc-transformers@5.5.1(typescript@5.9.3)': + '@solana/rpc-transformers@5.5.1(typescript@6.0.3)': dependencies: - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/functional': 5.5.1(typescript@5.9.3) - '@solana/nominal-types': 5.5.1(typescript@5.9.3) - '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) - '@solana/rpc-types': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/rpc-transport-http@5.5.1(typescript@5.9.3)': + '@solana/rpc-transport-http@5.5.1(typescript@6.0.3)': dependencies: - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/rpc-spec': 5.5.1(typescript@5.9.3) - '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) - undici-types: 7.21.0 + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + undici-types: 7.25.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/rpc-types@5.5.1(typescript@5.9.3)': + '@solana/rpc-types@5.5.1(typescript@6.0.3)': dependencies: - '@solana/addresses': 5.5.1(typescript@5.9.3) - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) - '@solana/codecs-strings': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/nominal-types': 5.5.1(typescript@5.9.3) + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/rpc@5.5.1(typescript@5.9.3)': + '@solana/rpc@5.5.1(typescript@6.0.3)': dependencies: - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/fast-stable-stringify': 5.5.1(typescript@5.9.3) - '@solana/functional': 5.5.1(typescript@5.9.3) - '@solana/rpc-api': 5.5.1(typescript@5.9.3) - '@solana/rpc-spec': 5.5.1(typescript@5.9.3) - '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) - '@solana/rpc-transformers': 5.5.1(typescript@5.9.3) - '@solana/rpc-transport-http': 5.5.1(typescript@5.9.3) - '@solana/rpc-types': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/fast-stable-stringify': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/rpc-api': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-transformers': 5.5.1(typescript@6.0.3) + '@solana/rpc-transport-http': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/signers@5.5.1(typescript@5.9.3)': + '@solana/signers@5.5.1(typescript@6.0.3)': dependencies: - '@solana/addresses': 5.5.1(typescript@5.9.3) - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/instructions': 5.5.1(typescript@5.9.3) - '@solana/keys': 5.5.1(typescript@5.9.3) - '@solana/nominal-types': 5.5.1(typescript@5.9.3) - '@solana/offchain-messages': 5.5.1(typescript@5.9.3) - '@solana/transaction-messages': 5.5.1(typescript@5.9.3) - '@solana/transactions': 5.5.1(typescript@5.9.3) + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/instructions': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) + '@solana/offchain-messages': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + '@solana/transactions': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/subscribable@5.5.1(typescript@5.9.3)': + '@solana/subscribable@5.5.1(typescript@6.0.3)': dependencies: - '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 optional: true - '@solana/sysvars@5.5.1(typescript@5.9.3)': + '@solana/sysvars@5.5.1(typescript@6.0.3)': dependencies: - '@solana/accounts': 5.5.1(typescript@5.9.3) - '@solana/codecs': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/rpc-types': 5.5.1(typescript@5.9.3) + '@solana/accounts': 5.5.1(typescript@6.0.3) + '@solana/codecs': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/transaction-confirmation@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/transaction-confirmation@5.5.1(typescript@6.0.3)': dependencies: - '@solana/addresses': 5.5.1(typescript@5.9.3) - '@solana/codecs-strings': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/keys': 5.5.1(typescript@5.9.3) - '@solana/promises': 5.5.1(typescript@5.9.3) - '@solana/rpc': 5.5.1(typescript@5.9.3) - '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-types': 5.5.1(typescript@5.9.3) - '@solana/transaction-messages': 5.5.1(typescript@5.9.3) - '@solana/transactions': 5.5.1(typescript@5.9.3) + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/promises': 5.5.1(typescript@6.0.3) + '@solana/rpc': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + '@solana/transactions': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - bufferutil - fastestsmallesttextencoderdecoder - utf-8-validate optional: true - '@solana/transaction-messages@5.5.1(typescript@5.9.3)': + '@solana/transaction-messages@5.5.1(typescript@6.0.3)': dependencies: - '@solana/addresses': 5.5.1(typescript@5.9.3) - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) - '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/functional': 5.5.1(typescript@5.9.3) - '@solana/instructions': 5.5.1(typescript@5.9.3) - '@solana/nominal-types': 5.5.1(typescript@5.9.3) - '@solana/rpc-types': 5.5.1(typescript@5.9.3) + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-data-structures': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/instructions': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/transactions@5.5.1(typescript@5.9.3)': - dependencies: - '@solana/addresses': 5.5.1(typescript@5.9.3) - '@solana/codecs-core': 5.5.1(typescript@5.9.3) - '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) - '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) - '@solana/codecs-strings': 5.5.1(typescript@5.9.3) - '@solana/errors': 5.5.1(typescript@5.9.3) - '@solana/functional': 5.5.1(typescript@5.9.3) - '@solana/instructions': 5.5.1(typescript@5.9.3) - '@solana/keys': 5.5.1(typescript@5.9.3) - '@solana/nominal-types': 5.5.1(typescript@5.9.3) - '@solana/rpc-types': 5.5.1(typescript@5.9.3) - '@solana/transaction-messages': 5.5.1(typescript@5.9.3) + '@solana/transactions@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-data-structures': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/instructions': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solid-primitives/event-listener@2.4.5(solid-js@1.9.12)': dependencies: - '@babel/runtime': 7.28.6 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.4.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.3.3 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - optional: true - - '@solid-primitives/event-listener@2.4.3(solid-js@1.9.11)': - dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 - - '@solid-primitives/keyboard@1.3.3(solid-js@1.9.11)': - dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) - '@solid-primitives/rootless': 1.5.2(solid-js@1.9.11) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 - - '@solid-primitives/resize-observer@2.1.3(solid-js@1.9.11)': - dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) - '@solid-primitives/rootless': 1.5.2(solid-js@1.9.11) - '@solid-primitives/static-store': 0.1.2(solid-js@1.9.11) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/rootless@1.5.2(solid-js@1.9.11)': + '@solid-primitives/keyboard@1.3.5(solid-js@1.9.12)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.12) + '@solid-primitives/rootless': 1.5.3(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/static-store@0.1.2(solid-js@1.9.11)': + '@solid-primitives/resize-observer@2.1.5(solid-js@1.9.12)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.12) + '@solid-primitives/rootless': 1.5.3(solid-js@1.9.12) + '@solid-primitives/static-store': 0.1.3(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/utils@6.3.2(solid-js@1.9.11)': + '@solid-primitives/rootless@1.5.3(solid-js@1.9.12)': dependencies: - solid-js: 1.9.11 + '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@stacks/common@6.16.0': + '@solid-primitives/static-store@0.1.3(solid-js@1.9.12)': dependencies: - '@types/bn.js': 5.2.0 - '@types/node': 18.19.130 + '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@stacks/network@6.17.0': + '@solid-primitives/utils@6.4.0(solid-js@1.9.12)': dependencies: - '@stacks/common': 6.16.0 - cross-fetch: 3.2.0 - transitivePeerDependencies: - - encoding - - '@stacks/transactions@6.17.0': - dependencies: - '@noble/hashes': 1.1.5 - '@noble/secp256k1': 1.7.1 - '@stacks/common': 6.16.0 - '@stacks/network': 6.17.0 - c32check: 2.0.0 - lodash.clonedeep: 4.5.0 - transitivePeerDependencies: - - encoding + solid-js: 1.9.12 '@stakekit/common@0.0.61': {} '@standard-schema/spec@1.1.0': {} - '@swc/helpers@0.5.18': - dependencies: - tslib: 2.8.1 - optional: true - - '@tailwindcss/node@4.1.18': + '@tailwindcss/node@4.3.0': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.4 - jiti: 2.6.1 - lightningcss: 1.30.2 + enhanced-resolve: 5.21.2 + jiti: 2.7.0 + lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.1.18 + tailwindcss: 4.3.0 - '@tailwindcss/oxide-android-arm64@4.1.18': + '@tailwindcss/oxide-android-arm64@4.3.0': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.18': + '@tailwindcss/oxide-darwin-arm64@4.3.0': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.18': + '@tailwindcss/oxide-darwin-x64@4.3.0': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.18': + '@tailwindcss/oxide-freebsd-x64@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.18': + '@tailwindcss/oxide-linux-x64-musl@4.3.0': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.18': + '@tailwindcss/oxide-wasm32-wasi@4.3.0': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': optional: true - '@tailwindcss/oxide@4.1.18': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-x64': 4.1.18 - '@tailwindcss/oxide-freebsd-x64': 4.1.18 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-x64-musl': 4.1.18 - '@tailwindcss/oxide-wasm32-wasi': 4.1.18 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - - '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))': - dependencies: - '@tailwindcss/node': 4.1.18 - '@tailwindcss/oxide': 4.1.18 - tailwindcss: 4.1.18 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) - - '@tanstack/devtools-client@0.0.5': - dependencies: - '@tanstack/devtools-event-client': 0.4.0 + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/vite@4.3.0(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))': + dependencies: + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) + + '@tanstack/devtools-client@0.0.6': + dependencies: + '@tanstack/devtools-event-client': 0.4.3 - '@tanstack/devtools-event-bus@0.4.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + '@tanstack/devtools-event-bus@0.4.1': dependencies: - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 8.20.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@tanstack/devtools-event-client@0.4.0': {} + '@tanstack/devtools-event-client@0.4.3': {} - '@tanstack/devtools-ui@0.4.4(csstype@3.2.3)': + '@tanstack/devtools-ui@0.5.1(csstype@3.2.3)(solid-js@1.9.12)': dependencies: clsx: 2.1.1 + dayjs: 1.11.20 goober: 2.1.18(csstype@3.2.3) - solid-js: 1.9.11 + solid-js: 1.9.12 transitivePeerDependencies: - csstype - '@tanstack/devtools-vite@0.5.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))': + '@tanstack/devtools-vite@0.6.0(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))': dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.3 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 - '@tanstack/devtools-client': 0.0.5 - '@tanstack/devtools-event-bus': 0.4.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@tanstack/devtools-client': 0.0.6 + '@tanstack/devtools-event-bus': 0.4.1 chalk: 5.6.2 - launch-editor: 2.12.0 - picomatch: 4.0.3 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) + launch-editor: 2.13.2 + picomatch: 4.0.4 + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@tanstack/devtools@0.10.6(bufferutil@4.1.0)(csstype@3.2.3)(utf-8-validate@5.0.10)': + '@tanstack/devtools@0.11.2(csstype@3.2.3)(solid-js@1.9.12)': dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) - '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.11) - '@solid-primitives/resize-observer': 2.1.3(solid-js@1.9.11) - '@tanstack/devtools-client': 0.0.5 - '@tanstack/devtools-event-bus': 0.4.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tanstack/devtools-ui': 0.4.4(csstype@3.2.3) + '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.12) + '@solid-primitives/keyboard': 1.3.5(solid-js@1.9.12) + '@solid-primitives/resize-observer': 2.1.5(solid-js@1.9.12) + '@tanstack/devtools-client': 0.0.6 + '@tanstack/devtools-event-bus': 0.4.1 + '@tanstack/devtools-ui': 0.5.1(csstype@3.2.3)(solid-js@1.9.12) clsx: 2.1.1 goober: 2.1.18(csstype@3.2.3) - solid-js: 1.9.11 + solid-js: 1.9.12 transitivePeerDependencies: - bufferutil - csstype - utf-8-validate - '@tanstack/history@1.154.14': {} - '@tanstack/history@1.161.6': {} - '@tanstack/query-core@5.90.20': {} + '@tanstack/query-core@5.100.9': {} - '@tanstack/react-devtools@0.9.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@5.0.10)': + '@tanstack/react-devtools@0.10.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(solid-js@1.9.12)': dependencies: - '@tanstack/devtools': 0.10.6(bufferutil@4.1.0)(csstype@3.2.3)(utf-8-validate@5.0.10) + '@tanstack/devtools': 0.11.2(csstype@3.2.3)(solid-js@1.9.12) '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) transitivePeerDependencies: - bufferutil - csstype + - solid-js - utf-8-validate - '@tanstack/react-query@5.90.21(react@19.2.4)': + '@tanstack/react-query@5.100.9(react@19.2.6)': dependencies: - '@tanstack/query-core': 5.90.20 - react: 19.2.4 + '@tanstack/query-core': 5.100.9 + react: 19.2.6 - '@tanstack/react-router-devtools@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.168.9)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-router-devtools@1.166.13(@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.169.2)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/react-router': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/router-devtools-core': 1.159.4(@tanstack/router-core@1.168.9)(csstype@3.2.3) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@tanstack/react-router': 1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-devtools-core': 1.167.3(@tanstack/router-core@1.169.2)(csstype@3.2.3) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@tanstack/router-core': 1.168.9 + '@tanstack/router-core': 1.169.2 transitivePeerDependencies: - csstype - '@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/history': 1.154.14 - '@tanstack/react-store': 0.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/router-core': 1.159.4 - isbot: 5.1.35 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 + '@tanstack/history': 1.161.6 + '@tanstack/react-store': 0.9.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-core': 1.169.2 + isbot: 5.1.40 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) - '@tanstack/react-store@0.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-store@0.9.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/store': 0.8.0 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - use-sync-external-store: 1.6.0(react@19.2.4) + '@tanstack/store': 0.9.3 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + use-sync-external-store: 1.6.0(react@19.2.6) - '@tanstack/react-virtual@3.13.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-virtual@3.13.24(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/virtual-core': 3.13.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@tanstack/virtual-core': 3.14.0 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) - '@tanstack/router-cli@1.166.25': + '@tanstack/router-cli@1.166.43': dependencies: - '@tanstack/router-generator': 1.166.24 + '@tanstack/router-generator': 1.166.42 chokidar: 3.6.0 yargs: 17.7.2 transitivePeerDependencies: - supports-color - '@tanstack/router-core@1.159.4': - dependencies: - '@tanstack/history': 1.154.14 - '@tanstack/store': 0.8.0 - cookie-es: 2.0.0 - seroval: 1.5.0 - seroval-plugins: 1.5.0(seroval@1.5.0) - tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 - - '@tanstack/router-core@1.168.9': + '@tanstack/router-core@1.169.2': dependencies: '@tanstack/history': 1.161.6 - cookie-es: 2.0.0 - seroval: 1.5.0 - seroval-plugins: 1.5.0(seroval@1.5.0) + cookie-es: 3.1.1 + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) - '@tanstack/router-devtools-core@1.159.4(@tanstack/router-core@1.168.9)(csstype@3.2.3)': + '@tanstack/router-devtools-core@1.167.3(@tanstack/router-core@1.169.2)(csstype@3.2.3)': dependencies: - '@tanstack/router-core': 1.168.9 + '@tanstack/router-core': 1.169.2 clsx: 2.1.1 goober: 2.1.18(csstype@3.2.3) - tiny-invariant: 1.3.3 optionalDependencies: csstype: 3.2.3 - '@tanstack/router-generator@1.159.4': - dependencies: - '@tanstack/router-core': 1.159.4 - '@tanstack/router-utils': 1.158.0 - '@tanstack/virtual-file-routes': 1.154.7 - prettier: 3.8.1 - recast: 0.23.11 - source-map: 0.7.6 - tsx: 4.21.0 - zod: 3.25.76 - transitivePeerDependencies: - - supports-color - - '@tanstack/router-generator@1.166.24': + '@tanstack/router-generator@1.166.42': dependencies: - '@tanstack/router-core': 1.168.9 - '@tanstack/router-utils': 1.161.6 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.169.2 + '@tanstack/router-utils': 1.161.8 '@tanstack/virtual-file-routes': 1.161.7 - prettier: 3.8.1 - recast: 0.23.11 - source-map: 0.7.6 - tsx: 4.21.0 + jiti: 2.7.0 + magic-string: 0.30.21 + prettier: 3.8.3 zod: 3.25.76 transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))': + '@tanstack/router-plugin@1.167.35(@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -7050,106 +7155,74 @@ snapshots: '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 - '@tanstack/router-core': 1.159.4 - '@tanstack/router-generator': 1.159.4 - '@tanstack/router-utils': 1.158.0 - '@tanstack/virtual-file-routes': 1.154.7 + '@tanstack/router-core': 1.169.2 + '@tanstack/router-generator': 1.166.42 + '@tanstack/router-utils': 1.161.8 + '@tanstack/virtual-file-routes': 1.161.7 chokidar: 3.6.0 - unplugin: 2.3.11 + unplugin: 3.0.0 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) - transitivePeerDependencies: - - supports-color - - '@tanstack/router-utils@1.158.0': - dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - ansis: 4.2.0 - babel-dead-code-elimination: 1.0.12 - diff: 8.0.3 - pathe: 2.0.3 - tinyglobby: 0.2.15 + '@tanstack/react-router': 1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) transitivePeerDependencies: - supports-color - '@tanstack/router-utils@1.161.6': + '@tanstack/router-utils@1.161.8': dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.3 '@babel/types': 7.29.0 ansis: 4.2.0 babel-dead-code-elimination: 1.0.12 - diff: 8.0.3 + diff: 8.0.4 pathe: 2.0.3 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 transitivePeerDependencies: - supports-color - '@tanstack/store@0.8.0': {} - - '@tanstack/virtual-core@3.13.18': {} + '@tanstack/store@0.9.3': {} - '@tanstack/virtual-file-routes@1.154.7': {} + '@tanstack/virtual-core@3.14.0': {} '@tanstack/virtual-file-routes@1.161.7': {} - '@ton/core@0.62.1': {} + '@turbo/darwin-64@2.9.12': + optional: true - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 + '@turbo/darwin-arm64@2.9.12': + optional: true - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.29.0 + '@turbo/linux-64@2.9.12': + optional: true - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 + '@turbo/linux-arm64@2.9.12': + optional: true - '@types/babel__traverse@7.28.0': - dependencies: - '@babel/types': 7.29.0 + '@turbo/windows-64@2.9.12': + optional: true + + '@turbo/windows-arm64@2.9.12': + optional: true - '@types/bn.js@5.2.0': + '@tybys/wasm-util@0.10.2': dependencies: - '@types/node': 25.2.3 + tslib: 2.8.1 + optional: true '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 - '@types/connect@3.4.38': - dependencies: - '@types/node': 25.2.3 - optional: true - '@types/deep-eql@4.0.2': {} - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} - '@types/node@12.20.55': - optional: true - - '@types/node@18.19.130': - dependencies: - undici-types: 5.26.5 - - '@types/node@25.2.3': + '@types/node@25.6.2': dependencies: - undici-types: 7.16.0 + undici-types: 7.19.2 '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: @@ -7161,17 +7234,9 @@ snapshots: '@types/trusted-types@2.0.7': {} - '@types/uuid@8.3.4': - optional: true - - '@types/ws@7.4.7': - dependencies: - '@types/node': 25.2.3 - optional: true - '@types/ws@8.18.1': dependencies: - '@types/node': 25.2.3 + '@types/node': 25.6.2 '@vite-pwa/assets-generator@1.0.2': dependencies: @@ -7182,121 +7247,128 @@ snapshots: sharp-ico: 0.1.5 unconfig: 7.4.2 - '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))': + '@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.18)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))': dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) - '@rolldown/pluginutils': 1.0.0-rc.3 - '@types/babel__core': 7.20.5 - react-refresh: 0.18.0 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) - transitivePeerDependencies: - - supports-color + '@rolldown/pluginutils': 1.0.0-rc.7 + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) + optionalDependencies: + '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.18)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) + babel-plugin-react-compiler: 1.0.0 - '@vitest/browser-playwright@4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18)': + '@vitest/browser-playwright@4.1.5(playwright@1.59.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))(vitest@4.1.5)': dependencies: - '@vitest/browser': 4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18) - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) - tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) + '@vitest/browser': 4.1.5(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))(vitest@4.1.5) + '@vitest/mocker': 4.1.5(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) + playwright: 1.59.1 + tinyrainbow: 3.1.0 + vitest: 4.1.5(@types/node@25.6.2)(@vitest/browser-playwright@4.1.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18)': + '@vitest/browser@4.1.5(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))(vitest@4.1.5)': dependencies: - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) - '@vitest/utils': 4.0.18 + '@blazediff/core': 1.9.1 + '@vitest/mocker': 4.1.5(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) + '@vitest/utils': 4.1.5 magic-string: 0.30.21 - pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.2 - tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + tinyrainbow: 3.1.0 + vitest: 4.1.5(@types/node@25.6.2)(@vitest/browser-playwright@4.1.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) + ws: 8.20.0 transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/expect@4.0.18': + '@vitest/expect@4.1.5': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 + '@vitest/spy': 4.1.5 + '@vitest/utils': 4.1.5 chai: 6.2.2 - tinyrainbow: 3.0.3 + tinyrainbow: 3.1.0 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.5(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))': dependencies: - '@vitest/spy': 4.0.18 + '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) - '@vitest/pretty-format@4.0.18': + '@vitest/pretty-format@4.1.5': dependencies: - tinyrainbow: 3.0.3 + tinyrainbow: 3.1.0 - '@vitest/runner@4.0.18': + '@vitest/runner@4.1.5': dependencies: - '@vitest/utils': 4.0.18 + '@vitest/utils': 4.1.5 pathe: 2.0.3 - '@vitest/snapshot@4.0.18': + '@vitest/snapshot@4.1.5': dependencies: - '@vitest/pretty-format': 4.0.18 + '@vitest/pretty-format': 4.1.5 + '@vitest/utils': 4.1.5 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.18': {} + '@vitest/spy@4.1.5': {} + + '@vitest/utils@4.1.5': + dependencies: + '@vitest/pretty-format': 4.1.5 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 - '@vitest/utils@4.0.18': + '@wagmi/connectors@8.0.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@wagmi/core@3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76))': dependencies: - '@vitest/pretty-format': 4.0.18 - tinyrainbow: 3.0.3 + '@wagmi/core': 3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) + optionalDependencies: + '@safe-global/safe-apps-provider': 0.18.6(typescript@6.0.3)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(typescript@6.0.3)(zod@3.25.76) + typescript: 6.0.3 - '@wagmi/connectors@7.1.7(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@wagmi/connectors@8.0.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@wagmi/core@3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76))': dependencies: - '@wagmi/core': 3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@wagmi/core': 3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) optionalDependencies: - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - typescript: 5.9.3 + '@safe-global/safe-apps-provider': 0.18.6(typescript@6.0.3)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(typescript@6.0.3)(zod@3.25.76) + typescript: 6.0.3 + optional: true - '@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@wagmi/core@3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76))': dependencies: eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.9.3) - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zustand: 5.0.0(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + mipd: 0.0.7(typescript@6.0.3) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) + zustand: 5.0.0(@types/react@19.2.14)(react@19.2.6)(use-sync-external-store@1.4.0(react@19.2.6)) optionalDependencies: - '@tanstack/query-core': 5.90.20 - ox: 0.12.1(typescript@5.9.3)(zod@3.25.76) - typescript: 5.9.3 + '@tanstack/query-core': 5.100.9 + typescript: 6.0.3 transitivePeerDependencies: - '@types/react' - immer - react - use-sync-external-store - '@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@wagmi/core@3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.6.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76))': dependencies: eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.9.3) - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zustand: 5.0.0(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) + mipd: 0.0.7(typescript@6.0.3) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) + zustand: 5.0.0(@types/react@19.2.14)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)) optionalDependencies: - '@tanstack/query-core': 5.90.20 - ox: 0.12.1(typescript@5.9.3)(zod@3.25.76) - typescript: 5.9.3 + '@tanstack/query-core': 5.100.9 + typescript: 6.0.3 transitivePeerDependencies: - '@types/react' - immer @@ -7309,23 +7381,23 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 - '@walletconnect/core@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/core@2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76)': 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 + '@walletconnect/jsonrpc-ws-connection': 1.0.16 + '@walletconnect/keyvaluestorage': 1.1.1(ioredis@5.10.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.2 - '@walletconnect/utils': 2.23.2(typescript@5.9.3)(zod@3.25.76) + '@walletconnect/types': 2.23.7(ioredis@5.10.1) + '@walletconnect/utils': 2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 - es-toolkit: 1.39.3 + es-toolkit: 1.44.0 events: 3.3.0 uint8arrays: 3.1.1 transitivePeerDependencies: @@ -7394,21 +7466,21 @@ snapshots: '@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)': + '@walletconnect/jsonrpc-ws-connection@1.0.16': dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/safe-json': 1.0.2 events: 3.3.0 - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 7.5.10 transitivePeerDependencies: - bufferutil - utf-8-validate - '@walletconnect/keyvaluestorage@1.1.1': + '@walletconnect/keyvaluestorage@1.1.1(ioredis@5.10.1)': dependencies: '@walletconnect/safe-json': 1.0.2 idb-keyval: 6.2.2 - unstorage: 1.17.4(idb-keyval@6.2.2) + unstorage: 1.17.5(idb-keyval@6.2.2)(ioredis@5.10.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -7450,16 +7522,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/sign-client@2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/core': 2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76) '@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.2 - '@walletconnect/utils': 2.23.2(typescript@5.9.3)(zod@3.25.76) + '@walletconnect/types': 2.23.7(ioredis@5.10.1) + '@walletconnect/utils': 2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -7490,12 +7562,12 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/types@2.23.2': + '@walletconnect/types@2.23.7(ioredis@5.10.1)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/keyvaluestorage': 1.1.1(ioredis@5.10.1) '@walletconnect/logger': 3.0.2 events: 3.3.0 transitivePeerDependencies: @@ -7519,19 +7591,19 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/universal-provider@2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76)': 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/keyvaluestorage': 1.1.1(ioredis@5.10.1) '@walletconnect/logger': 3.0.2 - '@walletconnect/sign-client': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/types': 2.23.2 - '@walletconnect/utils': 2.23.2(typescript@5.9.3)(zod@3.25.76) - es-toolkit: 1.39.3 + '@walletconnect/sign-client': 2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76) + '@walletconnect/types': 2.23.7(ioredis@5.10.1) + '@walletconnect/utils': 2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76) + es-toolkit: 1.44.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -7559,27 +7631,26 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.23.2(typescript@5.9.3)(zod@3.25.76)': + '@walletconnect/utils@2.23.7(ioredis@5.10.1)(typescript@6.0.3)(zod@3.25.76)': dependencies: - '@msgpack/msgpack': 3.1.2 + '@msgpack/msgpack': 3.1.3 '@noble/ciphers': 1.3.0 '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/keyvaluestorage': 1.1.1(ioredis@5.10.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.2 + '@walletconnect/types': 2.23.7(ioredis@5.10.1) '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 blakejs: 1.2.1 - bs58: 6.0.0 detect-browser: 5.3.0 - ox: 0.9.3(typescript@5.9.3)(zod@3.25.76) + ox: 0.9.3(typescript@6.0.3)(zod@3.25.76) uint8arrays: 3.1.1 transitivePeerDependencies: - '@azure/app-configuration' @@ -7613,35 +7684,33 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 - abitype@1.0.6(typescript@5.9.3)(zod@3.25.76): + abitype@1.0.6(typescript@6.0.3)(zod@3.25.76): optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 zod: 3.25.76 optional: true - abitype@1.2.3(typescript@5.9.3)(zod@3.22.4): + abitype@1.2.3(typescript@6.0.3)(zod@3.22.4): optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 zod: 3.22.4 - abitype@1.2.3(typescript@5.9.3)(zod@3.25.76): + abitype@1.2.3(typescript@6.0.3)(zod@3.25.76): optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 zod: 3.25.76 - acorn@8.15.0: {} + abitype@1.2.4(typescript@6.0.3)(zod@3.25.76): + optionalDependencies: + typescript: 6.0.3 + zod: 3.25.76 agent-base@7.1.4: {} - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - optional: true - - ajv@8.17.1: + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -7649,16 +7718,20 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.2.2: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 + ansi-styles@6.2.3: {} + ansis@4.2.0: {} anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 + picomatch: 2.3.2 argparse@2.0.1: {} @@ -7666,13 +7739,13 @@ snapshots: asn1.js@4.10.1: dependencies: - bn.js: 4.12.2 + bn.js: 4.12.3 inherits: 2.0.4 minimalistic-assert: 1.0.1 assert@2.1.0: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 is-nan: 1.3.2 object-is: 1.1.6 object.assign: 4.1.7 @@ -7680,10 +7753,6 @@ snapshots: assertion-error@2.0.1: {} - ast-types@0.16.1: - dependencies: - tslib: 2.8.1 - asynckit@0.4.0: optional: true @@ -7693,15 +7762,15 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axios-retry@4.5.0(axios@1.13.5): + axios-retry@4.5.0(axios@1.13.6): dependencies: - axios: 1.13.5 + axios: 1.13.6 is-retry-allowed: 2.2.0 optional: true - axios@1.13.5: + axios@1.13.6: dependencies: - follow-redirects: 1.15.11 + follow-redirects: 1.16.0 form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -7711,7 +7780,7 @@ snapshots: babel-dead-code-elimination@1.0.12: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.3 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 transitivePeerDependencies: @@ -7723,18 +7792,11 @@ snapshots: balanced-match@1.0.2: {} - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - optional: true - - base-x@4.0.1: {} - base-x@5.0.1: {} base64-js@1.5.1: {} - baseline-browser-mapping@2.9.19: {} + baseline-browser-mapping@2.10.28: {} bidi-js@1.0.3: dependencies: @@ -7742,22 +7804,13 @@ snapshots: big.js@6.2.2: {} - bignumber.js@9.3.1: {} - binary-extensions@2.3.0: {} blakejs@1.2.1: {} - bn.js@4.12.2: {} - - bn.js@5.2.2: {} + bn.js@4.12.3: {} - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - optional: true + bn.js@5.2.3: {} brace-expansion@2.1.0: dependencies: @@ -7771,7 +7824,7 @@ snapshots: browser-resolve@2.0.0: dependencies: - resolve: 1.22.11 + resolve: 1.22.12 browserify-aes@1.2.0: dependencies: @@ -7797,13 +7850,13 @@ snapshots: browserify-rsa@4.1.1: dependencies: - bn.js: 5.2.2 + bn.js: 5.2.3 randombytes: 2.1.0 safe-buffer: 5.2.1 browserify-sign@4.2.5: dependencies: - bn.js: 5.2.2 + bn.js: 5.2.3 browserify-rsa: 4.1.1 create-hash: 1.2.0 create-hmac: 1.1.7 @@ -7817,18 +7870,13 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.28.1: + browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001769 - electron-to-chromium: 1.5.286 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - optional: true + baseline-browser-mapping: 2.10.28 + caniuse-lite: 1.0.30001792 + electron-to-chromium: 1.5.353 + node-releases: 2.0.38 + update-browserslist-db: 1.2.3(browserslist@4.28.2) bs58@6.0.0: dependencies: @@ -7846,18 +7894,8 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bufferutil@4.1.0: - dependencies: - node-gyp-build: 4.8.4 - optional: true - builtin-status-codes@3.0.0: {} - c32check@2.0.0: - dependencies: - '@noble/hashes': 1.1.5 - base-x: 4.0.1 - cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -7865,7 +7903,7 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: + call-bind@1.0.9: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -7883,7 +7921,7 @@ snapshots: camelcase@5.3.1: {} - caniuse-lite@1.0.30001769: {} + caniuse-lite@1.0.30001792: {} chai@6.2.2: {} @@ -7932,11 +7970,19 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + clsx@1.2.1: optional: true clsx@2.1.1: {} + cluster-key-slot@1.1.2: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -7965,12 +8011,6 @@ snapshots: commander@14.0.2: optional: true - commander@14.0.3: - optional: true - - commander@2.20.3: - optional: true - compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -7982,45 +8022,46 @@ snapshots: constants-browserify@1.0.0: {} - conventional-changelog-angular@8.1.0: + conventional-changelog-angular@8.3.1: dependencies: compare-func: 2.0.0 - conventional-changelog-conventionalcommits@9.1.0: + conventional-changelog-conventionalcommits@9.3.1: dependencies: compare-func: 2.0.0 - conventional-commits-parser@6.2.1: + conventional-commits-parser@6.4.0: dependencies: + '@simple-libs/stream-utils': 1.2.0 meow: 13.2.0 convert-source-map@2.0.0: {} - cookie-es@1.2.2: {} + cookie-es@1.2.3: {} - cookie-es@2.0.0: {} + cookie-es@3.1.1: {} core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@6.2.0(@types/node@25.2.3)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): + cosmiconfig-typescript-loader@6.3.0(@types/node@25.6.2)(cosmiconfig@9.0.1(typescript@6.0.3))(typescript@6.0.3): dependencies: - '@types/node': 25.2.3 - cosmiconfig: 9.0.0(typescript@5.9.3) + '@types/node': 25.6.2 + cosmiconfig: 9.0.1(typescript@6.0.3) jiti: 2.6.1 - typescript: 5.9.3 + typescript: 6.0.3 - cosmiconfig@9.0.0(typescript@5.9.3): + cosmiconfig@9.0.1(typescript@6.0.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 create-ecdh@4.0.4: dependencies: - bn.js: 4.12.2 + bn.js: 4.12.3 elliptic: 6.6.1 create-hash@1.2.0: @@ -8070,31 +8111,24 @@ snapshots: randombytes: 2.1.0 randomfill: 1.0.4 - css-tree@3.1.0: + css-tree@3.2.1: dependencies: - mdn-data: 2.12.2 + mdn-data: 2.27.1 source-map-js: 1.2.1 - cssstyle@5.3.7: - dependencies: - '@asamuzakjp/css-color': 4.1.1 - '@csstools/css-syntax-patches-for-csstree': 1.0.26 - css-tree: 3.1.0 - lru-cache: 11.2.5 - csstype@3.2.3: {} - dargs@8.1.0: {} - - data-urls@7.0.0(@noble/hashes@2.0.1): + data-urls@7.0.0(@noble/hashes@2.2.0): dependencies: whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.0(@noble/hashes@2.0.1) + whatwg-url: 16.0.1(@noble/hashes@2.2.0) transitivePeerDependencies: - '@noble/hashes' dayjs@1.11.13: {} + dayjs@1.11.20: {} + debug@4.4.3(supports-color@10.2.2): dependencies: ms: 2.1.3 @@ -8130,12 +8164,13 @@ snapshots: defu@6.1.4: {} - delay@5.0.0: - optional: true + defu@6.1.7: {} delayed-stream@1.0.0: optional: true + denque@2.1.0: {} + des.js@1.1.0: dependencies: inherits: 2.0.4 @@ -8147,11 +8182,11 @@ snapshots: detect-libc@2.1.2: {} - diff@8.0.3: {} + diff@8.0.4: {} diffie-hellman@5.0.3: dependencies: - bn.js: 4.12.2 + bn.js: 4.12.3 miller-rabin: 4.0.1 randombytes: 2.1.0 @@ -8180,13 +8215,13 @@ snapshots: multipasta: 0.2.7 toml: 4.1.1 uuid: 13.0.2 - yaml: 2.9.0 + yaml: 2.8.4 - electron-to-chromium@1.5.286: {} + electron-to-chromium@1.5.353: {} elliptic@6.6.1: dependencies: - bn.js: 4.12.2 + bn.js: 4.12.3 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -8194,16 +8229,18 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} encode-utf8@1.0.3: {} - enhanced-resolve@5.18.4: + enhanced-resolve@5.21.2: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.3 - entities@6.0.1: {} + entities@8.0.0: {} env-paths@2.2.1: {} @@ -8215,7 +8252,7 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@1.7.0: {} + es-module-lexer@2.1.0: {} es-object-atoms@1.1.1: dependencies: @@ -8226,20 +8263,14 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 optional: true - es-toolkit@1.39.3: {} - - es6-promise@3.3.1: {} + es-toolkit@1.44.0: {} - es6-promise@4.2.8: - optional: true + es-toolkit@1.46.1: {} - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - optional: true + es6-promise@3.3.1: {} esbuild@0.27.2: optionalDependencies: @@ -8272,13 +8303,11 @@ snapshots: escalade@3.2.0: {} - esprima@4.0.1: {} - estree-walker@2.0.2: {} estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 eventemitter3@5.0.1: {} @@ -8291,9 +8320,6 @@ snapshots: expect-type@1.3.0: {} - eyes@0.1.8: - optional: true - fast-check@4.7.0: dependencies: pure-rand: 8.4.0 @@ -8302,14 +8328,11 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-stable-stringify@1.0.0: - optional: true - - fast-uri@3.1.0: {} + fast-uri@3.1.2: {} - fdir@6.5.0(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.4 fill-range@7.1.1: dependencies: @@ -8327,7 +8350,7 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - follow-redirects@1.15.11: + follow-redirects@1.16.0: optional: true for-each@0.3.5: @@ -8339,10 +8362,13 @@ snapshots: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.2 + hasown: 2.0.3 mime-types: 2.1.35 optional: true + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -8354,6 +8380,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.6.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -8364,7 +8392,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 math-intrinsics: 1.1.0 get-proto@1.0.1: @@ -8376,19 +8404,21 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - git-raw-commits@4.0.0: + git-raw-commits@5.0.1(conventional-commits-parser@6.4.0): dependencies: - dargs: 8.1.0 - meow: 12.1.1 - split2: 4.2.0 + '@conventional-changelog/git-client': 2.7.0(conventional-commits-parser@6.4.0) + meow: 13.2.0 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - global-directory@4.0.1: + global-directory@5.0.0: dependencies: - ini: 4.1.1 + ini: 6.0.0 goober@2.1.18(csstype@3.2.3): dependencies: @@ -8398,16 +8428,16 @@ snapshots: graceful-fs@4.2.11: {} - h3@1.15.5: + h3@1.15.11: dependencies: - cookie-es: 1.2.2 + cookie-es: 1.2.3 crossws: 0.3.5 - defu: 6.1.4 + defu: 6.1.7 destr: 2.0.5 iron-webcrypto: 1.2.1 node-mock-http: 1.0.4 radix3: 1.1.2 - ufo: 1.6.3 + ufo: 1.6.4 uncrypto: 0.1.3 has-property-descriptors@1.0.2: @@ -8437,7 +8467,7 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - hasown@2.0.2: + hasown@2.0.3: dependencies: function-bind: 1.1.2 @@ -8447,19 +8477,12 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - html-encoding-sniffer@6.0.0(@noble/hashes@2.0.1): + html-encoding-sniffer@6.0.0(@noble/hashes@2.2.0): dependencies: - '@exodus/bytes': 1.11.0(@noble/hashes@2.0.1) + '@exodus/bytes': 1.15.0(@noble/hashes@2.2.0) transitivePeerDependencies: - '@noble/hashes' - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - http2-client@1.3.5: {} https-browserify@1.0.0: {} @@ -8471,11 +8494,6 @@ snapshots: transitivePeerDependencies: - supports-color - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - optional: true - husky@9.1.7: {} ico-endec@0.1.6: {} @@ -8492,16 +8510,26 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-meta-resolve@4.2.0: {} - index-to-position@1.2.0: {} inherits@2.0.4: {} - ini@4.1.1: {} - ini@6.0.0: {} + ioredis@5.10.1: + dependencies: + '@ioredis/commands': 1.5.1 + cluster-key-slot: 1.1.2 + debug: 4.4.3(supports-color@10.2.2) + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + iron-webcrypto@1.2.1: {} is-arguments@1.2.0: @@ -8522,9 +8550,9 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 is-extglob@2.1.1: {} @@ -8544,7 +8572,7 @@ snapshots: is-nan@1.3.2: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 is-number@7.0.0: {} @@ -8560,7 +8588,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 is-retry-allowed@2.2.0: optional: true @@ -8573,41 +8601,19 @@ snapshots: isarray@2.0.5: {} - isbot@5.1.35: {} + isbot@5.1.40: {} isomorphic-timers-promises@1.0.1: {} - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) - optional: true - - isows@1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): - dependencies: - ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) - - jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + isows@1.0.7(ws@8.18.3): dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - optional: true + ws: 8.18.3 jiti@2.6.1: {} - jose@6.1.3: + jiti@2.7.0: {} + + jose@6.2.3: optional: true js-levenshtein@1.1.6: {} @@ -8618,31 +8624,31 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@28.0.0(@noble/hashes@2.0.1): + jsdom@29.1.1(@noble/hashes@2.2.0): dependencies: - '@acemir/cssom': 0.9.31 - '@asamuzakjp/dom-selector': 6.7.7 - '@exodus/bytes': 1.11.0(@noble/hashes@2.0.1) - cssstyle: 5.3.7 - data-urls: 7.0.0(@noble/hashes@2.0.1) + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) + '@exodus/bytes': 1.15.0(@noble/hashes@2.2.0) + css-tree: 3.2.1 + data-urls: 7.0.0(@noble/hashes@2.2.0) decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0(@noble/hashes@2.0.1) - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6(supports-color@10.2.2) + html-encoding-sniffer: 6.0.0(@noble/hashes@2.2.0) is-potential-custom-element-name: 1.0.1 - parse5: 8.0.0 + lru-cache: 11.3.6 + parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 6.0.0 - undici: 7.20.0 + tough-cookie: 6.0.1 + undici: 7.25.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.0(@noble/hashes@2.0.1) + whatwg-url: 16.0.1(@noble/hashes@2.2.0) xml-name-validator: 5.0.0 transitivePeerDependencies: - '@noble/hashes' - - supports-color jsesc@3.1.0: {} @@ -8652,68 +8658,65 @@ snapshots: json-schema-typed@8.0.2: {} - json-stringify-safe@5.0.1: - optional: true - json5@2.2.3: {} keyvaluestorage-interface@1.0.0: {} kubernetes-types@1.30.0: {} - launch-editor@2.12.0: + launch-editor@2.13.2: dependencies: picocolors: 1.1.1 shell-quote: 1.8.3 - lightningcss-android-arm64@1.30.2: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-darwin-arm64@1.30.2: + lightningcss-darwin-arm64@1.32.0: optional: true - lightningcss-darwin-x64@1.30.2: + lightningcss-darwin-x64@1.32.0: optional: true - lightningcss-freebsd-x64@1.30.2: + lightningcss-freebsd-x64@1.32.0: optional: true - lightningcss-linux-arm-gnueabihf@1.30.2: + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-linux-arm64-gnu@1.30.2: + lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.30.2: + lightningcss-linux-arm64-musl@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.30.2: + lightningcss-linux-x64-gnu@1.32.0: optional: true - lightningcss-linux-x64-musl@1.30.2: + lightningcss-linux-x64-musl@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.30.2: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.30.2: + lightningcss-win32-x64-msvc@1.32.0: optional: true - lightningcss@1.30.2: + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.30.2 - lightningcss-darwin-arm64: 1.30.2 - lightningcss-darwin-x64: 1.30.2 - lightningcss-freebsd-x64: 1.30.2 - lightningcss-linux-arm-gnueabihf: 1.30.2 - lightningcss-linux-arm64-gnu: 1.30.2 - lightningcss-linux-arm64-musl: 1.30.2 - lightningcss-linux-x64-gnu: 1.30.2 - lightningcss-linux-x64-musl: 1.30.2 - lightningcss-win32-arm64-msvc: 1.30.2 - lightningcss-win32-x64-msvc: 1.30.2 + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 lines-and-columns@1.2.4: {} @@ -8741,31 +8744,19 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.camelcase@4.3.0: {} + lodash.defaults@4.2.0: {} - lodash.clonedeep@4.5.0: {} + lodash.isarguments@3.1.0: {} - lodash.kebabcase@4.1.1: {} - - lodash.mergewith@4.6.2: {} - - lodash.snakecase@4.1.1: {} - - lodash.startcase@4.4.0: {} - - lodash.upperfirst@4.3.1: {} - - lru-cache@11.2.5: {} - - lru-cache@11.2.6: {} + lru-cache@11.3.6: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lucide-react@0.564.0(react@19.2.4): + lucide-react@1.14.0(react@19.2.6): dependencies: - react: 19.2.4 + react: 19.2.6 magic-string@0.30.21: dependencies: @@ -8775,7 +8766,7 @@ snapshots: md5.js@1.3.5: dependencies: - hash-base: 3.1.2 + hash-base: 3.0.5 inherits: 2.0.4 safe-buffer: 5.2.1 @@ -8786,25 +8777,13 @@ snapshots: is-buffer: 1.1.6 optional: true - mdn-data@2.12.2: {} - - meow@12.1.1: {} + mdn-data@2.27.1: {} meow@13.2.0: {} - micro-eth-signer@0.18.1: - dependencies: - '@noble/curves': 2.0.1 - '@noble/hashes': 2.0.1 - micro-packed: 0.8.0 - - micro-packed@0.8.0: - dependencies: - '@scure/base': 2.0.0 - miller-rabin@4.0.1: dependencies: - bn.js: 4.12.2 + bn.js: 4.12.3 brorand: 1.1.0 mime-db@1.52.0: @@ -8825,11 +8804,9 @@ snapshots: dependencies: brace-expansion: 2.1.0 - minimist@1.2.8: {} - - mipd@0.0.7(typescript@5.9.3): + mipd@0.0.7(typescript@6.0.3): optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 mrmime@2.0.1: {} @@ -8855,7 +8832,7 @@ snapshots: multipasta@0.2.7: {} - nanoid@3.3.11: {} + nanoid@3.3.12: {} node-fetch-h2@2.3.0: dependencies: @@ -8872,16 +8849,13 @@ snapshots: detect-libc: 2.1.2 optional: true - node-gyp-build@4.8.4: - optional: true - node-mock-http@1.0.4: {} node-readfiles@0.2.0: dependencies: es6-promise: 3.3.1 - node-releases@2.0.27: {} + node-releases@2.0.38: {} node-stdlib-browser@1.3.1: dependencies: @@ -8950,14 +8924,14 @@ snapshots: object-is@1.1.6: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 object-keys@1.1.1: {} object.assign@4.1.7: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -8970,7 +8944,7 @@ snapshots: dependencies: destr: 2.0.5 node-fetch-native: 1.6.7 - ufo: 1.6.3 + ufo: 1.6.4 on-exit-leak-free@2.1.2: {} @@ -8980,19 +8954,19 @@ snapshots: yaml: 2.2.2 yargs: 17.7.2 - openapi-typescript@7.13.0(typescript@5.9.3): + openapi-typescript@7.13.0(typescript@6.0.3): dependencies: '@redocly/openapi-core': 1.34.14(supports-color@10.2.2) ansi-colors: 4.1.3 change-case: 5.4.4 parse-json: 8.3.0 supports-color: 10.2.2 - typescript: 5.9.3 + typescript: 6.0.3 yargs-parser: 21.1.1 os-browserify@0.3.0: {} - ox@0.12.1(typescript@5.9.3)(zod@3.22.4): + ox@0.14.20(typescript@6.0.3)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -9000,14 +8974,14 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.9.3)(zod@3.22.4) + abitype: 1.2.3(typescript@6.0.3)(zod@3.22.4) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - zod - ox@0.12.1(typescript@5.9.3)(zod@3.25.76): + ox@0.14.20(typescript@6.0.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -9015,29 +8989,29 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + abitype: 1.2.3(typescript@6.0.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - zod - ox@0.6.9(typescript@5.9.3)(zod@3.25.76): + ox@0.6.9(typescript@6.0.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + abitype: 1.2.4(typescript@6.0.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - zod optional: true - ox@0.9.3(typescript@5.9.3)(zod@3.25.76): + ox@0.9.3(typescript@6.0.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -9045,10 +9019,10 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + abitype: 1.2.4(typescript@6.0.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - zod @@ -9097,9 +9071,9 @@ snapshots: index-to-position: 1.2.0 type-fest: 4.41.0 - parse5@8.0.0: + parse5@8.0.1: dependencies: - entities: 6.0.1 + entities: 8.0.0 path-browserify@1.0.1: {} @@ -9120,9 +9094,9 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.3: {} + picomatch@4.0.4: {} pino-abstract-transport@2.0.0: dependencies: @@ -9144,14 +9118,18 @@ snapshots: sonic-boom: 4.2.1 thread-stream: 3.1.0 - pixelmatch@7.1.0: - dependencies: - pngjs: 7.0.0 - pkg-dir@5.0.0: dependencies: find-up: 5.0.0 + playwright-core@1.59.1: {} + + playwright@1.59.1: + dependencies: + playwright-core: 1.59.1 + optionalDependencies: + fsevents: 2.3.2 + pluralize@8.0.0: {} pngjs@5.0.0: {} @@ -9160,16 +9138,16 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.6: + postcss@8.5.14: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 preact@10.24.2: optional: true - prettier@3.8.1: {} + prettier@3.8.3: {} process-nextick-args@2.0.1: {} @@ -9184,7 +9162,7 @@ snapshots: public-encrypt@4.0.3: dependencies: - bn.js: 4.12.2 + bn.js: 4.12.3 browserify-rsa: 4.1.1 create-hash: 1.2.0 parse-asn1: 5.1.9 @@ -9204,7 +9182,7 @@ snapshots: pngjs: 5.0.0 yargs: 15.4.1 - qs@6.14.1: + qs@6.15.1: dependencies: side-channel: 1.1.0 @@ -9225,14 +9203,12 @@ snapshots: randombytes: 2.1.0 safe-buffer: 5.2.1 - react-dom@19.2.4(react@19.2.4): + react-dom@19.2.6(react@19.2.6): dependencies: - react: 19.2.4 + react: 19.2.6 scheduler: 0.27.0 - react-refresh@0.18.0: {} - - react@19.2.4: {} + react@19.2.6: {} readable-stream@2.3.8: dependencies: @@ -9252,19 +9228,17 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.1 + picomatch: 2.3.2 readdirp@5.0.0: {} real-require@0.2.0: {} - recast@0.23.11: + redis-errors@1.2.0: {} + + redis-parser@3.0.0: dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.8.1 + redis-errors: 1.2.0 reftools@1.1.9: {} @@ -9282,9 +9256,10 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.11: + resolve@1.22.12: dependencies: - is-core-module: 2.16.1 + es-errors: 1.3.0 + is-core-module: 2.16.2 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -9293,54 +9268,26 @@ snapshots: hash-base: 3.1.2 inherits: 2.0.4 - rollup@4.57.1: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.57.1 - '@rollup/rollup-android-arm64': 4.57.1 - '@rollup/rollup-darwin-arm64': 4.57.1 - '@rollup/rollup-darwin-x64': 4.57.1 - '@rollup/rollup-freebsd-arm64': 4.57.1 - '@rollup/rollup-freebsd-x64': 4.57.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 - '@rollup/rollup-linux-arm-musleabihf': 4.57.1 - '@rollup/rollup-linux-arm64-gnu': 4.57.1 - '@rollup/rollup-linux-arm64-musl': 4.57.1 - '@rollup/rollup-linux-loong64-gnu': 4.57.1 - '@rollup/rollup-linux-loong64-musl': 4.57.1 - '@rollup/rollup-linux-ppc64-gnu': 4.57.1 - '@rollup/rollup-linux-ppc64-musl': 4.57.1 - '@rollup/rollup-linux-riscv64-gnu': 4.57.1 - '@rollup/rollup-linux-riscv64-musl': 4.57.1 - '@rollup/rollup-linux-s390x-gnu': 4.57.1 - '@rollup/rollup-linux-x64-gnu': 4.57.1 - '@rollup/rollup-linux-x64-musl': 4.57.1 - '@rollup/rollup-openbsd-x64': 4.57.1 - '@rollup/rollup-openharmony-arm64': 4.57.1 - '@rollup/rollup-win32-arm64-msvc': 4.57.1 - '@rollup/rollup-win32-ia32-msvc': 4.57.1 - '@rollup/rollup-win32-x64-gnu': 4.57.1 - '@rollup/rollup-win32-x64-msvc': 4.57.1 - fsevents: 2.3.3 - - rpc-websockets@9.3.3: + rolldown@1.0.0-rc.18: dependencies: - '@swc/helpers': 0.5.18 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@oxc-project/types': 0.128.0 + '@rolldown/pluginutils': 1.0.0-rc.18 optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 - optional: true - - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 + '@rolldown/binding-android-arm64': 1.0.0-rc.18 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.18 + '@rolldown/binding-darwin-x64': 1.0.0-rc.18 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.18 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.18 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.18 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.18 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.18 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.18 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.18 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.18 safe-buffer@5.1.2: {} @@ -9366,11 +9313,13 @@ snapshots: semver@7.7.3: {} - seroval-plugins@1.5.0(seroval@1.5.0): + semver@7.8.0: {} + + seroval-plugins@1.5.4(seroval@1.5.4): dependencies: - seroval: 1.5.0 + seroval: 1.5.4 - seroval@1.5.0: {} + seroval@1.5.4: {} set-blocking@2.0.0: {} @@ -9451,7 +9400,7 @@ snapshots: should-type-adaptors: 1.1.0 should-util: 1.0.1 - side-channel-list@1.0.0: + side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -9475,7 +9424,7 @@ snapshots: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 - side-channel-list: 1.0.0 + side-channel-list: 1.0.1 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -9493,41 +9442,36 @@ snapshots: slow-redact@0.3.2: {} - solid-js@1.9.11: + solid-js@1.9.12: dependencies: csstype: 3.2.3 - seroval: 1.5.0 - seroval-plugins: 1.5.0(seroval@1.5.0) + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) sonic-boom@4.2.1: dependencies: atomic-sleep: 1.0.0 - sonner@2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + sonner@2.0.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) source-map-js@1.2.1: {} - source-map@0.6.1: {} - - source-map@0.7.6: {} - split2@4.2.0: {} stackback@0.0.2: {} - std-env@3.10.0: {} + standard-as-callback@2.1.0: {} + + std-env@4.1.0: {} stream-browserify@3.0.0: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 - stream-chain@2.2.5: - optional: true - stream-http@3.2.0: dependencies: builtin-status-codes: 3.0.0 @@ -9535,17 +9479,18 @@ snapshots: readable-stream: 3.6.2 xtend: 4.0.2 - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - optional: true - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -9558,8 +9503,9 @@ snapshots: dependencies: ansi-regex: 5.0.1 - superstruct@2.0.2: - optional: true + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 supports-color@10.2.2: {} @@ -9583,16 +9529,11 @@ snapshots: symbol-tree@3.2.4: {} - tabbable@6.4.0: {} - - tailwind-merge@3.4.0: {} + tailwind-merge@3.5.0: {} - tailwindcss@4.1.18: {} + tailwindcss@4.3.0: {} - tapable@2.3.0: {} - - text-encoding-utf-8@1.0.2: - optional: true + tapable@2.3.3: {} thread-stream@3.1.0: dependencies: @@ -9602,26 +9543,22 @@ snapshots: dependencies: setimmediate: 1.0.5 - tiny-invariant@1.3.3: {} - - tiny-warning@1.0.3: {} - tinybench@2.9.0: {} - tinyexec@1.0.2: {} + tinyexec@1.1.2: {} - tinyglobby@0.2.15: + tinyglobby@0.2.16: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 - tinyrainbow@3.0.3: {} + tinyrainbow@3.1.0: {} - tldts-core@7.0.22: {} + tldts-core@7.0.30: {} - tldts@7.0.22: + tldts@7.0.30: dependencies: - tldts-core: 7.0.22 + tldts-core: 7.0.30 to-buffer@1.2.2: dependencies: @@ -9639,9 +9576,9 @@ snapshots: totalist@3.0.1: {} - tough-cookie@6.0.0: + tough-cookie@6.0.1: dependencies: - tldts: 7.0.22 + tldts: 7.0.30 tr46@0.0.3: {} @@ -9651,7 +9588,8 @@ snapshots: tslib@1.14.1: {} - tslib@2.8.1: {} + tslib@2.8.1: + optional: true tsx@4.21.0: dependencies: @@ -9662,32 +9600,14 @@ snapshots: tty-browserify@0.0.1: {} - turbo-darwin-64@2.8.7: - optional: true - - turbo-darwin-arm64@2.8.7: - optional: true - - turbo-linux-64@2.8.7: - optional: true - - turbo-linux-arm64@2.8.7: - optional: true - - turbo-windows-64@2.8.7: - optional: true - - turbo-windows-arm64@2.8.7: - optional: true - - turbo@2.8.7: + turbo@2.9.12: optionalDependencies: - turbo-darwin-64: 2.8.7 - turbo-darwin-arm64: 2.8.7 - turbo-linux-64: 2.8.7 - turbo-linux-arm64: 2.8.7 - turbo-windows-64: 2.8.7 - turbo-windows-arm64: 2.8.7 + '@turbo/darwin-64': 2.9.12 + '@turbo/darwin-arm64': 2.9.12 + '@turbo/linux-64': 2.9.12 + '@turbo/linux-arm64': 2.9.12 + '@turbo/windows-64': 2.9.12 + '@turbo/windows-arm64': 2.9.12 tw-animate-css@1.4.0: {} @@ -9699,9 +9619,9 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.15 - typescript@5.9.3: {} + typescript@6.0.3: {} - ufo@1.6.3: {} + ufo@1.6.4: {} uint8arrays@3.1.1: dependencies: @@ -9722,40 +9642,38 @@ snapshots: uncrypto@0.1.3: {} - undici-types@5.26.5: {} + undici-types@7.19.2: {} - undici-types@7.16.0: {} - - undici-types@7.21.0: + undici-types@7.25.0: optional: true - undici@7.20.0: {} + undici@7.25.0: {} undici@8.2.0: {} - unplugin@2.3.11: + unplugin@3.0.0: dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.15.0 - picomatch: 4.0.3 + picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 - unstorage@1.17.4(idb-keyval@6.2.2): + unstorage@1.17.5(idb-keyval@6.2.2)(ioredis@5.10.1): dependencies: anymatch: 3.1.3 chokidar: 5.0.0 destr: 2.0.5 - h3: 1.15.5 - lru-cache: 11.2.6 + h3: 1.15.11 + lru-cache: 11.3.6 node-fetch-native: 1.6.7 ofetch: 1.5.1 - ufo: 1.6.3 + ufo: 1.6.4 optionalDependencies: idb-keyval: 6.2.2 + ioredis: 5.10.1 - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -9764,20 +9682,15 @@ snapshots: url@0.11.4: dependencies: punycode: 1.4.1 - qs: 6.14.1 - - use-sync-external-store@1.4.0(react@19.2.4): - dependencies: - react: 19.2.4 + qs: 6.15.1 - use-sync-external-store@1.6.0(react@19.2.4): + use-sync-external-store@1.4.0(react@19.2.6): dependencies: - react: 19.2.4 + react: 19.2.6 - utf-8-validate@5.0.10: + use-sync-external-store@1.6.0(react@19.2.6): dependencies: - node-gyp-build: 4.8.4 - optional: true + react: 19.2.6 util-deprecate@1.0.2: {} @@ -9789,129 +9702,115 @@ snapshots: is-typed-array: 1.1.15 which-typed-array: 1.1.20 - uuid@13.0.2: {} - - uuid@8.3.2: - optional: true + uuid@11.1.1: {} - uuid@9.0.1: {} + uuid@13.0.2: {} - valibot@1.2.0(typescript@5.9.3): + valibot@1.3.1(typescript@6.0.3): optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 - valtio@2.1.7(@types/react@19.2.14)(react@19.2.4): + valtio@2.1.7(@types/react@19.2.14)(react@19.2.6): dependencies: proxy-compare: 3.0.1 optionalDependencies: '@types/react': 19.2.14 - react: 19.2.4 + react: 19.2.6 - viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4): + viem@2.48.11(typescript@6.0.3)(zod@3.22.4): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.9.3)(zod@3.22.4) - isows: 1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - ox: 0.12.1(typescript@5.9.3)(zod@3.22.4) - ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + abitype: 1.2.3(typescript@6.0.3)(zod@3.22.4) + isows: 1.0.7(ws@8.18.3) + ox: 0.14.20(typescript@6.0.3)(zod@3.22.4) + ws: 8.18.3 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.48.11(typescript@6.0.3)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) - isows: 1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - ox: 0.12.1(typescript@5.9.3)(zod@3.25.76) - ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + abitype: 1.2.3(typescript@6.0.3)(zod@3.25.76) + isows: 1.0.7(ws@8.18.3) + ox: 0.14.20(typescript@6.0.3)(zod@3.25.76) + ws: 8.18.3 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - vite-plugin-node-polyfills@0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)): + vite-plugin-node-polyfills@0.26.0(patch_hash=2f652eeb27eb59e7cd6a47bd85f51fe0133a1fdcd7fac68c42e21c232383a67a)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.57.1) + '@rollup/plugin-inject': 5.0.5 node-stdlib-browser: 1.3.1 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) transitivePeerDependencies: - rollup - vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0): + vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4): dependencies: - esbuild: 0.27.2 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.57.1 - tinyglobby: 0.2.15 + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.14 + rolldown: 1.0.0-rc.18 + tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 25.6.2 + esbuild: 0.27.2 fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.30.2 + jiti: 2.7.0 tsx: 4.21.0 - yaml: 2.9.0 + yaml: 2.8.4 - vitest-browser-react@2.0.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18): + vitest-browser-react@2.2.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5): dependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - vitest: 4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + vitest: 4.1.5(@types/node@25.6.2)(@vitest/browser-playwright@4.1.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - vitest@4.0.18(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@28.0.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0): + vitest@4.1.5(@types/node@25.6.2)(@vitest/browser-playwright@4.1.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)): dependencies: - '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0)) - '@vitest/pretty-format': 4.0.18 - '@vitest/runner': 4.0.18 - '@vitest/snapshot': 4.0.18 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 - es-module-lexer: 1.7.0 + '@vitest/expect': 4.1.5 + '@vitest/mocker': 4.1.5(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) + '@vitest/pretty-format': 4.1.5 + '@vitest/runner': 4.1.5 + '@vitest/snapshot': 4.1.5 + '@vitest/spy': 4.1.5 + '@vitest/utils': 4.1.5 + es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 + picomatch: 4.0.4 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0) + tinyexec: 1.1.2 + tinyglobby: 0.2.16 + tinyrainbow: 3.1.0 + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.2.3 - '@vitest/browser-playwright': 4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.0.18) - jsdom: 28.0.0(@noble/hashes@2.0.1) + '@types/node': 25.6.2 + '@vitest/browser-playwright': 4.1.5(playwright@1.59.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4))(vitest@4.1.5) + jsdom: 29.1.1(@noble/hashes@2.2.0) transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - yaml vm-browserify@1.1.2: {} @@ -9919,28 +9818,27 @@ snapshots: dependencies: xml-name-validator: 5.0.0 - wagmi@3.4.3(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.4))(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)): + wagmi@3.6.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@tanstack/query-core@5.100.9)(@tanstack/react-query@5.100.9(react@19.2.6))(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)): dependencies: - '@tanstack/react-query': 5.90.21(react@19.2.4) - '@wagmi/connectors': 7.1.7(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - '@wagmi/core': 3.3.3(@tanstack/query-core@5.90.20)(@types/react@19.2.14)(ox@0.12.1(typescript@5.9.3)(zod@3.25.76))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - react: 19.2.4 - use-sync-external-store: 1.4.0(react@19.2.4) - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@tanstack/react-query': 5.100.9(react@19.2.6) + '@wagmi/connectors': 8.0.11(@safe-global/safe-apps-provider@0.18.6(typescript@6.0.3)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(typescript@6.0.3)(zod@3.25.76))(@wagmi/core@3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)))(typescript@6.0.3)(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) + '@wagmi/core': 3.4.9(@tanstack/query-core@5.100.9)(@types/react@19.2.14)(react@19.2.6)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.6))(viem@2.48.11(typescript@6.0.3)(zod@3.25.76)) + react: 19.2.6 + use-sync-external-store: 1.4.0(react@19.2.6) + viem: 2.48.11(typescript@6.0.3)(zod@3.25.76) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - '@base-org/account' - '@coinbase/wallet-sdk' - - '@gemini-wallet/core' - - '@metamask/sdk' + - '@metamask/connect-evm' - '@safe-global/safe-apps-provider' - '@safe-global/safe-apps-sdk' - '@tanstack/query-core' - '@types/react' - '@walletconnect/ethereum-provider' + - accounts - immer - - ox - porto webidl-conversions@3.0.1: {} @@ -9951,9 +9849,9 @@ snapshots: whatwg-mimetype@5.0.0: {} - whatwg-url@16.0.0(@noble/hashes@2.0.1): + whatwg-url@16.0.1(@noble/hashes@2.2.0): dependencies: - '@exodus/bytes': 1.11.0(@noble/hashes@2.0.1) + '@exodus/bytes': 1.15.0(@noble/hashes@2.2.0) tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: @@ -9969,7 +9867,7 @@ snapshots: which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 for-each: 0.3.5 get-proto: 1.0.1 @@ -9993,25 +9891,17 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 - ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 + ws@7.5.10: {} - ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 + ws@8.18.3: {} - ws@8.20.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 + ws@8.20.0: {} xml-name-validator@5.0.0: {} @@ -10031,7 +9921,7 @@ snapshots: yaml@2.2.2: {} - yaml@2.9.0: {} + yaml@2.8.4: {} yargs-parser@18.1.3: dependencies: @@ -10040,6 +9930,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -10064,27 +9956,43 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yocto-queue@0.1.0: {} zod@3.22.4: {} zod@3.25.76: {} - zustand@5.0.0(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)): + zustand@5.0.0(@types/react@19.2.14)(react@19.2.6)(use-sync-external-store@1.4.0(react@19.2.6)): optionalDependencies: '@types/react': 19.2.14 - react: 19.2.4 - use-sync-external-store: 1.4.0(react@19.2.4) + react: 19.2.6 + use-sync-external-store: 1.4.0(react@19.2.6) - zustand@5.0.0(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): + zustand@5.0.0(@types/react@19.2.14)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)): optionalDependencies: '@types/react': 19.2.14 - react: 19.2.4 - use-sync-external-store: 1.6.0(react@19.2.4) + react: 19.2.6 + use-sync-external-store: 1.6.0(react@19.2.6) + + zustand@5.0.3(@types/react@19.2.14)(react@19.2.6)(use-sync-external-store@1.4.0(react@19.2.6)): + optionalDependencies: + '@types/react': 19.2.14 + react: 19.2.6 + use-sync-external-store: 1.4.0(react@19.2.6) + optional: true - zustand@5.0.3(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): + zustand@5.0.3(@types/react@19.2.14)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)): optionalDependencies: '@types/react': 19.2.14 - react: 19.2.4 - use-sync-external-store: 1.6.0(react@19.2.4) + react: 19.2.6 + use-sync-external-store: 1.6.0(react@19.2.6) optional: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index bfc8131..8835acf 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,61 +3,61 @@ packages: - apps/* catalog: - '@base-ui/react': ^1.2.0 - '@biomejs/biome': ^2.3.15 - '@commitlint/cli': ^20.4.1 - '@commitlint/config-conventional': ^20.4.1 + '@base-ui/react': ^1.4.1 + '@biomejs/biome': ^2.4.14 + '@commitlint/cli': ^21.0.0 + '@commitlint/config-conventional': ^21.0.0 '@effect/atom-react': ^4.0.0-beta.65 '@effect/language-service': ^0.85.1 '@effect/openapi-generator': ^4.0.0-beta.65 '@effect/platform-node': ^4.0.0-beta.65 - '@ledgerhq/wallet-api-client': ^1.13.0 '@lucas-barake/effect-form-react': ^0.24.0 - '@nktkas/hyperliquid': ^0.31.0 - '@reown/appkit': ^1.8.18 - '@reown/appkit-adapter-wagmi': ^1.8.18 + '@nktkas/hyperliquid': ^0.32.2 + '@reown/appkit': ^1.8.19 + '@reown/appkit-adapter-wagmi': ^1.8.19 + '@rolldown/plugin-babel': ^0.2.0 '@stakekit/common': ^0.0.61 - '@tailwindcss/vite': ^4.0.6 - '@tanstack/devtools-vite': ^0.5.1 - '@tanstack/react-devtools': ^0.9.5 - '@tanstack/react-query': ^5.90.21 - '@tanstack/react-router': ^1.159.5 - '@tanstack/react-router-devtools': ^1.159.5 - '@tanstack/react-virtual': ^3.13.18 - '@tanstack/router-cli': ^1.159.5 - '@tanstack/router-plugin': ^1.159.5 - '@types/node': ^25.2.3 + '@tailwindcss/vite': ^4.3.0 + '@tanstack/devtools-vite': ^0.6.0 + '@tanstack/react-devtools': ^0.10.2 + '@tanstack/react-query': ^5.100.9 + '@tanstack/react-router': ^1.169.2 + '@tanstack/react-router-devtools': ^1.166.13 + '@tanstack/react-virtual': ^3.13.24 + '@tanstack/router-cli': ^1.166.43 + '@tanstack/router-plugin': ^1.167.35 + '@types/node': ^25.6.2 '@types/react': ^19.2.14 '@types/react-dom': ^19.2.0 '@vite-pwa/assets-generator': ^1.0.2 - '@vitejs/plugin-react': ^5.1.4 - '@vitest/browser-playwright': ^4.0.18 + '@vitejs/plugin-react': ^6.0.1 + '@vitest/browser-playwright': ^4.1.5 babel-plugin-react-compiler: ^1.0.0 class-variance-authority: ^0.7.1 clsx: ^2.1.1 effect: ^4.0.0-beta.65 husky: ^9.1.7 - jsdom: ^28.0.0 - lucide-react: ^0.564.0 + jsdom: ^29.1.1 + lucide-react: ^1.14.0 openapi-filter: ^3.2.3 - react: ^19.2.0 - react-dom: ^19.2.0 + react: ^19.2.6 + react-dom: ^19.2.6 sonner: ^2.0.7 - tailwind-merge: ^3.0.2 - tailwindcss: ^4.0.6 + tailwind-merge: ^3.5.0 + tailwindcss: ^4.3.0 tsx: ^4.21.0 - turbo: ^2.8.7 + turbo: ^2.9.12 tw-animate-css: ^1.3.6 - typescript: ^5.7.2 - viem: ^2.45.3 - vite: ^7.3.1 - vite-plugin-node-polyfills: ^0.25.0 - vitest: ^4.0.18 - vitest-browser-react: ^2.0.4 - wagmi: ^3.4.3 + typescript: ^6.0.3 + viem: ^2.48.11 + vite: ^8.0.11 + vite-plugin-node-polyfills: ^0.26.0 + vitest: ^4.1.5 + vitest-browser-react: ^2.2.0 + wagmi: ^3.6.11 nodeLinker: hoisted -autoInstallPeers: false patchedDependencies: '@lucas-barake/effect-form-react@0.24.0': patches/@lucas-barake__effect-form-react@0.24.0.patch '@lucas-barake/effect-form@0.23.0': patches/@lucas-barake__effect-form@0.23.0.patch + vite-plugin-node-polyfills@0.26.0: patches/vite-plugin-node-polyfills@0.26.0.patch diff --git a/tsconfig.base.json b/tsconfig.base.json index d33d148..8ab18e4 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -4,9 +4,7 @@ "composite": true, "incremental": true, "moduleDetection": "force", - "downlevelIteration": true, "resolveJsonModule": true, - "esModuleInterop": false, "skipLibCheck": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, diff --git a/vercel.json b/vercel.json deleted file mode 100644 index 1323cda..0000000 --- a/vercel.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "rewrites": [ - { - "source": "/(.*)", - "destination": "/index.html" - } - ] -} From d4a6324b75b660f50240ce62f2d57d29879154f9 Mon Sep 17 00:00:00 2001 From: Petar Todorovic Date: Fri, 15 May 2026 16:57:43 +0200 Subject: [PATCH 3/4] fix: ci --- .github/workflows/ci.yml | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 29fbbaa..de6abb9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,31 +1,43 @@ -name: Continuous Integration +name: CI on: pull_request: - types: - - opened - - reopened - - synchronize + +permissions: + contents: read concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + group: ci-${{ github.workflow }}-${{ github.event.pull_request.number }} cancel-in-progress: true jobs: - check: + checks: + name: Lint, build and test runs-on: ubuntu-latest + steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: jdx/mise-action@v2 + - name: Install mise + run: | + curl https://mise.run | MISE_VERSION=v2026.5.6 sh + echo "$HOME/.local/bin" >> "$GITHUB_PATH" + echo "$HOME/.local/share/mise/shims" >> "$GITHUB_PATH" + export PATH="$HOME/.local/bin:$HOME/.local/share/mise/shims:$PATH" + mise install - - run: pnpm install --frozen-lockfile + - name: Install dependencies + run: pnpm install --frozen-lockfile - name: Install Playwright Browsers run: pnpm exec playwright install --with-deps - - run: pnpm run lint + - name: Lint + run: pnpm lint - - run: pnpm run build + - name: Build + run: pnpm build - - run: pnpm run test + - name: Test + run: pnpm test From 07a2c7ad0d5ed5c632b7973c97b15950f03f1e8d Mon Sep 17 00:00:00 2001 From: Petar Todorovic Date: Fri, 15 May 2026 17:05:29 +0200 Subject: [PATCH 4/4] fix: tests --- packages/common/src/services/events.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/common/src/services/events.ts b/packages/common/src/services/events.ts index a315d64..7c934da 100644 --- a/packages/common/src/services/events.ts +++ b/packages/common/src/services/events.ts @@ -59,7 +59,5 @@ export class EventsService extends Context.Service()( }), }, ) { - static readonly layer = Layer.effect(this, this.make).pipe( - Layer.provide(Reactivity.layer), - ); + static readonly layer = Layer.effect(this, this.make); }