diff --git a/package.json b/package.json index 47bfac3025..9d872d6f6a 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,10 @@ "prepare": "pnpm husky" }, "dependencies": { + "@aiquant/lucid-cardano": "^0.10.11", + "@aiquant/minswap-sdk": "^0.0.0", + "@aiquant/sundaeswap-core": "^1.2.10", + "@blockfrost/blockfrost-js": "^5.7.0", "@coral-xyz/anchor": "^0.29.0", "@ethersproject/abstract-provider": "5.7.0", "@ethersproject/address": "5.7.0", @@ -73,6 +77,7 @@ "@solflare-wallet/utl-sdk": "^1.4.0", "@uniswap/permit2-sdk": "^1.3.1", "@uniswap/router-sdk": "^2.0.4", + "@sundaeswap/asset": "^1.0.10", "@uniswap/sdk": "3.0.3", "@uniswap/sdk-core": "^5.9.0", "@uniswap/smart-order-router": "^3.59.0", @@ -88,6 +93,7 @@ "bigint-buffer": "1.1.5", "bn.js": "5.2.1", "brotli": "1.3.2", + "core-js": "^3.43.0", "dayjs": "^1.11.13", "decimal.js": "^10.5.0", "decimal.js-light": "^2.5.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad8e29402d..f617692881 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,9 +19,21 @@ importers: .: dependencies: + '@aiquant/lucid-cardano': + specifier: ^0.10.11 + version: 0.10.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@aiquant/minswap-sdk': + specifier: ^0.0.0 + version: 0.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@aiquant/sundaeswap-core': + specifier: ^1.2.10 + version: 1.2.10(@aiquant/lucid-cardano@0.10.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@sundaeswap/asset@1.0.11)(@sundaeswap/bigint-math@0.6.3)(@sundaeswap/cpp@1.0.13(@sundaeswap/asset@1.0.11)(@sundaeswap/bigint-math@0.6.3)(@sundaeswap/fraction@1.0.8))(@sundaeswap/fraction@1.0.8) + '@blockfrost/blockfrost-js': + specifier: ^5.7.0 + version: 5.7.0 '@coral-xyz/anchor': specifier: ^0.29.0 - version: 0.29.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 0.29.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@ethersproject/abstract-provider': specifier: 5.7.0 version: 5.7.0 @@ -57,40 +69,40 @@ importers: version: 4.1.0(@sinclair/typebox@0.33.22) '@ledgerhq/hw-app-eth': specifier: ^6.45.10 - version: 6.45.10 + version: 6.45.18 '@ledgerhq/hw-app-solana': specifier: ^7.5.0 - version: 7.5.0 + version: 7.5.3 '@ledgerhq/hw-transport-node-hid': specifier: ^6.29.8 - version: 6.29.8 + version: 6.29.11 '@ledgerhq/hw-transport-node-hid-singleton': specifier: ^6.31.8 - version: 6.31.8 + version: 6.31.11 '@meteora-ag/dlmm': specifier: 1.3.12 - version: 1.3.12(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 1.3.12(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) '@orca-so/common-sdk': specifier: ^0.6.11 - version: 0.6.11(@solana/spl-token@0.4.8(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.6.11(@solana/spl-token@0.4.8(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)) '@pancakeswap/permit2-sdk': specifier: ^1.1.5 - version: 1.1.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 1.1.6(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@pancakeswap/sdk': specifier: ^5.8.16 - version: 5.8.16(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 5.8.17(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@pancakeswap/smart-router': specifier: ^7.5.2 - version: 7.5.2(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 7.5.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.10) '@pancakeswap/swap-sdk-core': specifier: ^1.5.0 version: 1.5.0 '@pancakeswap/universal-router-sdk': specifier: ^1.4.14 - version: 1.4.14(abitype@1.0.9(typescript@5.8.3)(zod@3.24.4))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(lodash@4.17.21)(react@18.3.1)(tiny-invariant@1.3.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.37.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + version: 1.4.15(abitype@1.1.0(typescript@5.9.2)(zod@3.25.76))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(lodash@4.17.21)(react@18.3.1)(tiny-invariant@1.3.3)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) '@pancakeswap/v2-sdk': specifier: ^1.1.5 - version: 1.1.5(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 1.1.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@pancakeswap/v3-core': specifier: ^1.0.2 version: 1.0.2 @@ -99,34 +111,37 @@ importers: version: 1.0.2 '@pancakeswap/v3-sdk': specifier: ^3.9.5 - version: 3.9.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 3.9.6(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@pancakeswap/v4-sdk': specifier: ^0.1.8 - version: 0.1.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 0.1.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@raydium-io/raydium-sdk-v2': specifier: 0.1.141-alpha - version: 0.1.141-alpha(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 0.1.141-alpha(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) '@sinclair/typebox': specifier: ^0.33.22 version: 0.33.22 '@solana/spl-token': specifier: 0.4.8 - version: 0.4.8(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 0.4.8(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) '@solana/spl-token-registry': specifier: ^0.2.4574 version: 0.2.4574 '@solana/web3.js': specifier: ^1.98.0 - version: 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@solflare-wallet/utl-sdk': specifier: ^1.4.0 - version: 1.4.0(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 1.4.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/node@15.14.9)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@sundaeswap/asset': + specifier: ^1.0.10 + version: 1.0.11 '@uniswap/permit2-sdk': specifier: ^1.3.1 - version: 1.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 1.4.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@uniswap/router-sdk': specifier: ^2.0.4 - version: 2.0.4(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.4(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@uniswap/sdk': specifier: 3.0.3 version: 3.0.3(@ethersproject/address@5.7.0)(@ethersproject/contracts@5.7.0)(@ethersproject/networks@5.7.0)(@ethersproject/providers@5.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@ethersproject/solidity@5.7.0) @@ -135,10 +150,10 @@ importers: version: 5.9.0 '@uniswap/smart-order-router': specifier: ^3.59.0 - version: 3.59.0(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(jsbi@3.2.5)(utf-8-validate@5.0.10) + version: 3.59.0(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(jsbi@3.2.5)(utf-8-validate@5.0.10) '@uniswap/universal-router-sdk': specifier: ^4.19.6 - version: 4.19.6(bufferutil@4.0.9)(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 4.19.7(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@uniswap/v2-sdk': specifier: ^4.15.2 version: 4.15.2 @@ -150,10 +165,10 @@ importers: version: 1.4.4 '@uniswap/v3-sdk': specifier: ^3.25.2 - version: 3.25.2(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.25.2(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@uniswap/v4-sdk': specifier: ^1.21.4 - version: 1.21.4(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.21.4(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) ajv: specifier: ^8.17.1 version: 8.17.1 @@ -162,7 +177,7 @@ importers: version: 3.1.0 axios: specifier: ^1.8.4 - version: 1.9.0(debug@4.4.0) + version: 1.12.2(debug@4.3.4) bigint-buffer: specifier: 1.1.5 version: 1.1.5 @@ -172,18 +187,21 @@ importers: brotli: specifier: 1.3.2 version: 1.3.2 + core-js: + specifier: ^3.43.0 + version: 3.45.1 dayjs: specifier: ^1.11.13 - version: 1.11.13 + version: 1.11.18 decimal.js: specifier: ^10.5.0 - version: 10.5.0 + version: 10.6.0 decimal.js-light: specifier: ^2.5.1 version: 2.5.1 dotenv: specifier: ^16.4.7 - version: 16.5.0 + version: 16.6.1 ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -195,7 +213,7 @@ importers: version: 4.29.1 fastify-type-provider-zod: specifier: ^2.1.0 - version: 2.1.0(fastify@4.29.1)(zod@3.24.4) + version: 2.1.0(fastify@4.29.1)(zod@3.25.76) fs-extra: specifier: ^10.1.0 version: 10.1.0 @@ -213,7 +231,7 @@ importers: version: 11.3.0 pnpm: specifier: ^10.10.0 - version: 10.10.0 + version: 10.17.0 snake-case: specifier: ^4.0.0 version: 4.0.0 @@ -228,7 +246,7 @@ importers: version: 8.3.2 viem: specifier: ^2.37.1 - version: 2.37.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 2.37.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) winston: specifier: ^3.17.0 version: 3.17.0 @@ -237,7 +255,7 @@ importers: version: 4.7.1(winston@3.17.0) zod: specifier: ^3.24.2 - version: 3.24.4 + version: 3.25.76 devDependencies: '@types/app-root-path': specifier: ^1.2.8 @@ -250,7 +268,7 @@ importers: version: 4.0.4 '@types/express': specifier: ^4.17.21 - version: 4.17.21 + version: 4.17.23 '@types/fs-extra': specifier: ^9.0.13 version: 9.0.13 @@ -274,7 +292,7 @@ importers: version: 15.14.9 '@types/node-fetch': specifier: ^2.6.12 - version: 2.6.12 + version: 2.6.13 '@types/uuid': specifier: ^8.3.4 version: 8.3.4 @@ -283,10 +301,10 @@ importers: version: 8.18.1 '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) '@typescript-eslint/parser': specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) + version: 7.18.0(eslint@8.57.1)(typescript@5.9.2) bs58: specifier: ^4.0.1 version: 4.0.1 @@ -298,25 +316,25 @@ importers: version: 8.57.1 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.1) + version: 9.1.2(eslint@8.57.1) eslint-config-standard: specifier: ^17.1.0 - version: 17.1.0(eslint-plugin-import@2.31.0)(eslint-plugin-n@16.6.2(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1) + version: 17.1.0(eslint-plugin-import@2.32.0)(eslint-plugin-n@16.6.2(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1) eslint-formatter-table: specifier: ^7.32.1 version: 7.32.1 eslint-import-resolver-typescript: specifier: 4.4.3 - version: 4.4.3(eslint-plugin-import@2.31.0)(eslint@8.57.1) + version: 4.4.3(eslint-plugin-import@2.32.0)(eslint@8.57.1) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1) + version: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1) eslint-plugin-n: specifier: ^16.6.2 version: 16.6.2(eslint@8.57.1) eslint-plugin-prettier: specifier: ^5.2.5 - version: 5.4.0(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.3) + version: 5.5.4(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2) eslint-plugin-promise: specifier: ^6.1.1 version: 6.6.0(eslint@8.57.1) @@ -328,7 +346,7 @@ importers: version: 9.1.7 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)) + version: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)) jest-extended: specifier: ^0.11.5 version: 0.11.5 @@ -340,40 +358,52 @@ importers: version: 3.2.5 lint-staged: specifier: ^16.1.2 - version: 16.1.2 + version: 16.2.0 prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 rimraf: specifier: ^3.0.2 version: 3.0.2 ts-jest: specifier: ^29.3.0 - version: 29.3.2(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(jest@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.4.4(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)))(typescript@5.9.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@15.14.9)(typescript@5.8.3) + version: 10.9.2(@types/node@15.14.9)(typescript@5.9.2) tsc-alias: specifier: ^1.8.8 version: 1.8.16 tsx: specifier: ^4.20.3 - version: 4.20.3 + version: 4.20.5 typescript: specifier: ^5.8.2 - version: 5.8.3 + version: 5.9.2 ws: specifier: ^8.18.3 version: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) packages: - '@adraffy/ens-normalize@1.11.0': - resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + '@aiquant/lucid-cardano@0.10.11': + resolution: {integrity: sha512-ZJxnEUAO/yhBIklW3KHWffWlgOCW7Lr/in/Ktd6dzpu4mqagnLUM4bV4VZeaZimknPZ3nA+750dz3mD+wUFPEA==} + engines: {node: '>=14'} + + '@aiquant/minswap-sdk@0.0.0': + resolution: {integrity: sha512-wCVepFXHRC4d7tyLJ4uDsHn0KgQKZuKicR4U4xkkXfdwJv7C621Ki9gWw1JawFm6wBuyntmVmZAnm3JCNcyQLQ==} + + '@aiquant/sundaeswap-core@1.2.10': + resolution: {integrity: sha512-v84BeHaDQa24cxIIE0U/+iiOHTxlOmC785oQNa8CgQ6X0UUmaoPYj1bK3C1ahGU395XkG8f5ICvAVc+2JlsrgA==} + peerDependencies: + '@aiquant/lucid-cardano': ^0.10.7 + '@sundaeswap/asset': ^1.0.3 + '@sundaeswap/bigint-math': ^0.6.3 + '@sundaeswap/cpp': ^1.0.3 + '@sundaeswap/fraction': ^1.0.3 '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} @@ -398,123 +428,123 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.806.0': - resolution: {integrity: sha512-kQaBBBxEBU/IJ2wKG+LL2BK+uvBwpdvOA9jy1WhW+U2/DIMwMrjVs7M/ZvTlmVOJwhZaONcJbgQqsN4Yirjj4g==} + '@aws-sdk/client-s3@3.893.0': + resolution: {integrity: sha512-/P74KDJhOijnIAQR93sq1DQn8vbU3WaPZDyy1XUMRJJIY6iEJnDo1toD9XY6AFDz5TRto8/8NbcXT30AMOUtJQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.806.0': - resolution: {integrity: sha512-X0p/9/u9e6b22rlQqKucdtjdqmjSNB4c/8zDEoD5MvgYAAbMF9HNE0ST2xaA/WsJ7uE0jFfhPY2/00pslL1DqQ==} + '@aws-sdk/client-sso@3.893.0': + resolution: {integrity: sha512-0+qRGq7H8UNfxI0F02ObyOgOiYxkN4DSlFfwQUQMPfqENDNYOrL++2H9X3EInyc1lUM/+aK8TZqSbh473gdxcg==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.806.0': - resolution: {integrity: sha512-HJRINPncdjPK0iL3f6cBpqCMaxVwq2oDbRCzOx04tsLZ0tNgRACBfT3d/zNVRvMt6fnOVKXoN1LAtQaw50pjEA==} + '@aws-sdk/core@3.893.0': + resolution: {integrity: sha512-E1NAWHOprBXIJ9CVb6oTsRD/tNOozrKBD/Sb4t7WZd3dpby6KpYfM6FaEGfRGcJBIcB4245hww8Rmg16qDMJWg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.806.0': - resolution: {integrity: sha512-nbPwmZn0kt6Q1XI2FaJWP6AhF9tro4cO5HlmZQx8NU+B0H1y9WMo659Q5zLLY46BXgoQVIJEsPSZpcZk27O4aw==} + '@aws-sdk/credential-provider-env@3.893.0': + resolution: {integrity: sha512-h4sYNk1iDrSZQLqFfbuD1GWY6KoVCvourfqPl6JZCYj8Vmnox5y9+7taPxwlU2VVII0hiV8UUbO79P35oPBSyA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.806.0': - resolution: {integrity: sha512-e/gB2iJQQ4ZpecOVpEFhEvjGwuTqNCzhVaVsFYVc49FPfR1seuN7qBGYe1MO7mouGDQFInzJgcNup0DnYUrLiw==} + '@aws-sdk/credential-provider-http@3.893.0': + resolution: {integrity: sha512-xYoC7DRr++zWZ9jG7/hvd6YjCbGDQzsAu2fBHHf91RVmSETXUgdEaP9rOdfCM02iIK/MYlwiWEIVBcBxWY/GQw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.806.0': - resolution: {integrity: sha512-FogfbuYSEZgFxbNy0QcsBZHHe5mSv5HV3+JyB5n0kCyjOISCVCZD7gwxKdXjt8O1hXq5k5SOdQvydGULlB6rew==} + '@aws-sdk/credential-provider-ini@3.893.0': + resolution: {integrity: sha512-ZQWOl4jdLhJHHrHsOfNRjgpP98A5kw4YzkMOUoK+TgSQVLi7wjb957V0htvwpi6KmGr3f2F8J06D6u2OtIc62w==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.806.0': - resolution: {integrity: sha512-fZX8xP2Kf0k70kDTog/87fh/M+CV0E2yujSw1cUBJhDSwDX3RlUahiJk7TpB/KGw6hEFESMd6+7kq3UzYuw3rg==} + '@aws-sdk/credential-provider-node@3.893.0': + resolution: {integrity: sha512-NjvDUXciC2+EaQnbL/u/ZuCXj9PZQ/9ciPhI62LGCoJ3ft91lI1Z58Dgut0OFPpV6i16GhpFxzmbuf40wTgDbA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.806.0': - resolution: {integrity: sha512-8Y8GYEw/1e5IZRDQL02H6nsTDcRWid/afRMeWg+93oLQmbHcTtdm48tjis+7Xwqy+XazhMDmkbUht11QPTDJcQ==} + '@aws-sdk/credential-provider-process@3.893.0': + resolution: {integrity: sha512-5XitkZdiQhjWJV71qWqrH7hMXwuK/TvIRwiwKs7Pj0sapGSk3YgD3Ykdlolz7sQOleoKWYYqgoq73fIPpTTmFA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.806.0': - resolution: {integrity: sha512-hT9OBwCxWMPBydNhXm2gdNNzx5AJNheS9RglwDDvXWzQ9qDuRztjuMBilMSUMb0HF9K4IqQjYzGqczMuktz4qQ==} + '@aws-sdk/credential-provider-sso@3.893.0': + resolution: {integrity: sha512-ms8v13G1r0aHZh5PLcJu6AnQZPs23sRm3Ph0A7+GdqbPvWewP8M7jgZTKyTXi+oYXswdYECU1zPVur8zamhtLg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.806.0': - resolution: {integrity: sha512-XxaSY9Zd3D4ClUGENYMvi52ac5FuJPPAsvRtEfyrSdEpf6QufbMpnexWBZMYRF31h/VutgqtJwosGgNytpxMEg==} + '@aws-sdk/credential-provider-web-identity@3.893.0': + resolution: {integrity: sha512-wWD8r2ot4jf/CoogdPTl13HbwNLW4UheGUCu6gW7n9GoHh1JImYyooPHK8K7kD42hihydIA7OW7iFAf7//JYTw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.806.0': - resolution: {integrity: sha512-ACjuyKJw9OZl8z8HzPEaqn1o7ElVW94mowyoZvyUIDouwAPGqPGJbJ5V35qx1oDTFSAJX+N3O3AO6RyFc8nUhw==} + '@aws-sdk/middleware-bucket-endpoint@3.893.0': + resolution: {integrity: sha512-H+wMAoFC73T7M54OFIezdHXR9/lH8TZ3Cx1C3MEBb2ctlzQrVCd8LX8zmOtcGYC8plrRwV+8rNPe0FMqecLRew==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-expect-continue@3.804.0': - resolution: {integrity: sha512-YW1hySBolALMII6C8y7Z0CRG2UX1dGJjLEBNFeefhO/xP7ZuE1dvnmfJGaEuBMnvc3wkRS63VZ3aqX6sevM1CA==} + '@aws-sdk/middleware-expect-continue@3.893.0': + resolution: {integrity: sha512-PEZkvD6k0X9sacHkvkVF4t2QyQEAzd35OJ2bIrjWCfc862TwukMMJ1KErRmQ1WqKXHKF4L0ed5vtWaO/8jVLNA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.806.0': - resolution: {integrity: sha512-YEmuU2Nr/+blhi70gS38fnCe2IoL6OVVZXMp4MbzqZRUqeBbnxZhHQrd5YOiboJz7iq+g98xwFebHY167iejcg==} + '@aws-sdk/middleware-flexible-checksums@3.893.0': + resolution: {integrity: sha512-2swRPpyGK6xpZwIFmmFSFKp10iuyBLZEouhrt1ycBVA8iHGmPkuJSCim6Vb+JoRKqINp5tizWeQwdg9boIxJPw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.804.0': - resolution: {integrity: sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==} + '@aws-sdk/middleware-host-header@3.893.0': + resolution: {integrity: sha512-qL5xYRt80ahDfj9nDYLhpCNkDinEXvjLe/Qen/Y/u12+djrR2MB4DRa6mzBCkLkdXDtf0WAoW2EZsNCfGrmOEQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-location-constraint@3.804.0': - resolution: {integrity: sha512-AMtKnllIWKgoo7hiJfphLYotEwTERfjVMO2+cKAncz9w1g+bnYhHxiVhJJoR94y047c06X4PU5MsTxvdQ73Znw==} + '@aws-sdk/middleware-location-constraint@3.893.0': + resolution: {integrity: sha512-MlbBc7Ttb1ekbeeeFBU4DeEZOLb5s0Vl4IokvO17g6yJdLk4dnvZro9zdXl3e7NXK+kFxHRBFZe55p/42mVgDA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.804.0': - resolution: {integrity: sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==} + '@aws-sdk/middleware-logger@3.893.0': + resolution: {integrity: sha512-ZqzMecjju5zkBquSIfVfCORI/3Mge21nUY4nWaGQy+NUXehqCGG4W7AiVpiHGOcY2cGJa7xeEkYcr2E2U9U0AA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.804.0': - resolution: {integrity: sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==} + '@aws-sdk/middleware-recursion-detection@3.893.0': + resolution: {integrity: sha512-H7Zotd9zUHQAr/wr3bcWHULYhEeoQrF54artgsoUGIf/9emv6LzY89QUccKIxYd6oHKNTrTyXm9F0ZZrzXNxlg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.806.0': - resolution: {integrity: sha512-K1ssdovHH/kPN9EUS1LznwzoL+r89Cx8qAkp0K8MqdCQuBjZ0KRnjvo9nx69Vg5d/rg01VYTxomFUPXfcPtVXw==} + '@aws-sdk/middleware-sdk-s3@3.893.0': + resolution: {integrity: sha512-J2v7jOoSlE4o416yQiuka6+cVJzyrU7mbJEQA9VFCb+TYT2cG3xQB0bDzE24QoHeonpeBDghbg/zamYMnt+GsQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-ssec@3.804.0': - resolution: {integrity: sha512-Tk8jK0gOIUBvEPTz/wwSlP1V70zVQ3QYqsLPAjQRMO6zfOK9ax31dln3MgKvFDJxBydS2tS3wsn53v+brxDxTA==} + '@aws-sdk/middleware-ssec@3.893.0': + resolution: {integrity: sha512-e4ccCiAnczv9mMPheKjgKxZQN473mcup+3DPLVNnIw5GRbQoDqPSB70nUzfORKZvM7ar7xLMPxNR8qQgo1C8Rg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.806.0': - resolution: {integrity: sha512-XoIromVffgXnc+/mjlR2EVzQVIei3bPVtafIZNsHuEmUvIWJXiWsa2eJpt3BUqa0HF9YPknK7ommNEhqRb8ucg==} + '@aws-sdk/middleware-user-agent@3.893.0': + resolution: {integrity: sha512-n1vHj7bdC4ycIAKkny0rmgvgvGOIgYnGBAqfPAFPR26WuGWmCxH2cT9nQTNA+li8ofxX9F9FIFBTKkW92Pc8iQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.806.0': - resolution: {integrity: sha512-ua2gzpfQ9MF8Rny+tOAivowOWWvqEusez2rdcQK8jdBjA1ANd/0xzToSZjZh0ziN8Kl8jOhNnHbQJ0v6dT6+hg==} + '@aws-sdk/nested-clients@3.893.0': + resolution: {integrity: sha512-HIUCyNtWkxvc0BmaJPUj/A0/29OapT/dzBNxr2sjgKNZgO81JuDFp+aXCmnf7vQoA2D1RzCsAIgEtfTExNFZqA==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.806.0': - resolution: {integrity: sha512-cuv5pX55JOlzKC/iLsB5nZ9eUyVgncim3VhhWHZA/KYPh7rLMjOEfZ+xyaE9uLJXGmzOJboFH7+YdTRdIcOgrg==} + '@aws-sdk/region-config-resolver@3.893.0': + resolution: {integrity: sha512-/cJvh3Zsa+Of0Zbg7vl9wp/kZtdb40yk/2+XcroAMVPO9hPvmS9r/UOm6tO7FeX4TtkRFwWaQJiTZTgSdsPY+Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.806.0': - resolution: {integrity: sha512-IrbEnpKvG8d9rUWAvsF28g8qBlQ02FaOxn4cGXtTs0b0BGMK1M+cGQrYjJ7Ak08kIXDxBqsdIlZGsKYr+Ds9+w==} + '@aws-sdk/signature-v4-multi-region@3.893.0': + resolution: {integrity: sha512-pp4Bn8dL4i68P/mHgZ7sgkm8OSIpwjtGxP73oGseu9Cli0JRyJ1asTSsT60hUz3sbo+3oKk3hEobD6UxLUeGRA==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.806.0': - resolution: {integrity: sha512-I6SxcsvV7yinJZmPgGullFHS0tsTKa7K3jEc5dmyCz8X+kZPfsWNffZmtmnCvWXPqMXWBvK6hVaxwomx79yeHA==} + '@aws-sdk/token-providers@3.893.0': + resolution: {integrity: sha512-nkzuE910TxW4pnIwJ+9xDMx5m+A8iXGM16Oa838YKsds07cgkRp7sPnpH9B8NbGK2szskAAkXfj7t1f59EKd1Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.804.0': - resolution: {integrity: sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==} + '@aws-sdk/types@3.893.0': + resolution: {integrity: sha512-Aht1nn5SnA0N+Tjv0dzhAY7CQbxVtmq1bBR6xI0MhG7p2XYVh1wXuKTzrldEvQWwA3odOYunAfT9aBiKZx9qIg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-arn-parser@3.804.0': - resolution: {integrity: sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==} + '@aws-sdk/util-arn-parser@3.893.0': + resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.806.0': - resolution: {integrity: sha512-3YRRgZ+qFuWDdm5uAbxKsr65UAil4KkrFKua9f4m7Be3v24ETiFOOqhanFUIk9/WOtvzF7oFEiDjYKDGlwV2xg==} + '@aws-sdk/util-endpoints@3.893.0': + resolution: {integrity: sha512-xeMcL31jXHKyxRwB3oeNjs8YEpyvMnSYWr2OwLydgzgTr0G349AHlJHwYGCF9xiJ2C27kDxVvXV/Hpdp0p7TWw==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-locate-window@3.804.0': - resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} + '@aws-sdk/util-locate-window@3.893.0': + resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.804.0': - resolution: {integrity: sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==} + '@aws-sdk/util-user-agent-browser@3.893.0': + resolution: {integrity: sha512-PE9NtbDBW6Kgl1bG6A5fF3EPo168tnkj8TgMcT0sg4xYBWsBpq0bpJZRh+Jm5Bkwiw9IgTCLjEU7mR6xWaMB9w==} - '@aws-sdk/util-user-agent-node@3.806.0': - resolution: {integrity: sha512-Az2e4/gmPZ4BpB7QRj7U76I+fctXhNcxlcgsaHnMhvt+R30nvzM2EhsyBUvsWl8+r9bnLeYt9BpvEZeq2ANDzA==} + '@aws-sdk/util-user-agent-node@3.893.0': + resolution: {integrity: sha512-tTRkJo/fth9NPJ2AO/XLuJWVsOhbhejQRLyP0WXG3z0Waa5IWK5YBxBC1tWWATUCwsN748JQXU03C1aF9cRD9w==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -522,36 +552,44 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.804.0': - resolution: {integrity: sha512-JbGWp36IG9dgxtvC6+YXwt5WDZYfuamWFtVfK6fQpnmL96dx+GUPOXPKRWdw67WLKf2comHY28iX2d3z35I53Q==} + '@aws-sdk/xml-builder@3.893.0': + resolution: {integrity: sha512-qKkJ2E0hU60iq0o2+hBSIWS8sf34xhqiRRGw5nbRhwEnE2MsWsWBpRoysmr32uq9dHMWUzII0c/fS29+wOSdMA==} + engines: {node: '>=18.0.0'} + + '@aws/lambda-invoke-store@0.0.1': + resolution: {integrity: sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==} engines: {node: '>=18.0.0'} '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.2': - resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} engines: {node: '>=6.9.0'} - '@babel/core@7.27.1': - resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.1': - resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.1': - resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -572,12 +610,12 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.1': - resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.2': - resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} hasBin: true @@ -672,25 +710,33 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.1': - resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.1': - resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@blockfrost/blockfrost-js@5.7.0': + resolution: {integrity: sha512-Rzw+Ya+LlKJNv9k5g7xW0uM33Xf6Lt3MXANtuwtm7+R9xuMFc7iKocwHSgrGUTTZ1EKou4n4Znai18MdvqG2bw==} + engines: {node: '>=16'} + + '@blockfrost/openapi@0.1.70-beta.0': + resolution: {integrity: sha512-js+ZpOWJHRHE+C1bVTDRen/MKVuaA8Bygjlil8O55bN3MzWfwQ0jzzZCYOAHhkbgEwE+j6ziCbP2+1xwFmtR+Q==} + engines: {node: '>=20'} + '@bundlr-network/client@0.7.17': resolution: {integrity: sha512-1qTDrwgmgeh0pO24JbeGt2W8GlpWYkVnQ8AhEZ02Lm00J7RALSyma3C5pNlKuvAQBczL1r9KhLr9KHK1og3J0g==} deprecated: Bundlr is now Irys - please switch to @irys/sdk - this package will remain compatible with Irys for the foreseeable future. @@ -727,167 +773,179 @@ packages: '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - '@emnapi/core@1.4.3': - resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emurgo/cardano-serialization-lib-nodejs@11.5.0': + resolution: {integrity: sha512-IlVABlRgo9XaTR1NunwZpWcxnfEv04ba2l1vkUz4S1W7Jt36F4CtffP+jPeqBZGnAe+fnUwo0XjIJC3ZTNToNQ==} - '@emnapi/wasi-threads@1.0.2': - resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + '@emurgo/cip14-js@3.0.1': + resolution: {integrity: sha512-u0XobeajNSlmeGBmY3ntA+NE/Vns7hKP0xrFzWyAO7YubETOifTjUddJN4gpvXE4S08DPUcNBVe3sx1m5GPIOg==} - '@esbuild/aix-ppc64@0.25.5': - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.5': - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.5': - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.5': - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.5': - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.5': - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.5': - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.5': - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.5': - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.5': - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.5': - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.5': - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.5': - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.5': - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.5': - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.5': - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.5': - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.5': - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.5': - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.5': - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.5': - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.5': - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.5': - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.5': - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.5': - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -1111,6 +1169,23 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1205,71 +1280,69 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@ledgerhq/cryptoassets-evm-signatures@13.5.9': - resolution: {integrity: sha512-S3OMEb14GspNj7wnvHwHzuMUXJSfd+EcKhhlmboIZo7c7kj0ZhHONmEQK6Ad9eVEd/TryI8YG5HMTJ+D7mtSaA==} + '@ledgerhq/cryptoassets-evm-signatures@13.6.2': + resolution: {integrity: sha512-ZktgQ27kJkze4mK1I3hKVj0/l9IemP4EQMz44l9MpGCRuU+1ScNG+sBmiTyLP6kWrNBrGotat2q8fh/o7munOg==} - '@ledgerhq/devices@8.4.7': - resolution: {integrity: sha512-CljHIaPmtv93H2If1Zs1xW0pgg+M37bAoJkm6+V6Yw5S0MgFWFpLnTTNgCvHXyD8pG0+uq8TuOXUiG1oAV5AyA==} + '@ledgerhq/devices@8.5.1': + resolution: {integrity: sha512-oW75YQQiP2muHveXTuwSAze6CBxJ7jOYILhFiJbsVzmgLPVqtdw4s0bJJlOBft4Aup67yNAjboFCIU7kTYQBFg==} - '@ledgerhq/domain-service@1.2.35': - resolution: {integrity: sha512-7CzwI08nFIuiXz24mAT9vp0o7n5Q8uez4DYNWMvC4thyBY0ZovE1XmqAYPS/t+SgDfzJyCapD03fkyxxw/sVrQ==} + '@ledgerhq/domain-service@1.2.43': + resolution: {integrity: sha512-nQAfPdeTVZz8YX9DnRhBRMUXm2SSmM8kaBMlQ3nyIJLFusFgCox0cppAmVR5BXCcku9Rp2qvvAL8vk/y3s/z3A==} - '@ledgerhq/errors@6.22.0': - resolution: {integrity: sha512-rXtpIOfHL62jWB7o77PNFD4EDYdcqyMeVgt7TZcmTkWT78cK+YYSUTMrNuGLhnZZZTMLWH023Wgt65OfKIdGBQ==} + '@ledgerhq/errors@6.25.0': + resolution: {integrity: sha512-9cU0dgUyq3Adb1bHAjJnbwl+r+4WBjuPq0k+/DbBNpuYHwcz2xKtRIjLimUJyACjHti3iWwRt1sFcbQDDdI08w==} - '@ledgerhq/evm-tools@1.7.0': - resolution: {integrity: sha512-aNmkwOJ+DQNSeVNRY1/vdglmJJIeynqNUI01kpnbSL7oLpF/S7Cvwscx0wkqTWeaH80GAuxBPkVTRxRL8W/SPw==} + '@ledgerhq/evm-tools@1.7.6': + resolution: {integrity: sha512-mC+ZkfXjiKp2rvcE6QwXgczRWN+yypyP3xtpUPHO/1gpEHhrcKZjTZY+UCeYVpT/r01ukjFh3LiRmFpmBG036Q==} - '@ledgerhq/hw-app-eth@6.45.10': - resolution: {integrity: sha512-9NAoYg1hnX0fvhRCwTfkllP86Et6NkEMVNwzdCJEULVJGvhnEK7j5dC+xHayzZeMs7fUZ8zj3zRCUWhHCDve5w==} + '@ledgerhq/hw-app-eth@6.45.18': + resolution: {integrity: sha512-B4ao8TUHC+plZusSYzphqsqDW2sVwa8k7Xi5fAAI8SQXzNj1yXTU/yDCXSmFa0e6wTUH/3QM5Ak2okPUoC94Vw==} - '@ledgerhq/hw-app-solana@7.5.0': - resolution: {integrity: sha512-Fk9sFpiOBpB0OuT3MkPCDqKdbbHB1Eh+uslOBkPWxzW6rwpO285X3NEcfrMYwEAdvqX9UUL7hUoH4zkHYBQ9wg==} + '@ledgerhq/hw-app-solana@7.5.3': + resolution: {integrity: sha512-geihLri+YS/2de/iM4/PlNp6Ug9JoedWeskpoh6XXRVbBjY3cdK+z9Cac49my+yP4PxEPKjvAoT0zRmTmZk0uw==} - '@ledgerhq/hw-transport-mocker@6.29.7': - resolution: {integrity: sha512-0FEEbS9XRH/Fu8G4xIZq+QbRDnsy0tO3xf2H1wDkhVv0AGHvDHSp1l7fAQZz6Q1sBmLgqjXhKvZRKzNOX4tnfQ==} + '@ledgerhq/hw-transport-mocker@6.29.10': + resolution: {integrity: sha512-7jirehH02hdiMGVxtmZTO6vzFG156pYVW8+MJ4FXsvT12lgX5VRp6BLNOveMuxQGiRXhXIDo7StSkNlX3wHB+Q==} - '@ledgerhq/hw-transport-node-hid-noevents@6.30.8': - resolution: {integrity: sha512-MwJOGLvfAvoSDG1ZHxrB/7squCIaAB8dhSAKN8LpjxeMhz/99SzXOr4MwSo0B/jytMkE0gBezVB3ADkPomkNkQ==} + '@ledgerhq/hw-transport-node-hid-noevents@6.30.11': + resolution: {integrity: sha512-UDHO/D6rcYpM7qVCBC/ltElS488Jv8dsAzG4abwTFF+X7sPK9kZvdXqA3X9voHspp/IDZOceCcmUJVf59vVsUw==} - '@ledgerhq/hw-transport-node-hid-singleton@6.31.8': - resolution: {integrity: sha512-Gx4mu7siqpbXscyIc22lycWpOGTG65KxVCvbG87xrFZYWaKE1YrbhNZ93hGa96qQPb9KOTN7sQPVsXmEAiahHQ==} + '@ledgerhq/hw-transport-node-hid-singleton@6.31.11': + resolution: {integrity: sha512-wXc+EOeO6ByogmIi3FZTWGJ2GzTuP45eRQniVC33EAXMPnTtVmjaHjdWfwaEFBcYbzNUmFoNVWdKXnLn1+OzBA==} - '@ledgerhq/hw-transport-node-hid@6.29.8': - resolution: {integrity: sha512-lQrhdu7JyxDL1DzDfvj9HDjQd9OHkYs5yDI13NH92qBTxuVneNfuu9DiHFLpCCpm2OUghTMmw9MRUwaTwYDTLg==} + '@ledgerhq/hw-transport-node-hid@6.29.11': + resolution: {integrity: sha512-mhP2TEm+8sZuP0AF7TUje6aOr46NgpIFrRS9RifMvfqAN6xzIBOU5OnE0mQIapNbu2AMs0jkYcDvGpTd/NSf4g==} - '@ledgerhq/hw-transport@6.31.7': - resolution: {integrity: sha512-R+QMlqoLJDPeCiqwWv85PbZ3m0hel5PwQzWwSIbyEwialqjXnG7LFQgytkgXlgMcayT0chvvLeYjuY5ZfMPY7w==} + '@ledgerhq/hw-transport@6.31.10': + resolution: {integrity: sha512-ruNtkTPMO3rFCaSM+oPTOXXerzxWFZF43pAHVAHhsjiQGhLWzLSkMc7qBEpWIpZPubKRAbWSXR2zXBIJPNy8oQ==} - '@ledgerhq/live-env@2.11.0': - resolution: {integrity: sha512-7xVQfi1IdifCS50LDX7qpEkrl8fa5s4MnETM7igJcmIeIE2qIGddBnjyToh/CIbJ1benBVZBY23iJmwul4/IhQ==} + '@ledgerhq/live-env@2.16.0': + resolution: {integrity: sha512-PpRXvQcOQQsAcw/V3iEbkLJUX4DJT2lGixi2pXeAqawotSvuSBfvZyu3uNC7Kqz/JVde0vkP9SOFbHbWKR9GVg==} '@ledgerhq/logs@6.13.0': resolution: {integrity: sha512-4+qRW2Pc8V+btL0QEmdB2X+uyx0kOWMWE1/LWsq5sZy3Q5tpi4eItJS6mB0XL3wGW59RQ+8bchNQQ1OW/va8Og==} - '@ledgerhq/types-live@6.76.0': - resolution: {integrity: sha512-XgshTvNSie5CkudV/ebLDAR7WVEqTDX/xiqg68NZbTr+exJE5t2C4fKEzCMq8wcGVjpbqLZA+RfL/uK/9j385A==} + '@ledgerhq/types-live@6.84.0': + resolution: {integrity: sha512-0n8p4xlE/Vb2+hQey0tFtOsLJ+QHLgU3/VzrUNyVv2XTDNsOiJB86hHBocATR+fg4UjyNBRE1ff9/fGhqKyEzg==} '@lukeed/ms@2.0.2': resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} @@ -1320,8 +1393,11 @@ packages: '@meteora-ag/dlmm@1.3.12': resolution: {integrity: sha512-uoBjrl8yLVqKmpdcoC9Jj6Zg5mmo/2CeDEsWFrk6OiAoQ6g1+WBnr8lX/RWxXZ6r18YeP+QAKQbo1Tjf3HU0Cg==} - '@napi-rs/wasm-runtime@0.2.11': - resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} + '@minswap/tiny-invariant@1.2.0': + resolution: {integrity: sha512-m4CMTsZ4MDB2WLND6rV0eti+f2WcMPhKvXf9ZHXlQMqvNmgoX1z//84FpEX0D1vVTPfJtNS8XIoIQ9pm6X590A==} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} '@noble/ciphers@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} @@ -1334,10 +1410,6 @@ packages: resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.9.0': - resolution: {integrity: sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==} - engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.9.1': resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} engines: {node: ^14.21.3 || >=16} @@ -1346,6 +1418,10 @@ packages: resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==} engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + '@noble/ed25519@1.7.5': resolution: {integrity: sha512-xuS0nwRMQBvSxDa7UxMb61xTiH3MxTgUfhyPUALVIe0FlOAz4sjELwyDRyUvqeEYfRSG9qNjFIycqLZppg4RSA==} @@ -1379,36 +1455,36 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nomicfoundation/edr-darwin-arm64@0.11.0': - resolution: {integrity: sha512-aYTVdcSs27XG7ayTzvZ4Yn9z/ABSaUwicrtrYK2NR8IH0ik4N4bWzo/qH8rax6rewVLbHUkGyGYnsy5ZN4iiMw==} + '@nomicfoundation/edr-darwin-arm64@0.11.3': + resolution: {integrity: sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-x64@0.11.0': - resolution: {integrity: sha512-RxX7UYgvJrfcyT/uHUn44Nsy1XaoW+Q1khKMdHKxeW7BrgIi+Lz+siz3bX5vhSoAnKilDPhIVLrnC8zxQhjR2A==} + '@nomicfoundation/edr-darwin-x64@0.11.3': + resolution: {integrity: sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': - resolution: {integrity: sha512-J0j+rs0s11FuSipt/ymqrFmpJ7c0FSz1/+FohCIlUXDxFv//+1R/8lkGPjEYFmy8DPpk/iO8mcpqHTGckREbqA==} + '@nomicfoundation/edr-linux-arm64-gnu@0.11.3': + resolution: {integrity: sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-musl@0.11.0': - resolution: {integrity: sha512-4r32zkGMN7WT/CMEuW0VjbuEdIeCskHNDMW4SSgQSJOE/N9L1KSLJCSsAbPD3aYE+e4WRDTyOwmuLjeUTcLZKQ==} + '@nomicfoundation/edr-linux-arm64-musl@0.11.3': + resolution: {integrity: sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-gnu@0.11.0': - resolution: {integrity: sha512-SmdncQHLYtVNWLIMyGaY6LpAfamzTDe3fxjkirmJv3CWR5tcEyC6LMui/GsIVnJzXeNJBXAzwl8hTUAxHTM6kQ==} + '@nomicfoundation/edr-linux-x64-gnu@0.11.3': + resolution: {integrity: sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.11.0': - resolution: {integrity: sha512-w6hUqpn/trwiH6SRuRGysj37LsQVCX5XDCA3Xi81sbOaLhbHrNvK9TXWyZmcuzbdTKQQW6VNywcSxDdOiChcJg==} + '@nomicfoundation/edr-linux-x64-musl@0.11.3': + resolution: {integrity: sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.11.0': - resolution: {integrity: sha512-BLmULjRKoH9BsX+c4Na2ypV7NGeJ+M6Zpqj/faPOwleVscDdSr/IhriyPaXCe8dyfwbge7lWsbekiADtPSnB2Q==} + '@nomicfoundation/edr-win32-x64-msvc@0.11.3': + resolution: {integrity: sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung==} engines: {node: '>= 18'} - '@nomicfoundation/edr@0.11.0': - resolution: {integrity: sha512-36WERf8ldvyHR6UAbcYsa+vpbW7tCrJGBwF4gXSsb8+STj1n66Hz85Y/O7B9+8AauX3PhglvV5dKl91tk43mWw==} + '@nomicfoundation/edr@0.11.3': + resolution: {integrity: sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g==} engines: {node: '>= 18'} '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': @@ -1459,33 +1535,33 @@ packages: resolution: {integrity: sha512-wIYRrC7iQfd/ILe4/SJ6nQ+GZmHcy3ylKYH8O8Thfd1WmbJ9G4qnQkL0wJBmA2NUkMO/qceWQAthr2BCosl/ZA==} engines: {node: '>=10'} - '@pancakeswap/chains@0.6.0': - resolution: {integrity: sha512-deg+CtkP8ZzCQ4W9XnTUm89jtzkhmg8FPczwStqpysL0HSFWqHsCh+tsZRHskfVPS8AqnlSA7uo1Z7nv9KrOMA==} + '@pancakeswap/chains@0.7.0': + resolution: {integrity: sha512-LYVaOi0LanMA3NgwY5QuuDuQZXzrqT6xafoUUZOgoViIxUVAV498ZMIZbwF0nf5d9UVdtzO1pCf+noHdrHXMfw==} engines: {node: '>=10'} - '@pancakeswap/infinity-sdk@1.0.5': - resolution: {integrity: sha512-NPoYyiJIzPu+HAv0qp5UBWKRLIqEejSRD1TVicB9ylJsamUMW8Q8m+LFqX6lVxX/ykI/7sOX5RdhU+dhLOQsTQ==} + '@pancakeswap/infinity-sdk@1.0.6': + resolution: {integrity: sha512-II7Bp13KMuUjFdR5HKsgMUmSQ5LCd1BayLjfbsMbqYsuek1AuW0w5mCdTymqkHSzIjDfsu+cM+nVM8ZzGOt3Dg==} engines: {node: '>=10'} - '@pancakeswap/multicall@3.7.2': - resolution: {integrity: sha512-HE64KWfdZwsgB8ZFnZakdFuqBCQullfjm/wxLHjRnWW9hQnEcxZES2ZQ9pW1loIeZ4BC6AV+YfDJ/xxXzb+Lrw==} + '@pancakeswap/multicall@3.7.3': + resolution: {integrity: sha512-4EwMFE8dMkW0jFFl1eLUmfluEWzH/lUSU9ozcdzN1RvJlAC9dQTeLN79M9Y4sEsIU3aMr0oXC1ZVHSIWENMu9Q==} - '@pancakeswap/permit2-sdk@1.1.5': - resolution: {integrity: sha512-23mlRyaR2OP3u9rQn3gSZA4NNlqgRR6AnHhG8etYyKzGfFz8joJP1JcRxfRkWJqtLSjUPB0o3oMWNNzsSRT26Q==} + '@pancakeswap/permit2-sdk@1.1.6': + resolution: {integrity: sha512-M+NToQz76A3E0x/56UjZXWyh8cPNjyLelKa63hjuZ8CCTgzJqwpIZPjrPIjuS+PwYkpDGpBmPzl7e5oOSuTenw==} '@pancakeswap/sdk@5.8.12': resolution: {integrity: sha512-eubv5+9ilGIXRB1C4AwCwcnDQU/JzlXBGmJq+JxFRSfh8+XMtuLf+KZyWN5i0M0WK3z+hP/Xwo69j+6vRfJJuA==} engines: {node: '>=10'} - '@pancakeswap/sdk@5.8.16': - resolution: {integrity: sha512-vv6fOZM8jZlcdS7M8kLSs7eP3jDYKZ6w/OjjfuQPEE2+1SVN6LFZzkuXzkNGtKAYgf6N7lUzFBPyStaXEUynsw==} + '@pancakeswap/sdk@5.8.17': + resolution: {integrity: sha512-e8N9CuppwZzfePHck8JbXWjuALhJ+pHi6gVbY1qKK4w+mDpDbs2zcPLak2HLttXNpprKvACHXIuso7K5QgGFOw==} engines: {node: '>=10'} - '@pancakeswap/smart-router@7.5.2': - resolution: {integrity: sha512-2aROSXQJWoOfrib/mUkM9FnOjl+oihhrXe9XpHcjYEOtzEIYAf5C34CTUxgUpflplaHNVkCHxJ+mbaP0xs7ALQ==} + '@pancakeswap/smart-router@7.5.3': + resolution: {integrity: sha512-KkT9BLqJHR+CrSDYSLLWXZTzKvvr4pgmA4RQSAoYBRqkXxjMto3T4VbbGCX1PQPsSodtauw5E6FMUCgA6hG0mg==} - '@pancakeswap/stable-swap-sdk@2.0.9': - resolution: {integrity: sha512-51EGjmaefA/c2NnCz2yAzy2DHtWfVwy1t0XQrDj79RM4+NtjuMe9lyaJZozcl+J/rQPB1Cb5p9+8IiX52J+7mg==} + '@pancakeswap/stable-swap-sdk@2.0.10': + resolution: {integrity: sha512-n6RZYSelhAT788/eO+Gw4nCEIDm1WFvrWIgxmub/CH5TLMnSZj6PsTPekWg/B26RjwH4MGw9K3ZXLB/hCSNMVg==} '@pancakeswap/swap-sdk-core@1.3.0': resolution: {integrity: sha512-nkeDs3GyNfvRGsTbTAO30yl6ccOTr5WQERsKAaxKTe1fbGvpDRFLo3nlR1ZddRCj+RYZSS+B4Sll4A39k7nFDQ==} @@ -1498,11 +1574,11 @@ packages: '@pancakeswap/swap-sdk-evm@1.1.1': resolution: {integrity: sha512-z5nDhNf9NzbZFElq8pC2MPzWrI5WDT9mVQ1NkWDOh1wqJijv4+jCTBCoOi9cLsBGBkoMJ/yZYZ2YlxBcSwVjAQ==} - '@pancakeswap/swap-sdk-evm@1.1.5': - resolution: {integrity: sha512-ZQaz86yELhtar9+8HfYrt9L+IWFJXU/viKj6JiDJZhZ8zDBErxrzHYswFMvmX9bsnmgoLpWpcallIEwqDmMbJw==} + '@pancakeswap/swap-sdk-evm@1.1.6': + resolution: {integrity: sha512-Ahd23MhLg19PbBXB8SLhyHXR0GKOHJwZvfdyI5xYygZ8cwiaLXwKcOTAz+5RIUHu4OJsbnmxGGmAM8gBRR6zVg==} - '@pancakeswap/swap-sdk-solana@1.1.4': - resolution: {integrity: sha512-xLArIRzx5CwHuXHlvu/RyImpKyB3V3mXsb4chybfKyAXhYjiD9OOXIzLLXzpdkJFa8VQ0kRIMtUrFYA5i42g7A==} + '@pancakeswap/swap-sdk-solana@1.1.5': + resolution: {integrity: sha512-kiIgBUUIWSP+RHHSnTYtvFnqxV80qjKI3YKm1ReYPpoZOoM/S8QiYwUlxDlrs2D07wsEweg+eScspNyHxsddVw==} '@pancakeswap/token-lists@0.0.16': resolution: {integrity: sha512-Mf/Y7wm7HdHMBeOKrRcIbGBDjt3/xlerAolRXaRDAYtHbyn7sE8Q/azq9XhAR2OFIc5qJuLejlXFrWxnQFr9tw==} @@ -1521,11 +1597,11 @@ packages: react: optional: true - '@pancakeswap/tokens@0.7.8': - resolution: {integrity: sha512-nOyWG1SSfx8Hk/P+iJkj/NU4pvz+gpRJ6V6l+CM6WsgjFrTdQKDm3yUrzeurwZspJfwwEvWep0mYGxDj85zXdA==} + '@pancakeswap/tokens@0.7.9': + resolution: {integrity: sha512-RVEDvYR0yN5MVjY+neVAeTPuyYE7LLJbDWZ7tvPCPgzbVpKkZX0+WBmGaiemQWCqjZ/uGEAKWtiY4MyJ94MUTA==} - '@pancakeswap/universal-router-sdk@1.4.14': - resolution: {integrity: sha512-NIjzWG0UXngXMOUPyT4KDcnrEtnuFoQc5H+6eTg1Af0WMEgnkrN4HRBrZECfGSb+vCg9aak0kPv5MQpXjRuLkg==} + '@pancakeswap/universal-router-sdk@1.4.15': + resolution: {integrity: sha512-3itazAhBxlCdiOsBGOI7Gcx7yWtVOjJE3eXIWp8izGCLA5J72XmLuK5xYDDgG1TI969HVBuo+YJ7nO2WVDdj9A==} peerDependencies: abitype: '*' lodash: '*' @@ -1535,8 +1611,8 @@ packages: '@pancakeswap/v2-sdk@1.1.1': resolution: {integrity: sha512-FlPEk9Jpq3YcLZ7DEkDXqx5g57+Vxk3sJAB2aSU2UypO3fKGwB/yt/zaeFT8mLzd9p6IlBJ912Mxo1nGRhENlA==} - '@pancakeswap/v2-sdk@1.1.5': - resolution: {integrity: sha512-IaO+r5pOxx4TyGZc+mUyZI76koeXzk7UU5MQtyMYPlngCoAIP8E5YqrUaEvuSYiFaJqSjawyenT4vHe9HmnJoQ==} + '@pancakeswap/v2-sdk@1.1.6': + resolution: {integrity: sha512-CN3fJo90UyB2Fm5gQtsEwvdSgsPH12Usx8mmYAyygyHte5Ch4y7eZSQYxgz1KisNACfhylG43ofwebCPMH0gnQ==} '@pancakeswap/v3-core@1.0.2': resolution: {integrity: sha512-9aZU8I1J6SbZOSW7NcNxuyaAC17tGkOaZJM9aJgvl6MMUOExpq0i0EC/jc3HxWbpC8sbZL+8eG544NEJs8CS+w==} @@ -1550,20 +1626,31 @@ packages: resolution: {integrity: sha512-rOTLn2kdB8RmkThU36TDX/QSpkVBRNyW17qOYNwhHgjdrKXah4iJZZu4dJzwN/1IywjpQ1UIcmI57WWQL5Nj3A==} engines: {node: '>=10'} - '@pancakeswap/v3-sdk@3.9.5': - resolution: {integrity: sha512-rqtDADhS17mplAnr8VyTxOYGiL4SEw1g7NZdRMFwcvxH5wzskSzNEfg4cFsLWb+mD3FyX8BXXWrvADLsQqP2mg==} + '@pancakeswap/v3-sdk@3.9.6': + resolution: {integrity: sha512-lXOeJM2WKkCRfTDcX8NSz6iLj6B5fPW25fpBmOnk0QDPbb6iqx6cB7OdcM2YDQ8iAGWKuDjGardtMvO5chZgqQ==} engines: {node: '>=10'} '@pancakeswap/v4-sdk@0.1.8': resolution: {integrity: sha512-5n5cmtBMYo7bnhmxhuwfv4P/MSaeZbvNsqsUjl6UsNnI9ylPx4ttTvj/uxhytnjpSA2wwSZUvwLys/w3rHrWGw==} engines: {node: '>=10'} + '@peculiar/asn1-schema@2.5.0': + resolution: {integrity: sha512-YM/nFfskFJSlHqv59ed6dZlLZqtZQwjRVJ4bBAiWV08Oc+1rSd5lDZcBEx0lGDHfSoH3UziI2pXt2UM33KerPQ==} + + '@peculiar/json-schema@1.1.12': + resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} + engines: {node: '>=8.0.0'} + + '@peculiar/webcrypto@1.5.0': + resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==} + engines: {node: '>=10.12.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.4': - resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@randlabs/communication-bridge@1.0.1': @@ -1581,8 +1668,8 @@ packages: '@scure/base@1.1.9': resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} - '@scure/base@1.2.5': - resolution: {integrity: sha512-9rE6EOVeIQzt5TSu4v+K523F8u6DhBsoZWPGKlnCshhlDhy0kJzUX4V+tr2dWmzF1GdekvThABoEQBGBQI7xZw==} + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} @@ -1645,222 +1732,226 @@ packages: '@sinclair/typebox@0.33.22': resolution: {integrity: sha512-auUj4k+f4pyrIVf4GW5UKquSZFHJWri06QgARy9C0t9ZTjJLIuNIrr1yl9bWcJWJ1Gz1vOvYN1D+QPaIlNMVkQ==} + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@smithy/abort-controller@4.0.2': - resolution: {integrity: sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw==} + '@smithy/abort-controller@4.1.1': + resolution: {integrity: sha512-vkzula+IwRvPR6oKQhMYioM3A/oX/lFCZiwuxkQbRhqJS2S4YRY2k7k/SyR2jMf3607HLtbEwlRxi0ndXHMjRg==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader-native@4.0.0': - resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} + '@smithy/chunked-blob-reader-native@4.1.0': + resolution: {integrity: sha512-Bnv0B3nSlfB2mPO0WgM49I/prl7+kamF042rrf3ezJ3Z4C7csPYvyYgZfXTGXwXfj1mAwDWjE/ybIf49PzFzvA==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader@5.0.0': - resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} + '@smithy/chunked-blob-reader@5.1.0': + resolution: {integrity: sha512-a36AtR7Q7XOhRPt6F/7HENmTWcB8kN7mDJcOFM/+FuKO6x88w8MQJfYCufMWh4fGyVkPjUh3Rrz/dnqFQdo6OQ==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.1.1': - resolution: {integrity: sha512-FZUtpiDnPZQmuIl4lfbdO+u3foNLmRCKct/2w2nRwgB99Yvaq4SHcfxyzMfxkyBrBmgnF1kdXzhHNXN7ycDvWg==} + '@smithy/config-resolver@4.2.2': + resolution: {integrity: sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.3.1': - resolution: {integrity: sha512-W7AppgQD3fP1aBmo8wWo0id5zeR2/aYRy067vZsDVaa6v/mdhkg6DxXwEVuSPjZl+ZnvWAQbUMCd5ckw38+tHQ==} + '@smithy/core@3.11.1': + resolution: {integrity: sha512-REH7crwORgdjSpYs15JBiIWOYjj0hJNC3aCecpJvAlMMaaqL5i2CLb1i6Hc4yevToTKSqslLMI9FKjhugEwALA==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.0.3': - resolution: {integrity: sha512-UdNvGjZnunS9+45gHYtVXDynoWH1X0tYY0pS368k1zUZum6Mm4ivU4Se0WhFJf8jNocD+p94khzTtrx4ha3OOQ==} + '@smithy/credential-provider-imds@4.1.2': + resolution: {integrity: sha512-JlYNq8TShnqCLg0h+afqe2wLAwZpuoSgOyzhYvTgbiKBWRov+uUve+vrZEQO6lkdLOWPh7gK5dtb9dS+KGendg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.0.2': - resolution: {integrity: sha512-p+f2kLSK7ZrXVfskU/f5dzksKTewZk8pJLPvER3aFHPt76C2MxD9vNatSfLzzQSQB4FNO96RK4PSXfhD1TTeMQ==} + '@smithy/eventstream-codec@4.1.1': + resolution: {integrity: sha512-PwkQw1hZwHTQB6X5hSUWz2OSeuj5Z6enWuAqke7DgWoP3t6vg3ktPpqPz3Erkn6w+tmsl8Oss6nrgyezoea2Iw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.0.2': - resolution: {integrity: sha512-CepZCDs2xgVUtH7ZZ7oDdZFH8e6Y2zOv8iiX6RhndH69nlojCALSKK+OXwZUgOtUZEUaZ5e1hULVCHYbCn7pug==} + '@smithy/eventstream-serde-browser@4.1.1': + resolution: {integrity: sha512-Q9QWdAzRaIuVkefupRPRFAasaG/droBqn1feiMnmLa+LLEUG45pqX1+FurHFmlqiCfobB3nUlgoJfeXZsr7MPA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.1.0': - resolution: {integrity: sha512-1PI+WPZ5TWXrfj3CIoKyUycYynYJgZjuQo8U+sphneOtjsgrttYybdqESFReQrdWJ+LKt6NEdbYzmmfDBmjX2A==} + '@smithy/eventstream-serde-config-resolver@4.2.1': + resolution: {integrity: sha512-oSUkF9zDN9zcOUBMtxp8RewJlh71E9NoHWU8jE3hU9JMYCsmW4assVTpgic/iS3/dM317j6hO5x18cc3XrfvEw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.0.2': - resolution: {integrity: sha512-C5bJ/C6x9ENPMx2cFOirspnF9ZsBVnBMtP6BdPl/qYSuUawdGQ34Lq0dMcf42QTjUZgWGbUIZnz6+zLxJlb9aw==} + '@smithy/eventstream-serde-node@4.1.1': + resolution: {integrity: sha512-tn6vulwf/ScY0vjhzptSJuDJJqlhNtUjkxJ4wiv9E3SPoEqTEKbaq6bfqRO7nvhTG29ALICRcvfFheOUPl8KNA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.0.2': - resolution: {integrity: sha512-St8h9JqzvnbB52FtckiHPN4U/cnXcarMniXRXTKn0r4b4XesZOGiAyUdj1aXbqqn1icSqBlzzUsCl6nPB018ng==} + '@smithy/eventstream-serde-universal@4.1.1': + resolution: {integrity: sha512-uLOAiM/Dmgh2CbEXQx+6/ssK7fbzFhd+LjdyFxXid5ZBCbLHTFHLdD/QbXw5aEDsLxQhgzDxLLsZhsftAYwHJA==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.0.2': - resolution: {integrity: sha512-+9Dz8sakS9pe7f2cBocpJXdeVjMopUDLgZs1yWeu7h++WqSbjUYv/JAJwKwXw1HV6gq1jyWjxuyn24E2GhoEcQ==} + '@smithy/fetch-http-handler@5.2.1': + resolution: {integrity: sha512-5/3wxKNtV3wO/hk1is+CZUhL8a1yy/U+9u9LKQ9kZTkMsHaQjJhc3stFfiujtMnkITjzWfndGA2f7g9Uh9vKng==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.0.2': - resolution: {integrity: sha512-3g188Z3DyhtzfBRxpZjU8R9PpOQuYsbNnyStc/ZVS+9nVX1f6XeNOa9IrAh35HwwIZg+XWk8bFVtNINVscBP+g==} + '@smithy/hash-blob-browser@4.1.1': + resolution: {integrity: sha512-avAtk++s1e/1VODf+rg7c9R2pB5G9y8yaJaGY4lPZI2+UIqVyuSDMikWjeWfBVmFZ3O7NpDxBbUCyGhThVUKWQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.0.2': - resolution: {integrity: sha512-VnTpYPnRUE7yVhWozFdlxcYknv9UN7CeOqSrMH+V877v4oqtVYuoqhIhtSjmGPvYrYnAkaM61sLMKHvxL138yg==} + '@smithy/hash-node@4.1.1': + resolution: {integrity: sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.0.2': - resolution: {integrity: sha512-POWDuTznzbIwlEXEvvXoPMS10y0WKXK790soe57tFRfvf4zBHyzE529HpZMqmDdwG9MfFflnyzndUQ8j78ZdSg==} + '@smithy/hash-stream-node@4.1.1': + resolution: {integrity: sha512-3ztT4pV0Moazs3JAYFdfKk11kYFDo4b/3R3+xVjIm6wY9YpJf+xfz+ocEnNKcWAdcmSMqi168i2EMaKmJHbJMA==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.0.2': - resolution: {integrity: sha512-GatB4+2DTpgWPday+mnUkoumP54u/MDM/5u44KF9hIu8jF0uafZtQLcdfIKkIcUNuF/fBojpLEHZS/56JqPeXQ==} + '@smithy/invalid-dependency@4.1.1': + resolution: {integrity: sha512-1AqLyFlfrrDkyES8uhINRlJXmHA2FkG+3DY8X+rmLSqmFwk3DJnvhyGzyByPyewh2jbmV+TYQBEfngQax8IFGg==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.0.0': - resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + '@smithy/is-array-buffer@4.1.0': + resolution: {integrity: sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.0.2': - resolution: {integrity: sha512-Hc0R8EiuVunUewCse2syVgA2AfSRco3LyAv07B/zCOMa+jpXI9ll+Q21Nc6FAlYPcpNcAXqBzMhNs1CD/pP2bA==} + '@smithy/md5-js@4.1.1': + resolution: {integrity: sha512-MvWXKK743BuHjr/hnWuT6uStdKEaoqxHAQUvbKJPPZM5ZojTNFI5D+47BoQfBE5RgGlRRty05EbWA+NXDv+hIA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.0.2': - resolution: {integrity: sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A==} + '@smithy/middleware-content-length@4.1.1': + resolution: {integrity: sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.1.3': - resolution: {integrity: sha512-w7fJjCSqdTVTs1o1O7SRZm+Umf6r/FzkdlO5OH6tboASeUeugnMgQAs7gnc2dXvJVJtEGrmrBgPZFPxq3wWyzw==} + '@smithy/middleware-endpoint@4.2.3': + resolution: {integrity: sha512-+1H5A28DeffRVrqmVmtqtRraEjoaC6JVap3xEQdVoBh2EagCVY7noPmcBcG4y7mnr9AJitR1ZAse2l+tEtK5vg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.1.4': - resolution: {integrity: sha512-QtWuD7bd7AAEFKvBmLQdOax25bXv4BACLQNWi3ddvpWwUUSAkAku9mzI+28jbjg48qw28lbzJ+YoYbbaXhLUjw==} + '@smithy/middleware-retry@4.2.4': + resolution: {integrity: sha512-amyqYQFewnAviX3yy/rI/n1HqAgfvUdkEhc04kDjxsngAUREKuOI24iwqQUirrj6GtodWmR4iO5Zeyl3/3BwWg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.3': - resolution: {integrity: sha512-rfgDVrgLEVMmMn0BI8O+8OVr6vXzjV7HZj57l0QxslhzbvVfikZbVfBVthjLHqib4BW44QhcIgJpvebHlRaC9A==} + '@smithy/middleware-serde@4.1.1': + resolution: {integrity: sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.0.2': - resolution: {integrity: sha512-eSPVcuJJGVYrFYu2hEq8g8WWdJav3sdrI4o2c6z/rjnYDd3xH9j9E7deZQCzFn4QvGPouLngH3dQ+QVTxv5bOQ==} + '@smithy/middleware-stack@4.1.1': + resolution: {integrity: sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.1.0': - resolution: {integrity: sha512-gmPsv6L3ZRlBinv+vtSGUwfhTMh4+SgjbgGdX7bqYEs3Ys5RYVQtLuZ/WgZZdxn8QrDSUqLmTWunLM96WyM7UQ==} + '@smithy/node-config-provider@4.2.2': + resolution: {integrity: sha512-SYGTKyPvyCfEzIN5rD8q/bYaOPZprYUPD2f5g9M7OjaYupWOoQFYJ5ho+0wvxIRf471i2SR4GoiZ2r94Jq9h6A==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.0.4': - resolution: {integrity: sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g==} + '@smithy/node-http-handler@4.2.1': + resolution: {integrity: sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.0.2': - resolution: {integrity: sha512-wNRoQC1uISOuNc2s4hkOYwYllmiyrvVXWMtq+TysNRVQaHm4yoafYQyjN/goYZS+QbYlPIbb/QRjaUZMuzwQ7A==} + '@smithy/property-provider@4.1.1': + resolution: {integrity: sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.1.0': - resolution: {integrity: sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g==} + '@smithy/protocol-http@5.2.1': + resolution: {integrity: sha512-T8SlkLYCwfT/6m33SIU/JOVGNwoelkrvGjFKDSDtVvAXj/9gOT78JVJEas5a+ETjOu4SVvpCstKgd0PxSu/aHw==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.0.2': - resolution: {integrity: sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q==} + '@smithy/querystring-builder@4.1.1': + resolution: {integrity: sha512-J9b55bfimP4z/Jg1gNo+AT84hr90p716/nvxDkPGCD4W70MPms0h8KF50RDRgBGZeL83/u59DWNqJv6tEP/DHA==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.0.2': - resolution: {integrity: sha512-v6w8wnmZcVXjfVLjxw8qF7OwESD9wnpjp0Dqry/Pod0/5vcEA3qxCr+BhbOHlxS8O+29eLpT3aagxXGwIoEk7Q==} + '@smithy/querystring-parser@4.1.1': + resolution: {integrity: sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.0.3': - resolution: {integrity: sha512-FTbcajmltovWMjj3tksDQdD23b2w6gH+A0DYA1Yz3iSpjDj8fmkwy62UnXcWMy4d5YoMoSyLFHMfkEVEzbiN8Q==} + '@smithy/service-error-classification@4.1.2': + resolution: {integrity: sha512-Kqd8wyfmBWHZNppZSMfrQFpc3M9Y/kjyN8n8P4DqJJtuwgK1H914R471HTw7+RL+T7+kI1f1gOnL7Vb5z9+NgQ==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.0.2': - resolution: {integrity: sha512-J9/gTWBGVuFZ01oVA6vdb4DAjf1XbDhK6sLsu3OS9qmLrS6KB5ygpeHiM3miIbj1qgSJ96GYszXFWv6ErJ8QEw==} + '@smithy/shared-ini-file-loader@4.2.0': + resolution: {integrity: sha512-OQTfmIEp2LLuWdxa8nEEPhZmiOREO6bcB6pjs0AySf4yiZhl6kMOfqmcwcY8BaBPX+0Tb+tG7/Ia/6mwpoZ7Pw==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.1.0': - resolution: {integrity: sha512-4t5WX60sL3zGJF/CtZsUQTs3UrZEDO2P7pEaElrekbLqkWPYkgqNW1oeiNYC6xXifBnT9dVBOnNQRvOE9riU9w==} + '@smithy/signature-v4@5.2.1': + resolution: {integrity: sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.2.3': - resolution: {integrity: sha512-j/RRx6N007rJQ3qyjN4yuX9B0bxTn9ynDVxYQ43mcs7fluVJXmQGquy0TrWJfOPZcIikpY377GunZ2UK90GHYQ==} + '@smithy/smithy-client@4.6.3': + resolution: {integrity: sha512-K27LqywsaqKz4jusdUQYJh/YP2VbnbdskZ42zG8xfV+eovbTtMc2/ZatLWCfSkW0PDsTUXlpvlaMyu8925HsOw==} engines: {node: '>=18.0.0'} - '@smithy/types@4.2.0': - resolution: {integrity: sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg==} + '@smithy/types@4.5.0': + resolution: {integrity: sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.0.2': - resolution: {integrity: sha512-Bm8n3j2ScqnT+kJaClSVCMeiSenK6jVAzZCNewsYWuZtnBehEz4r2qP0riZySZVfzB+03XZHJeqfmJDkeeSLiQ==} + '@smithy/url-parser@4.1.1': + resolution: {integrity: sha512-bx32FUpkhcaKlEoOMbScvc93isaSiRM75pQ5IgIBaMkT7qMlIibpPRONyx/0CvrXHzJLpOn/u6YiDX2hcvs7Dg==} engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.0.0': - resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + '@smithy/util-base64@4.1.0': + resolution: {integrity: sha512-RUGd4wNb8GeW7xk+AY5ghGnIwM96V0l2uzvs/uVHf+tIuVX2WSvynk5CxNoBCsM2rQRSZElAo9rt3G5mJ/gktQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.0.0': - resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + '@smithy/util-body-length-browser@4.1.0': + resolution: {integrity: sha512-V2E2Iez+bo6bUMOTENPr6eEmepdY8Hbs+Uc1vkDKgKNA/brTJqOW/ai3JO1BGj9GbCeLqw90pbbH7HFQyFotGQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@4.0.0': - resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} + '@smithy/util-body-length-node@4.1.0': + resolution: {integrity: sha512-BOI5dYjheZdgR9XiEM3HJcEMCXSoqbzu7CzIgYrx0UtmvtC3tC2iDGpJLsSRFffUpy8ymsg2ARMP5fR8mtuUQQ==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.0.0': - resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + '@smithy/util-buffer-from@4.1.0': + resolution: {integrity: sha512-N6yXcjfe/E+xKEccWEKzK6M+crMrlwaCepKja0pNnlSkm6SjAeLKKA++er5Ba0I17gvKfN/ThV+ZOx/CntKTVw==} engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.0.0': - resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + '@smithy/util-config-provider@4.1.0': + resolution: {integrity: sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.11': - resolution: {integrity: sha512-Z49QNUSKbEj7JVZqaSUZkTkexRciQBbmonJ8AMar4fA0S2kvVpgjeVyGXnZYWTFzkgEwStacjFq4cQKbaQ8AnQ==} + '@smithy/util-defaults-mode-browser@4.1.3': + resolution: {integrity: sha512-5fm3i2laE95uhY6n6O6uGFxI5SVbqo3/RWEuS3YsT0LVmSZk+0eUqPhKd4qk0KxBRPaT5VNT/WEBUqdMyYoRgg==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.11': - resolution: {integrity: sha512-y9UYcXjz4ry5sDPX40Vy6224Cw2/dch+wET6giaRoeXpyh56DCUVxW+Mgc/gO2uczAKktWd4ZWs2LWcW+PHz3Q==} + '@smithy/util-defaults-mode-node@4.1.3': + resolution: {integrity: sha512-lwnMzlMslZ9GJNt+/wVjz6+fe9Wp5tqR1xAyQn+iywmP+Ymj0F6NhU/KfHM5jhGPQchRSCcau5weKhFdLIM4cA==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.0.3': - resolution: {integrity: sha512-284PZFhCMdudqq61/E67zJ3i10gCYrMBjXcMg3h048qI39gTXQCCeNZvtJhL4vrj9yMpJ/y9M+Ek7V0o5tak3w==} + '@smithy/util-endpoints@3.1.2': + resolution: {integrity: sha512-+AJsaaEGb5ySvf1SKMRrPZdYHRYSzMkCoK16jWnIMpREAnflVspMIDeCVSZJuj+5muZfgGpNpijE3mUNtjv01Q==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.0.0': - resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + '@smithy/util-hex-encoding@4.1.0': + resolution: {integrity: sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.0.2': - resolution: {integrity: sha512-6GDamTGLuBQVAEuQ4yDQ+ti/YINf/MEmIegrEeg7DdB/sld8BX1lqt9RRuIcABOhAGTA50bRbPzErez7SlDtDQ==} + '@smithy/util-middleware@4.1.1': + resolution: {integrity: sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.0.3': - resolution: {integrity: sha512-DPuYjZQDXmKr/sNvy9Spu8R/ESa2e22wXZzSAY6NkjOLj6spbIje/Aq8rT97iUMdDj0qHMRIe+bTxvlU74d9Ng==} + '@smithy/util-retry@4.1.2': + resolution: {integrity: sha512-NCgr1d0/EdeP6U5PSZ9Uv5SMR5XRRYoVr1kRVtKZxWL3tixEL3UatrPIMFZSKwHlCcp2zPLDvMubVDULRqeunA==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.2.0': - resolution: {integrity: sha512-Vj1TtwWnuWqdgQI6YTUF5hQ/0jmFiOYsc51CSMgj7QfyO+RF4EnT2HNjoviNlOOmgzgvf3f5yno+EiC4vrnaWQ==} + '@smithy/util-stream@4.3.2': + resolution: {integrity: sha512-Ka+FA2UCC/Q1dEqUanCdpqwxOFdf5Dg2VXtPtB1qxLcSGh5C1HdzklIt18xL504Wiy9nNUKwDMRTVCbKGoK69g==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.0.0': - resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + '@smithy/util-uri-escape@4.1.0': + resolution: {integrity: sha512-b0EFQkq35K5NHUYxU72JuoheM6+pytEVUGlTwiFxWFpmddA+Bpz3LgsPRIpBk8lnPE47yT7AF2Egc3jVnKLuPg==} engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.0.0': - resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + '@smithy/util-utf8@4.1.0': + resolution: {integrity: sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.0.3': - resolution: {integrity: sha512-JtaY3FxmD+te+KSI2FJuEcfNC9T/DGGVf551babM7fAaXhjJUt7oSYurH1Devxd2+BOSUACCgt3buinx4UnmEA==} + '@smithy/util-waiter@4.1.1': + resolution: {integrity: sha512-PJBmyayrlfxM7nbqjomF4YcT1sApQwZio0NHSsT0EzhJqljRmvhzqZua43TyEs80nJk2Cn2FGPg/N8phH6KeCQ==} engines: {node: '>=18.0.0'} '@solana/buffer-layout-utils@0.2.0': @@ -1881,11 +1972,11 @@ packages: peerDependencies: typescript: '>=5' - '@solana/codecs-core@2.1.0': - resolution: {integrity: sha512-SR7pKtmJBg2mhmkel2NeHA1pz06QeQXdMv8WJoIR9m8F/hw80K/612uaYbwTt2nkK0jg/Qn/rNSd7EcJ4SBGjw==} + '@solana/codecs-core@2.3.0': + resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5' + typescript: '>=5.3.3' '@solana/codecs-data-structures@2.0.0-preview.4': resolution: {integrity: sha512-nt2k2eTeyzlI/ccutPcG36M/J8NAYfxBPI9h/nQjgJ+M+IgOKi31JV8StDDlG/1XvY0zyqugV3I0r3KAbZRJpA==} @@ -1907,11 +1998,11 @@ packages: peerDependencies: typescript: '>=5' - '@solana/codecs-numbers@2.1.0': - resolution: {integrity: sha512-XMu4yw5iCgQnMKsxSWPPOrGgtaohmupN3eyAtYv3K3C/MJEc5V90h74k5B1GUCiHvcrdUDO9RclNjD9lgbjFag==} + '@solana/codecs-numbers@2.3.0': + resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5' + typescript: '>=5.3.3' '@solana/codecs-strings@2.0.0-preview.4': resolution: {integrity: sha512-YDbsQePRWm+xnrfS64losSGRg8Wb76cjK1K6qfR8LPmdwIC3787x9uW5/E4icl/k+9nwgbIRXZ65lpF+ucZUnw==} @@ -1947,12 +2038,12 @@ packages: peerDependencies: typescript: '>=5' - '@solana/errors@2.1.0': - resolution: {integrity: sha512-l+GxAv0Ar4d3c3PlZdA9G++wFYZREEbbRyAFP8+n8HSg0vudCuzogh/13io6hYuUhG/9Ve8ARZNamhV7UScKNw==} + '@solana/errors@2.3.0': + resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} engines: {node: '>=20.18.0'} hasBin: true peerDependencies: - typescript: '>=5' + typescript: '>=5.3.3' '@solana/options@2.0.0-preview.4': resolution: {integrity: sha512-tv2O/Frxql/wSe3jbzi5nVicIWIus/BftH+5ZR+r9r3FO0/htEllZS5Q9XdbmSboHu+St87584JXeDx3xm4jaA==} @@ -2012,8 +2103,8 @@ packages: resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} engines: {node: '>=16'} - '@solana/wallet-adapter-base@0.9.26': - resolution: {integrity: sha512-1RcmfesJ8bTT+zfg4w+Z+wisj11HR+vWwl/pS6v/zwQPe0LSzWDpkXRv9JuDSCuTcmlglEfjEqFAW+5EubK/Jg==} + '@solana/wallet-adapter-base@0.9.27': + resolution: {integrity: sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg==} engines: {node: '>=20'} peerDependencies: '@solana/web3.js': ^1.98.0 @@ -2022,17 +2113,30 @@ packages: resolution: {integrity: sha512-ZhpZtD+4VArf6RPitsVExvgkF+nGghd1rzPjd97GmBximpnt1rsUxMOEyoIEuH3XBxPyNB6Us7ha7RHWQR+abg==} engines: {node: '>=16'} - '@solana/web3.js@1.95.8': - resolution: {integrity: sha512-sBHzNh7dHMrmNS5xPD1d0Xa2QffW/RXaxu/OysRXBfwTp+LYqGGmMtCYYwrHPrN5rjAmJCsQRNAwv4FM0t3B6g==} - - '@solana/web3.js@1.98.2': - resolution: {integrity: sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A==} + '@solana/web3.js@1.98.4': + resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} '@solflare-wallet/utl-sdk@1.4.0': resolution: {integrity: sha512-0E3s+fXs5XMGBNrXGB4XSH4+sPgLanbBEVyz227KJyxSIgiRdQMcM2Yv/KdnMHNmhYoR/aPpH6TH115SIJqM0A==} peerDependencies: '@solana/web3.js': '*' + '@sundaeswap/asset@1.0.11': + resolution: {integrity: sha512-xbubSh7cm/0yb/8sHCw6ad03fS6L8/1tMiT9q7LeM9y8mn+xQ64ylJkCWWob1tVQDf6BaaWsKquhXlKhsn+70Q==} + + '@sundaeswap/bigint-math@0.6.3': + resolution: {integrity: sha512-FTXBd8F9LAvZsTZII7SBbZTEnjJc4JOSHp0XM+byAMsIDXglrYKotZT8z4QnYBxq1EcuhONsKdutibTfst4sgg==} + + '@sundaeswap/cpp@1.0.13': + resolution: {integrity: sha512-YxDra67Bqlb0Hjwja7SPq8I+I1rduWXwJXggOQu7n9+ogbAfz8DEIiCXep+K8h2nFa1miLPGVFYbrYC83cEvRw==} + peerDependencies: + '@sundaeswap/asset': ^1.0.11 + '@sundaeswap/bigint-math': ^0.6.0 + '@sundaeswap/fraction': ^1.0.0 + + '@sundaeswap/fraction@1.0.8': + resolution: {integrity: sha512-vTDao3tzT/cbWt+uTy5dPWUwe7FVkNoPWG6x+pXP4go7kSCy2tzLaNaFP79pOfJENPMYoLd7OXiClQ98pCeY6Q==} + '@supercharge/promise-pool@2.4.0': resolution: {integrity: sha512-O9CMipBlq5OObdt1uKJGIzm9cdjpPWfj+a+Zw9EgWKxaMNHKC7EU7X9taj3H0EGQNLOSq2jAcOa3EzxlfHsD6w==} engines: {node: '>=8'} @@ -2040,6 +2144,10 @@ packages: '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -2052,8 +2160,8 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@types/abstract-leveldown@7.2.5': resolution: {integrity: sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg==} @@ -2070,14 +2178,14 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/bn.js@5.1.6': resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} '@types/brotli@1.3.4': resolution: {integrity: sha512-cKYjgaS2DMdCKF7R0F5cgx1nfBYObN2ihIuPGQ4/dlIY6RpV7OWNwe9L8V4tTVKL2eZqOkNM9FM/rgTvLf4oXw==} @@ -2085,6 +2193,9 @@ packages: '@types/bs58@4.0.4': resolution: {integrity: sha512-0IEpMFXXQi2zXaXl9GJ3sRwQo0uEkD+yFOv+FnAU5lkPtcu6h61xb7jc2CFPEZ5BUOaiP13ThuGc9HD4R8lR5g==} + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -2094,8 +2205,8 @@ packages: '@types/express-serve-static-core@4.19.6': resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@4.17.23': + resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} @@ -2103,8 +2214,11 @@ packages: '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -2127,6 +2241,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/level-codec@9.0.4': resolution: {integrity: sha512-N6v5EhpvF00Wv+1ixzqca9YD2wdK76JceSnUoiKfQh/vex+VFG852wzqohnlYf67nzKQoXeRzYd8W57fIkYCvg==} @@ -2139,9 +2256,6 @@ packages: '@types/levelup@5.1.5': resolution: {integrity: sha512-Sm0jSj+LoncQ8BuZZJBjYitY5r9/V/Xd//vRjfgbQLWcQg2/iCm0HQqIOZ1KBE7QdNyAqMIG97mE3+t1GR0TIw==} - '@types/lru-cache@5.1.1': - resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} - '@types/mathjs@9.4.2': resolution: {integrity: sha512-GF5g1vJmvKdWIWsE53XX7EDAyCaZ9p6gaYm1xhlXn5JjrY/NJrOfJN3fBxS3wyZpVh3QqKoMkS2WjFwxWMHOTw==} deprecated: This is a stub types definition. mathjs provides its own type definitions, so you do not need this installed. @@ -2152,8 +2266,8 @@ packages: '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - '@types/node-fetch@2.6.12': - resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + '@types/node-fetch@2.6.13': + resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} '@types/node@11.11.6': resolution: {integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==} @@ -2167,20 +2281,23 @@ packages: '@types/pbkdf2@3.1.2': resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} - '@types/qs@6.9.18': - resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} '@types/stack-utils@1.0.1': resolution: {integrity: sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==} @@ -2194,8 +2311,11 @@ packages: '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - '@types/w3c-web-usb@1.0.10': - resolution: {integrity: sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==} + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + '@types/w3c-web-usb@1.0.12': + resolution: {integrity: sha512-GD9XFhJZFtCbspsB3t1vD3SgkWVInIMoL1g1CcE0p3DD7abgLrQ2Ws22RS38CXPUCQXgyKjUAGKdy5d0CLT5jw==} '@types/ws@7.4.7': resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} @@ -2280,8 +2400,8 @@ packages: resolution: {integrity: sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==} engines: {node: '>=10'} - '@uniswap/permit2-sdk@1.3.1': - resolution: {integrity: sha512-Eq2by4zVEVSZL3PJ1Yuf5+AZ/yE1GOuksWzPXPoxr5WRm3hqh34jKEqtyTImHqwuPrdILG8i02xJmgGLTH1QfA==} + '@uniswap/permit2-sdk@1.4.0': + resolution: {integrity: sha512-l/aGhfhB93M76vXs4eB8QNwhELE6bs66kh7F1cyobaPtINaVpMmlJv+j3KmHeHwAZIsh7QXyYzhDxs07u0Pe4Q==} '@uniswap/router-sdk@1.23.0': resolution: {integrity: sha512-KkHoMauTZh2N44sOU0ZuYseNNn9nAvaU57HwyCWjtwZdA7HaXtACfIRJbQvnkNNuALJfzHNkuv2aFyPSjNNmMw==} @@ -2325,8 +2445,8 @@ packages: resolution: {integrity: sha512-EB/NLIkuT2BCdKnh2wcXT0cmINjRoiskjibFclpheALHL49XSrB08H4k7KV3BP6+JNKLeTHekvTDdsMd9rs5TA==} engines: {node: '>=14'} - '@uniswap/universal-router-sdk@4.19.6': - resolution: {integrity: sha512-vBtHv4OzEn6Spkl1UgN/0TqO354w7RUdsE1uwAdqz2zfxhV48GOlKJWpe7LiI2ZukL/BMubLewtwC4q/RfjjJQ==} + '@uniswap/universal-router-sdk@4.19.7': + resolution: {integrity: sha512-fh7YflU4Crl5WTlaDnyW3heMIOEZdGnYkM/bJ1L7gcWY5n0Y6BgRSnskFIiZw3LDKDBIqkxMPcKytEf9ijaPWQ==} engines: {node: '>=14'} '@uniswap/universal-router@1.6.0': @@ -2374,98 +2494,98 @@ packages: resolution: {integrity: sha512-so3c/CmaRmRSvgKFyrUWy6DCSogyzyVaoYCec/TJ4k2hXlJ8MK4vumcuxtmRr1oMnZ5KmaCPBS12Knb4FC3nsw==} engines: {node: '>=14'} - '@unrs/resolver-binding-android-arm-eabi@1.9.2': - resolution: {integrity: sha512-tS+lqTU3N0kkthU+rYp0spAYq15DU8ld9kXkaKg9sbQqJNF+WPMuNHZQGCgdxrUOEO0j22RKMwRVhF1HTl+X8A==} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] os: [android] - '@unrs/resolver-binding-android-arm64@1.9.2': - resolution: {integrity: sha512-MffGiZULa/KmkNjHeuuflLVqfhqLv1vZLm8lWIyeADvlElJ/GLSOkoUX+5jf4/EGtfwrNFcEaB8BRas03KT0/Q==} + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} cpu: [arm64] os: [android] - '@unrs/resolver-binding-darwin-arm64@1.9.2': - resolution: {integrity: sha512-dzJYK5rohS1sYl1DHdJ3mwfwClJj5BClQnQSyAgEfggbUwA9RlROQSSbKBLqrGfsiC/VyrDPtbO8hh56fnkbsQ==} + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.9.2': - resolution: {integrity: sha512-gaIMWK+CWtXcg9gUyznkdV54LzQ90S3X3dn8zlh+QR5Xy7Y+Efqw4Rs4im61K1juy4YNb67vmJsCDAGOnIeffQ==} + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.9.2': - resolution: {integrity: sha512-S7QpkMbVoVJb0xwHFwujnwCAEDe/596xqY603rpi/ioTn9VDgBHnCCxh+UFrr5yxuMH+dliHfjwCZJXOPJGPnw==} + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.2': - resolution: {integrity: sha512-+XPUMCuCCI80I46nCDFbGum0ZODP5NWGiwS3Pj8fOgsG5/ctz+/zzuBlq/WmGa+EjWZdue6CF0aWWNv84sE1uw==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.9.2': - resolution: {integrity: sha512-sqvUyAd1JUpwbz33Ce2tuTLJKM+ucSsYpPGl2vuFwZnEIg0CmdxiZ01MHQ3j6ExuRqEDUCy8yvkDKvjYFPb8Zg==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.9.2': - resolution: {integrity: sha512-UYA0MA8ajkEDCFRQdng/FVx3F6szBvk3EPnkTTQuuO9lV1kPGuTB+V9TmbDxy5ikaEgyWKxa4CI3ySjklZ9lFA==} + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.9.2': - resolution: {integrity: sha512-P/CO3ODU9YJIHFqAkHbquKtFst0COxdphc8TKGL5yCX75GOiVpGqd1d15ahpqu8xXVsqP4MGFP2C3LRZnnL5MA==} + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.9.2': - resolution: {integrity: sha512-uKStFlOELBxBum2s1hODPtgJhY4NxYJE9pAeyBgNEzHgTqTiVBPjfTlPFJkfxyTjQEuxZbbJlJnMCrRgD7ubzw==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-gnu@1.9.2': - resolution: {integrity: sha512-LkbNnZlhINfY9gK30AHs26IIVEZ9PEl9qOScYdmY2o81imJYI4IMnJiW0vJVtXaDHvBvxeAgEy5CflwJFIl3tQ==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-musl@1.9.2': - resolution: {integrity: sha512-vI+e6FzLyZHSLFNomPi+nT+qUWN4YSj8pFtQZSFTtmgFoxqB6NyjxSjAxEC1m93qn6hUXhIsh8WMp+fGgxCoRg==} + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.9.2': - resolution: {integrity: sha512-sSO4AlAYhSM2RAzBsRpahcJB1msc6uYLAtP6pesPbZtptF8OU/CbCPhSRW6cnYOGuVmEmWVW5xVboAqCnWTeHQ==} + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.9.2': - resolution: {integrity: sha512-jkSkwch0uPFva20Mdu8orbQjv2A3G88NExTN2oPTI1AJ+7mZfYW3cDCTyoH6OnctBKbBVeJCEqh0U02lTkqD5w==} + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.9.2': - resolution: {integrity: sha512-Uk64NoiTpQbkpl+bXsbeyOPRpUoMdcUqa+hDC1KhMW7aN1lfW8PBlBH4mJ3n3Y47dYE8qi0XTxy1mBACruYBaw==} + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.9.2': - resolution: {integrity: sha512-EpBGwkcjDicjR/ybC0g8wO5adPNdVuMrNalVgYcWi+gYtC1XYNuxe3rufcO7dA76OHGeVabcO6cSkPJKVcbCXQ==} + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.9.2': - resolution: {integrity: sha512-EdFbGn7o1SxGmN6aZw9wAkehZJetFPao0VGZ9OMBwKx6TkvDuj6cNeLimF/Psi6ts9lMOe+Dt6z19fZQ9Ye2fw==} + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.9.2': - resolution: {integrity: sha512-JY9hi1p7AG+5c/dMU8o2kWemM8I6VZxfGwn1GCtf3c5i+IKcMo2NQ8OjZ4Z3/itvY/Si3K10jOBQn7qsD/whUA==} + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.9.2': - resolution: {integrity: sha512-ryoo+EB19lMxAd80ln9BVf8pdOAxLb97amrQ3SFN9OCRn/5M5wvwDgAe4i8ZjhpbiHoDeP8yavcTEnpKBo7lZg==} + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} cpu: [x64] os: [win32] @@ -2488,11 +2608,11 @@ packages: zod: optional: true - abitype@1.0.9: - resolution: {integrity: sha512-oN0S++TQmlwWuB+rkA6aiEefLv3SP+2l/tC5mux/TLj6qdA6rF15Vbpex4fHovLsMkwLwTIRj8/Q8vXCS3GfOg==} + abitype@1.1.0: + resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} peerDependencies: typescript: '>=5.0.4' - zod: ^3 >=3.22.0 + zod: ^3.22.0 || ^4.0.0 peerDependenciesMeta: typescript: optional: true @@ -2523,8 +2643,8 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -2588,8 +2708,8 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@7.0.0: - resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + ansi-escapes@7.1.0: + resolution: {integrity: sha512-YdhtCd19sKRKfAAUsrcC1wzm4JuzJoiX4pOJqIoW2qmKj5WzG/dL8uUJ0361zaXtHqK7gEhOwtAtz7t3Yq3X5g==} engines: {node: '>=18'} ansi-regex@3.0.1: @@ -2604,8 +2724,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -2620,8 +2740,8 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} ansicolors@0.3.2: @@ -2672,8 +2792,8 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} array-union@2.1.0: @@ -2712,6 +2832,10 @@ packages: asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + asn1js@3.0.6: + resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} + engines: {node: '>=12.0.0'} + assert@2.1.0: resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} @@ -2764,8 +2888,8 @@ packages: resolution: {integrity: sha512-gsDXAS6XVc4Jt+7S92MPX6Noq69bdeXUPEaXd8dk3+yVr629LTDLxNt4j1ycBbrU+AStK2PhKIyNIM+xzWMVOQ==} engines: {node: '>=6'} - axios@1.9.0: - resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} + axios@1.12.2: + resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} @@ -2781,10 +2905,10 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0 || ^8.0.0-0 babel-preset-jest@29.6.3: resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} @@ -2815,9 +2939,16 @@ packages: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} + baseline-browser-mapping@2.8.6: + resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==} + hasBin: true + bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + bech32@2.0.0: + resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} + big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -2828,8 +2959,8 @@ packages: resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} engines: {node: '>= 10.0.0'} - bignumber.js@9.3.0: - resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==} + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} @@ -2850,6 +2981,12 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blake2b-wasm@1.1.7: + resolution: {integrity: sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA==} + + blake2b@2.1.3: + resolution: {integrity: sha512-pkDss4xFVbMb4270aCyGD3qLv92314Et+FsKzilCLxDz5DuZ2/1g3w4nmBbu6nKApPspnjG7JcwTjGZnduB1yg==} + blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} @@ -2869,18 +3006,21 @@ packages: borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + + bowser@2.12.1: + resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} boxen@5.1.2: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} @@ -2905,8 +3045,8 @@ packages: browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - browserslist@4.24.5: - resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} + browserslist@4.26.2: + resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2978,6 +3118,14 @@ packages: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -3002,8 +3150,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001717: - resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==} + caniuse-lite@1.0.30001743: + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} capability@0.2.5: resolution: {integrity: sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==} @@ -3012,6 +3160,10 @@ packages: resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} engines: {node: '>=6'} + cbor@9.0.2: + resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} + engines: {node: '>=16'} + chai@4.5.0: resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} @@ -3024,16 +3176,16 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.6.0: - resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} @@ -3095,9 +3247,9 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + cli-truncate@5.1.0: + resolution: {integrity: sha512-7JDGG+4Zp0CsknDCedl0DYdaeOhc46QNpXi3NLQblkZpXXgA6LncLDUUyvrjSvZeF3VRQa+KiMGomazQrC1V8g==} + engines: {node: '>=20'} cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} @@ -3110,6 +3262,9 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -3165,12 +3320,8 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@14.0.0: - resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} + commander@14.0.1: + resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} engines: {node: '>=20'} commander@2.20.3: @@ -3227,6 +3378,9 @@ packages: resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true + core-js@3.45.1: + resolution: {integrity: sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -3264,19 +3418,23 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - csv-generate@4.4.2: - resolution: {integrity: sha512-W6nVsf+rz0J3yo9FOjeer7tmzBJKaTTxf7K0uw6GZgRocZYPVpuSWWa5/aoWWrjQZj4/oNIKTYapOM7hiNjVMA==} + csv-generate@4.5.0: + resolution: {integrity: sha512-aQr/vmOKyBSBHNwYhAoXw1+kUsPnMSwmYgpNoo36rIXoG1ecWILnvPGZeQ6oUjzrWknZAD3+jfpqYOBAl4x15A==} - csv-parse@5.6.0: - resolution: {integrity: sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==} + csv-parse@6.1.0: + resolution: {integrity: sha512-CEE+jwpgLn+MmtCpVcPtiCZpVtB6Z2OKPTr34pycYYoL7sxdOkXDdQ4lRiw6ioC0q6BLqhc6cKweCVvral8yhw==} - csv-stringify@6.5.2: - resolution: {integrity: sha512-RFPahj0sXcmUyjrObAK+DOWtMvMIFV328n4qZJhgX3x2RqkQgOTU2mCUmiFR0CzM6AzChlRSUErjiJeEt8BaQA==} + csv-stringify@6.6.0: + resolution: {integrity: sha512-YW32lKOmIBgbxtu3g5SaiqWNwa/9ISQt2EcgOq0+RAIFufFp9is6tqNnKahqE5kuKvrnYAzs28r+s6pXJR8Vcw==} - csv@6.3.11: - resolution: {integrity: sha512-a8bhT76Q546jOElHcTrkzWY7Py925mfLO/jqquseH61ThOebYwOjLbWHBqdRB4K1VpU36sTyIei6Jwj7QdEZ7g==} + csv@6.4.1: + resolution: {integrity: sha512-ajGosmTGnTwYyGl8STqZDu7R6LkDf3xL39XiOmliV/GufQeVUxHzTKIm4NOBCwmEuujK7B6isxs4Uqt9GcRCvA==} engines: {node: '>= 0.1.90'} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -3292,8 +3450,8 @@ packages: dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dayjs@1.11.18: + resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} @@ -3320,17 +3478,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -3345,8 +3494,8 @@ packages: decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - decimal.js@10.5.0: - resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} @@ -3356,8 +3505,8 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.6.0: - resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} + dedent@1.7.0: + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -3382,6 +3531,10 @@ packages: defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -3422,8 +3575,8 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + detect-libc@2.1.0: + resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} engines: {node: '>=8'} detect-newline@3.1.0: @@ -3465,8 +3618,8 @@ packages: resolution: {integrity: sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ==} engines: {node: '>=12'} - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} dtrace-provider@0.8.8: @@ -3489,13 +3642,8 @@ packages: eip55@2.1.1: resolution: {integrity: sha512-WcagVAmNu2Ww2cDUfzuWVntYwFxbvZ5MvIyLZpMjTTkjD6sCvkGOiS86jTppzu9/gWsc8isLHAeMBWK02OnZmA==} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - - electron-to-chromium@1.5.151: - resolution: {integrity: sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==} + electron-to-chromium@1.5.222: + resolution: {integrity: sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -3504,8 +3652,8 @@ packages: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} - emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3524,11 +3672,8 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} @@ -3542,14 +3687,14 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} error-polyfill@0.1.3: resolution: {integrity: sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg==} - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -3582,8 +3727,8 @@ packages: es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - esbuild@0.25.5: - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} hasBin: true @@ -3615,8 +3760,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + eslint-config-prettier@9.1.2: + resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -3659,8 +3804,8 @@ packages: eslint-plugin-import-x: optional: true - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -3686,8 +3831,8 @@ packages: peerDependencies: eslint: '>=8' - eslint-plugin-import@2.31.0: - resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -3702,8 +3847,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.4.0: - resolution: {integrity: sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==} + eslint-plugin-prettier@5.5.4: + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -3850,10 +3995,6 @@ packages: resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} engines: {node: '>=0.10.0'} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - extglob@2.0.4: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} @@ -3910,11 +4051,11 @@ packages: fast-uri@2.4.0: resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-xml-parser@4.4.1: - resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true fastestsmallesttextencoderdecoder@1.0.22: @@ -3941,8 +4082,9 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fdir@6.4.4: - resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -3952,6 +4094,10 @@ packages: fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -3966,9 +4112,6 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - fill-range@4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} @@ -4007,8 +4150,8 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -4028,14 +4171,18 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@3.0.3: - resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} + form-data@3.0.4: + resolution: {integrity: sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==} engines: {node: '>= 6'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -4098,8 +4245,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} get-func-name@2.0.2: @@ -4117,6 +4264,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -4125,9 +4276,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} - get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} @@ -4150,6 +4298,11 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} deprecated: Glob versions prior to v9 are no longer supported @@ -4163,10 +4316,6 @@ packages: engines: {node: '>=12'} deprecated: Glob versions prior to v9 are no longer supported - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -4183,6 +4332,10 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -4207,13 +4360,18 @@ packages: resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + hardhat-watcher@2.5.0: resolution: {integrity: sha512-Su2qcSMIo2YO2PrmJ0/tdkf+6pSt8zf9+4URR5edMVti6+ShI8T3xhPrwugdyTOFuyj8lKHrcTZNKUFYowYiyA==} peerDependencies: hardhat: ^2.0.0 - hardhat@2.24.0: - resolution: {integrity: sha512-wDkD5GPmttYv21MR7tGDkyQ22tO2V86OEV8pA7NcXWYUpibe8XZ2EanXCeRHO61vwEx0f7/M+NqrhJwasaNMJg==} + hardhat@2.26.3: + resolution: {integrity: sha512-gBfjbxCCEaRgMCRgTpjo1CEoJwqNPhyGMMVHYZJxoQ3LLftp2erSVf8ZF6hTQC0r2wst4NcqNmLWqMnHg1quTw==} hasBin: true peerDependencies: ts-node: '*' @@ -4297,6 +4455,9 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-errors@1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} @@ -4305,6 +4466,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -4325,8 +4490,8 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} engines: {node: '>=0.10.0'} ieee754@1.2.1: @@ -4366,8 +4531,8 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + inquirer@8.2.7: + resolution: {integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==} engines: {node: '>=12.0.0'} internal-slot@1.1.0: @@ -4396,8 +4561,8 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} @@ -4477,12 +4642,8 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - - is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} is-generator-fn@2.1.0: @@ -4513,6 +4674,10 @@ packages: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -4638,17 +4803,16 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jake@10.9.2: - resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} - engines: {node: '>=10'} - hasBin: true + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} javascript-natural-sort@0.7.1: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} @@ -4895,8 +5059,8 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} keccak@3.0.4: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} @@ -4951,21 +5115,17 @@ packages: light-my-request@5.14.0: resolution: {integrity: sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@16.1.2: - resolution: {integrity: sha512-sQKw2Si2g9KUZNY3XNvRuDq4UJqpHwF0/FQzZR2M7I5MvtpWvibikCjUVJzZdGE0ByurEl3KQNvsGetd1ty1/Q==} + lint-staged@16.2.0: + resolution: {integrity: sha512-spdYSOCQ2MdZ9CM1/bu/kDmaYGsrpNOeu1InFFV8uhv14x6YIubGxbCpSmGILFoxkiheNQPDXSg5Sbb5ZuVnug==} engines: {node: '>=20.17'} hasBin: true - listr2@8.3.3: - resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} - engines: {node: '>=18.0.0'} + listr2@9.0.4: + resolution: {integrity: sha512-1wd/kpAdKRLwv7/3OKC8zZ5U8e/fajCfWMxacUvB79S5nLrYGPtUI/8chMQhn3LQjsRVErTb9i1ECAwW0ZIHnQ==} + engines: {node: '>=20.0.0'} locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} @@ -5012,9 +5172,17 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.1: + resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -5120,6 +5288,10 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -5130,6 +5302,10 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -5202,13 +5378,16 @@ packages: resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} engines: {node: '>=12.0.0'} - nan@2.22.2: - resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} + nan@2.23.0: + resolution: {integrity: sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==} - nano-spawn@1.0.2: - resolution: {integrity: sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==} + nano-spawn@1.0.3: + resolution: {integrity: sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==} engines: {node: '>=20.17'} + nanoassert@1.1.0: + resolution: {integrity: sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==} + nanomatch@1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -5219,8 +5398,8 @@ packages: napi-macros@2.2.2: resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} - napi-postinstall@0.2.5: - resolution: {integrity: sha512-kmsgUvCRIJohHjbZ3V8avP0I1Pekw329MVAMDzVxsrkjgdnqiwvMX5XwR+hWV66vsAtZ+iM+fVnq8RTQawUmCQ==} + napi-postinstall@0.3.3: + resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true @@ -5244,6 +5423,9 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -5251,8 +5433,8 @@ packages: resolution: {integrity: sha512-WmS3EUGw+vXHlTgiUPi3NzbZNwH6+uGX0QLGgqG+aFSJ5rkX/Ee0nuwHBJfZTfQwwR8lGO819NEIwQ7CGhkdEQ==} deprecated: Use `change-case` - node-abi@3.75.0: - resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + node-abi@3.77.0: + resolution: {integrity: sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==} engines: {node: '>=10'} node-addon-api@2.0.2: @@ -5271,6 +5453,11 @@ packages: resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} engines: {node: '>= 8.0.0'} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + node-fetch@2.6.1: resolution: {integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==} engines: {node: 4.x || >=6.0.0} @@ -5284,6 +5471,10 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -5296,8 +5487,12 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.21: + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + + nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} noms@0.0.0: resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} @@ -5306,6 +5501,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -5413,14 +5612,18 @@ packages: typescript: optional: true - ox@0.9.3: - resolution: {integrity: sha512-KzyJP+fPV4uhuuqrTZyok4DC7vFzi7HLUFiUNEmpbyh59htKWkOC98IONC1zgXJPbHAhQgqs6B0Z6StCGhmQvg==} + ox@0.9.6: + resolution: {integrity: sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -5486,6 +5689,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} @@ -5510,8 +5717,8 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} pidtree@0.6.0: @@ -5529,8 +5736,8 @@ packages: pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@9.6.0: - resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} + pino@9.11.0: + resolution: {integrity: sha512-+YIodBB9sxcWeR8PrXC2K3gEDyfkUuVEITOcbqrfcj+z5QW4ioIcqZfYFbrLTYLsmAwunbS7nfU/dpBB6PZc1g==} hasBin: true pirates@4.0.7: @@ -5545,8 +5752,8 @@ packages: resolution: {integrity: sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==} engines: {node: '>=12'} - pnpm@10.10.0: - resolution: {integrity: sha512-1hXbJG/nDyXc/qbY1z3ueCziPiJF48T2+Igkn7VoFJMYY33Kc8LFyO8qTKDVZX+5VnGIv6tH9WbR7mzph4FcOQ==} + pnpm@10.17.0: + resolution: {integrity: sha512-/Oij3Smk7S7FZvtT77sE2MRKDwW8bySnMEaRD7nDznr6NaCYBQBmj6NXM0W9ZEZE+pgzj6FoI1yA9KoXqhf77w==} engines: {node: '>=18.12'} hasBin: true @@ -5571,8 +5778,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true @@ -5593,8 +5800,8 @@ packages: process-warning@3.0.0: resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - process-warning@4.0.1: - resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} @@ -5616,8 +5823,8 @@ packages: engines: {node: '>= 0.10'} hasBin: true - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -5626,6 +5833,13 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.3: + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} + engines: {node: '>=6.0.0'} + qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} @@ -5640,6 +5854,10 @@ packages: quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -5728,6 +5946,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -5759,6 +5980,9 @@ packages: engines: {node: '>= 0.4'} hasBin: true + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -5796,6 +6020,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + ripemd160@2.0.1: resolution: {integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==} @@ -5806,8 +6035,8 @@ packages: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} + rpc-websockets@9.1.3: + resolution: {integrity: sha512-I+kNjW0udB4Fetr3vvtRuYZJS0PcSPyyvBcH5sDdoV8DFs5E4W2pTr7aiMlKfPxANTClP9RlqCPolj9dd5MsEA==} run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} @@ -5883,8 +6112,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -5924,10 +6153,14 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} hasBin: true + sha3@2.1.4: + resolution: {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -5965,8 +6198,8 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -5983,12 +6216,8 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - - slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} snake-case@3.0.4: @@ -6098,6 +6327,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + stream-blackhole@1.0.3: resolution: {integrity: sha512-7NWl3dkmCd12mPkEwTbBPGxwvxj7L4O9DTjJudn02Fmk9K+RuPaDF8zeGo3kmjbsffU5E1aGpZ1dTR9AaRg6AQ==} @@ -6110,8 +6343,8 @@ packages: stream-json@1.9.1: resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - stream-transform@3.3.3: - resolution: {integrity: sha512-dALXrXe+uq4aO5oStdHKlfCM/b3NBdouigvxVPxCdrMRAU6oHh3KNss20VbTPQNQmjAHzZGKGe66vgwegFEIog==} + stream-transform@3.4.0: + resolution: {integrity: sha512-QO3OGhKyeIV8p6eRQdG+W6WounFw519zk690hHCNfhgfP9bylVS+NTXsuBc7n+RsGn31UgFPGrWYIgoAbArKEw==} string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} @@ -6133,6 +6366,10 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string-width@8.1.0: + resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + engines: {node: '>=20'} + string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} @@ -6158,8 +6395,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-bom@3.0.0: @@ -6186,8 +6423,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@1.1.2: - resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} superstruct@0.15.5: resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} @@ -6212,16 +6449,16 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.11.4: - resolution: {integrity: sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==} + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} table@6.9.0: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} - tar-fs@2.1.3: - resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} + tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -6258,8 +6495,8 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} tmp-promise@3.0.3: @@ -6269,8 +6506,8 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} tmpl@1.0.5: @@ -6327,17 +6564,18 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-jest@29.3.2: - resolution: {integrity: sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==} + ts-jest@29.4.4: + resolution: {integrity: sha512-ccVcRABct5ZELCT5U0+DZwkXMCcOCLi2doHRrKy1nK/s7J7bch6TzJMsrY09WxgUUIP/ITfmcDS8D2yl63rnXw==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 esbuild: '*' - jest: ^29.0.0 + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 typescript: '>=4.3 <6' peerDependenciesMeta: '@babel/core': @@ -6350,6 +6588,8 @@ packages: optional: true esbuild: optional: true + jest-util: + optional: true ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} @@ -6386,8 +6626,8 @@ packages: tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} - tsx@4.20.3: - resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} + tsx@4.20.5: + resolution: {integrity: sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==} engines: {node: '>=18.0.0'} hasBin: true @@ -6449,14 +6689,19 @@ packages: resolution: {integrity: sha512-bctQIOqx2iVbWGDGPWwIm18QScpu2XRmkC19D8rQGFsjKSgteq/o1hTZvIG/wuDq8fanpBDrLkLq+aEN/6y5XQ==} engines: {node: '>= 10'} - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true u3@0.1.1: resolution: {integrity: sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -6481,8 +6726,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unrs-resolver@1.9.2: - resolution: {integrity: sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA==} + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} unset-value@1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} @@ -6561,8 +6806,8 @@ packages: typescript: optional: true - viem@2.37.1: - resolution: {integrity: sha512-IzacdIXYlOvzDJwNKIVa53LP/LaP70qvBGAIoGH6R+n06S/ru/nnQxLNZ6+JImvIcxwNwgAl0jUA6FZEIQQWSw==} + viem@2.37.7: + resolution: {integrity: sha512-KmTK/xc6790I0V9iaiJz8C3RdGevpU+fPvg53eOlfEfsfz0wCypXqOlOmCcjzkpmf2XFoEtu9MAxhMqk8YdNNA==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -6583,10 +6828,17 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + web3-utils@1.7.3: resolution: {integrity: sha512-g6nQgvb/bUpVUIxJE+ezVN+rYwYmlFyMvMIRSuqpi1dk6ApDD00YNArrk7sPcZnjvxOJ76813Xs2vIN2rgh4lg==} engines: {node: '>=8.0.0'} + webcrypto-core@1.8.1: + resolution: {integrity: sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -6636,6 +6888,9 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + workerpool@6.5.1: resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} @@ -6651,8 +6906,8 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} wrappy@1.0.2: @@ -6733,13 +6988,8 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@2.7.1: - resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} - engines: {node: '>= 14'} - hasBin: true - - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} hasBin: true @@ -6771,44 +7021,64 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod-to-json-schema@3.24.5: - resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} peerDependencies: zod: ^3.24.1 - zod@3.24.4: - resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} - zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: - '@adraffy/ens-normalize@1.11.0': {} + '@adraffy/ens-normalize@1.11.1': {} + + '@aiquant/lucid-cardano@0.10.11(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@peculiar/webcrypto': 1.5.0 + node-fetch: 3.3.2 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@aiquant/minswap-sdk@0.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@aiquant/lucid-cardano': 0.10.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@blockfrost/blockfrost-js': 5.7.0 + '@minswap/tiny-invariant': 1.2.0 + big.js: 6.2.2 + sha3: 2.1.4 + transitivePeerDependencies: + - bufferutil + - utf-8-validate - '@ampproject/remapping@2.3.0': + '@aiquant/sundaeswap-core@1.2.10(@aiquant/lucid-cardano@0.10.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@sundaeswap/asset@1.0.11)(@sundaeswap/bigint-math@0.6.3)(@sundaeswap/cpp@1.0.13(@sundaeswap/asset@1.0.11)(@sundaeswap/bigint-math@0.6.3)(@sundaeswap/fraction@1.0.8))(@sundaeswap/fraction@1.0.8)': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@aiquant/lucid-cardano': 0.10.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@sundaeswap/asset': 1.0.11 + '@sundaeswap/bigint-math': 0.6.3 + '@sundaeswap/cpp': 1.0.13(@sundaeswap/asset@1.0.11)(@sundaeswap/bigint-math@0.6.3)(@sundaeswap/fraction@1.0.8) + '@sundaeswap/fraction': 1.0.8 '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.893.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.893.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-locate-window': 3.804.0 + '@aws-sdk/types': 3.893.0 + '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -6817,15 +7087,15 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-locate-window': 3.804.0 + '@aws-sdk/types': 3.893.0 + '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.893.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -6834,478 +7104,492 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.806.0': + '@aws-sdk/client-s3@3.893.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.806.0 - '@aws-sdk/credential-provider-node': 3.806.0 - '@aws-sdk/middleware-bucket-endpoint': 3.806.0 - '@aws-sdk/middleware-expect-continue': 3.804.0 - '@aws-sdk/middleware-flexible-checksums': 3.806.0 - '@aws-sdk/middleware-host-header': 3.804.0 - '@aws-sdk/middleware-location-constraint': 3.804.0 - '@aws-sdk/middleware-logger': 3.804.0 - '@aws-sdk/middleware-recursion-detection': 3.804.0 - '@aws-sdk/middleware-sdk-s3': 3.806.0 - '@aws-sdk/middleware-ssec': 3.804.0 - '@aws-sdk/middleware-user-agent': 3.806.0 - '@aws-sdk/region-config-resolver': 3.806.0 - '@aws-sdk/signature-v4-multi-region': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.806.0 - '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.806.0 - '@aws-sdk/xml-builder': 3.804.0 - '@smithy/config-resolver': 4.1.1 - '@smithy/core': 3.3.1 - '@smithy/eventstream-serde-browser': 4.0.2 - '@smithy/eventstream-serde-config-resolver': 4.1.0 - '@smithy/eventstream-serde-node': 4.0.2 - '@smithy/fetch-http-handler': 5.0.2 - '@smithy/hash-blob-browser': 4.0.2 - '@smithy/hash-node': 4.0.2 - '@smithy/hash-stream-node': 4.0.2 - '@smithy/invalid-dependency': 4.0.2 - '@smithy/md5-js': 4.0.2 - '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.3 - '@smithy/middleware-retry': 4.1.4 - '@smithy/middleware-serde': 4.0.3 - '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.1.0 - '@smithy/node-http-handler': 4.0.4 - '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.3 - '@smithy/types': 4.2.0 - '@smithy/url-parser': 4.0.2 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.11 - '@smithy/util-defaults-mode-node': 4.0.11 - '@smithy/util-endpoints': 3.0.3 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-retry': 4.0.3 - '@smithy/util-stream': 4.2.0 - '@smithy/util-utf8': 4.0.0 - '@smithy/util-waiter': 4.0.3 + '@aws-sdk/core': 3.893.0 + '@aws-sdk/credential-provider-node': 3.893.0 + '@aws-sdk/middleware-bucket-endpoint': 3.893.0 + '@aws-sdk/middleware-expect-continue': 3.893.0 + '@aws-sdk/middleware-flexible-checksums': 3.893.0 + '@aws-sdk/middleware-host-header': 3.893.0 + '@aws-sdk/middleware-location-constraint': 3.893.0 + '@aws-sdk/middleware-logger': 3.893.0 + '@aws-sdk/middleware-recursion-detection': 3.893.0 + '@aws-sdk/middleware-sdk-s3': 3.893.0 + '@aws-sdk/middleware-ssec': 3.893.0 + '@aws-sdk/middleware-user-agent': 3.893.0 + '@aws-sdk/region-config-resolver': 3.893.0 + '@aws-sdk/signature-v4-multi-region': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@aws-sdk/util-endpoints': 3.893.0 + '@aws-sdk/util-user-agent-browser': 3.893.0 + '@aws-sdk/util-user-agent-node': 3.893.0 + '@aws-sdk/xml-builder': 3.893.0 + '@smithy/config-resolver': 4.2.2 + '@smithy/core': 3.11.1 + '@smithy/eventstream-serde-browser': 4.1.1 + '@smithy/eventstream-serde-config-resolver': 4.2.1 + '@smithy/eventstream-serde-node': 4.1.1 + '@smithy/fetch-http-handler': 5.2.1 + '@smithy/hash-blob-browser': 4.1.1 + '@smithy/hash-node': 4.1.1 + '@smithy/hash-stream-node': 4.1.1 + '@smithy/invalid-dependency': 4.1.1 + '@smithy/md5-js': 4.1.1 + '@smithy/middleware-content-length': 4.1.1 + '@smithy/middleware-endpoint': 4.2.3 + '@smithy/middleware-retry': 4.2.4 + '@smithy/middleware-serde': 4.1.1 + '@smithy/middleware-stack': 4.1.1 + '@smithy/node-config-provider': 4.2.2 + '@smithy/node-http-handler': 4.2.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/smithy-client': 4.6.3 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 + '@smithy/util-base64': 4.1.0 + '@smithy/util-body-length-browser': 4.1.0 + '@smithy/util-body-length-node': 4.1.0 + '@smithy/util-defaults-mode-browser': 4.1.3 + '@smithy/util-defaults-mode-node': 4.1.3 + '@smithy/util-endpoints': 3.1.2 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-retry': 4.1.2 + '@smithy/util-stream': 4.3.2 + '@smithy/util-utf8': 4.1.0 + '@smithy/util-waiter': 4.1.1 + '@types/uuid': 9.0.8 tslib: 2.8.1 + uuid: 9.0.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.806.0': + '@aws-sdk/client-sso@3.893.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.806.0 - '@aws-sdk/middleware-host-header': 3.804.0 - '@aws-sdk/middleware-logger': 3.804.0 - '@aws-sdk/middleware-recursion-detection': 3.804.0 - '@aws-sdk/middleware-user-agent': 3.806.0 - '@aws-sdk/region-config-resolver': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.806.0 - '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.806.0 - '@smithy/config-resolver': 4.1.1 - '@smithy/core': 3.3.1 - '@smithy/fetch-http-handler': 5.0.2 - '@smithy/hash-node': 4.0.2 - '@smithy/invalid-dependency': 4.0.2 - '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.3 - '@smithy/middleware-retry': 4.1.4 - '@smithy/middleware-serde': 4.0.3 - '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.1.0 - '@smithy/node-http-handler': 4.0.4 - '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.3 - '@smithy/types': 4.2.0 - '@smithy/url-parser': 4.0.2 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.11 - '@smithy/util-defaults-mode-node': 4.0.11 - '@smithy/util-endpoints': 3.0.3 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-retry': 4.0.3 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/core': 3.893.0 + '@aws-sdk/middleware-host-header': 3.893.0 + '@aws-sdk/middleware-logger': 3.893.0 + '@aws-sdk/middleware-recursion-detection': 3.893.0 + '@aws-sdk/middleware-user-agent': 3.893.0 + '@aws-sdk/region-config-resolver': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@aws-sdk/util-endpoints': 3.893.0 + '@aws-sdk/util-user-agent-browser': 3.893.0 + '@aws-sdk/util-user-agent-node': 3.893.0 + '@smithy/config-resolver': 4.2.2 + '@smithy/core': 3.11.1 + '@smithy/fetch-http-handler': 5.2.1 + '@smithy/hash-node': 4.1.1 + '@smithy/invalid-dependency': 4.1.1 + '@smithy/middleware-content-length': 4.1.1 + '@smithy/middleware-endpoint': 4.2.3 + '@smithy/middleware-retry': 4.2.4 + '@smithy/middleware-serde': 4.1.1 + '@smithy/middleware-stack': 4.1.1 + '@smithy/node-config-provider': 4.2.2 + '@smithy/node-http-handler': 4.2.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/smithy-client': 4.6.3 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 + '@smithy/util-base64': 4.1.0 + '@smithy/util-body-length-browser': 4.1.0 + '@smithy/util-body-length-node': 4.1.0 + '@smithy/util-defaults-mode-browser': 4.1.3 + '@smithy/util-defaults-mode-node': 4.1.3 + '@smithy/util-endpoints': 3.1.2 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-retry': 4.1.2 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.806.0': - dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/core': 3.3.1 - '@smithy/node-config-provider': 4.1.0 - '@smithy/property-provider': 4.0.2 - '@smithy/protocol-http': 5.1.0 - '@smithy/signature-v4': 5.1.0 - '@smithy/smithy-client': 4.2.3 - '@smithy/types': 4.2.0 - '@smithy/util-middleware': 4.0.2 - fast-xml-parser: 4.4.1 + '@aws-sdk/core@3.893.0': + dependencies: + '@aws-sdk/types': 3.893.0 + '@aws-sdk/xml-builder': 3.893.0 + '@smithy/core': 3.11.1 + '@smithy/node-config-provider': 4.2.2 + '@smithy/property-provider': 4.1.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/signature-v4': 5.2.1 + '@smithy/smithy-client': 4.6.3 + '@smithy/types': 4.5.0 + '@smithy/util-base64': 4.1.0 + '@smithy/util-body-length-browser': 4.1.0 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-utf8': 4.1.0 + fast-xml-parser: 5.2.5 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.806.0': + '@aws-sdk/credential-provider-env@3.893.0': dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/core': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@smithy/property-provider': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.806.0': - dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/fetch-http-handler': 5.0.2 - '@smithy/node-http-handler': 4.0.4 - '@smithy/property-provider': 4.0.2 - '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.3 - '@smithy/types': 4.2.0 - '@smithy/util-stream': 4.2.0 + '@aws-sdk/credential-provider-http@3.893.0': + dependencies: + '@aws-sdk/core': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@smithy/fetch-http-handler': 5.2.1 + '@smithy/node-http-handler': 4.2.1 + '@smithy/property-provider': 4.1.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/smithy-client': 4.6.3 + '@smithy/types': 4.5.0 + '@smithy/util-stream': 4.3.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.806.0': - dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/credential-provider-env': 3.806.0 - '@aws-sdk/credential-provider-http': 3.806.0 - '@aws-sdk/credential-provider-process': 3.806.0 - '@aws-sdk/credential-provider-sso': 3.806.0 - '@aws-sdk/credential-provider-web-identity': 3.806.0 - '@aws-sdk/nested-clients': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/credential-provider-imds': 4.0.3 - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/credential-provider-ini@3.893.0': + dependencies: + '@aws-sdk/core': 3.893.0 + '@aws-sdk/credential-provider-env': 3.893.0 + '@aws-sdk/credential-provider-http': 3.893.0 + '@aws-sdk/credential-provider-process': 3.893.0 + '@aws-sdk/credential-provider-sso': 3.893.0 + '@aws-sdk/credential-provider-web-identity': 3.893.0 + '@aws-sdk/nested-clients': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@smithy/credential-provider-imds': 4.1.2 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.806.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.806.0 - '@aws-sdk/credential-provider-http': 3.806.0 - '@aws-sdk/credential-provider-ini': 3.806.0 - '@aws-sdk/credential-provider-process': 3.806.0 - '@aws-sdk/credential-provider-sso': 3.806.0 - '@aws-sdk/credential-provider-web-identity': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/credential-provider-imds': 4.0.3 - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/credential-provider-node@3.893.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.893.0 + '@aws-sdk/credential-provider-http': 3.893.0 + '@aws-sdk/credential-provider-ini': 3.893.0 + '@aws-sdk/credential-provider-process': 3.893.0 + '@aws-sdk/credential-provider-sso': 3.893.0 + '@aws-sdk/credential-provider-web-identity': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@smithy/credential-provider-imds': 4.1.2 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.806.0': + '@aws-sdk/credential-provider-process@3.893.0': dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/core': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.806.0': + '@aws-sdk/credential-provider-sso@3.893.0': dependencies: - '@aws-sdk/client-sso': 3.806.0 - '@aws-sdk/core': 3.806.0 - '@aws-sdk/token-providers': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/client-sso': 3.893.0 + '@aws-sdk/core': 3.893.0 + '@aws-sdk/token-providers': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.806.0': + '@aws-sdk/credential-provider-web-identity@3.893.0': dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/nested-clients': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/core': 3.893.0 + '@aws-sdk/nested-clients': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.806.0': + '@aws-sdk/middleware-bucket-endpoint@3.893.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/node-config-provider': 4.1.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 - '@smithy/util-config-provider': 4.0.0 + '@aws-sdk/types': 3.893.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/node-config-provider': 4.2.2 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 + '@smithy/util-config-provider': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.804.0': + '@aws-sdk/middleware-expect-continue@3.893.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.893.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.806.0': + '@aws-sdk/middleware-flexible-checksums@3.893.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/is-array-buffer': 4.0.0 - '@smithy/node-config-provider': 4.1.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-stream': 4.2.0 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/core': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@smithy/is-array-buffer': 4.1.0 + '@smithy/node-config-provider': 4.2.2 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-stream': 4.3.2 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.804.0': + '@aws-sdk/middleware-host-header@3.893.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.893.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.804.0': + '@aws-sdk/middleware-location-constraint@3.893.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.893.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.804.0': + '@aws-sdk/middleware-logger@3.893.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.893.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.804.0': + '@aws-sdk/middleware-recursion-detection@3.893.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.893.0 + '@aws/lambda-invoke-store': 0.0.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.806.0': - dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/core': 3.3.1 - '@smithy/node-config-provider': 4.1.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/signature-v4': 5.1.0 - '@smithy/smithy-client': 4.2.3 - '@smithy/types': 4.2.0 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-stream': 4.2.0 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/middleware-sdk-s3@3.893.0': + dependencies: + '@aws-sdk/core': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/core': 3.11.1 + '@smithy/node-config-provider': 4.2.2 + '@smithy/protocol-http': 5.2.1 + '@smithy/signature-v4': 5.2.1 + '@smithy/smithy-client': 4.6.3 + '@smithy/types': 4.5.0 + '@smithy/util-config-provider': 4.1.0 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-stream': 4.3.2 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.804.0': + '@aws-sdk/middleware-ssec@3.893.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.893.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.806.0': + '@aws-sdk/middleware-user-agent@3.893.0': dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.806.0 - '@smithy/core': 3.3.1 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/core': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@aws-sdk/util-endpoints': 3.893.0 + '@smithy/core': 3.11.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.806.0': + '@aws-sdk/nested-clients@3.893.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.806.0 - '@aws-sdk/middleware-host-header': 3.804.0 - '@aws-sdk/middleware-logger': 3.804.0 - '@aws-sdk/middleware-recursion-detection': 3.804.0 - '@aws-sdk/middleware-user-agent': 3.806.0 - '@aws-sdk/region-config-resolver': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.806.0 - '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.806.0 - '@smithy/config-resolver': 4.1.1 - '@smithy/core': 3.3.1 - '@smithy/fetch-http-handler': 5.0.2 - '@smithy/hash-node': 4.0.2 - '@smithy/invalid-dependency': 4.0.2 - '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.3 - '@smithy/middleware-retry': 4.1.4 - '@smithy/middleware-serde': 4.0.3 - '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.1.0 - '@smithy/node-http-handler': 4.0.4 - '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.3 - '@smithy/types': 4.2.0 - '@smithy/url-parser': 4.0.2 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.11 - '@smithy/util-defaults-mode-node': 4.0.11 - '@smithy/util-endpoints': 3.0.3 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-retry': 4.0.3 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/core': 3.893.0 + '@aws-sdk/middleware-host-header': 3.893.0 + '@aws-sdk/middleware-logger': 3.893.0 + '@aws-sdk/middleware-recursion-detection': 3.893.0 + '@aws-sdk/middleware-user-agent': 3.893.0 + '@aws-sdk/region-config-resolver': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@aws-sdk/util-endpoints': 3.893.0 + '@aws-sdk/util-user-agent-browser': 3.893.0 + '@aws-sdk/util-user-agent-node': 3.893.0 + '@smithy/config-resolver': 4.2.2 + '@smithy/core': 3.11.1 + '@smithy/fetch-http-handler': 5.2.1 + '@smithy/hash-node': 4.1.1 + '@smithy/invalid-dependency': 4.1.1 + '@smithy/middleware-content-length': 4.1.1 + '@smithy/middleware-endpoint': 4.2.3 + '@smithy/middleware-retry': 4.2.4 + '@smithy/middleware-serde': 4.1.1 + '@smithy/middleware-stack': 4.1.1 + '@smithy/node-config-provider': 4.2.2 + '@smithy/node-http-handler': 4.2.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/smithy-client': 4.6.3 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 + '@smithy/util-base64': 4.1.0 + '@smithy/util-body-length-browser': 4.1.0 + '@smithy/util-body-length-node': 4.1.0 + '@smithy/util-defaults-mode-browser': 4.1.3 + '@smithy/util-defaults-mode-node': 4.1.3 + '@smithy/util-endpoints': 3.1.2 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-retry': 4.1.2 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.806.0': + '@aws-sdk/region-config-resolver@3.893.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.1.0 - '@smithy/types': 4.2.0 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.2 + '@aws-sdk/types': 3.893.0 + '@smithy/node-config-provider': 4.2.2 + '@smithy/types': 4.5.0 + '@smithy/util-config-provider': 4.1.0 + '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.806.0': + '@aws-sdk/signature-v4-multi-region@3.893.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/signature-v4': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/middleware-sdk-s3': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/signature-v4': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.806.0': + '@aws-sdk/token-providers@3.893.0': dependencies: - '@aws-sdk/nested-clients': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/core': 3.893.0 + '@aws-sdk/nested-clients': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.804.0': + '@aws-sdk/types@3.893.0': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.804.0': + '@aws-sdk/util-arn-parser@3.893.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.806.0': + '@aws-sdk/util-endpoints@3.893.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 - '@smithy/util-endpoints': 3.0.3 + '@aws-sdk/types': 3.893.0 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 + '@smithy/util-endpoints': 3.1.2 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.804.0': + '@aws-sdk/util-locate-window@3.893.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.804.0': + '@aws-sdk/util-user-agent-browser@3.893.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 - bowser: 2.11.0 + '@aws-sdk/types': 3.893.0 + '@smithy/types': 4.5.0 + bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.806.0': + '@aws-sdk/util-user-agent-node@3.893.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/middleware-user-agent': 3.893.0 + '@aws-sdk/types': 3.893.0 + '@smithy/node-config-provider': 4.2.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.804.0': + '@aws-sdk/xml-builder@3.893.0': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 + '@aws/lambda-invoke-store@0.0.1': {} + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.2': {} + '@babel/compat-data@7.28.4': {} - '@babel/core@7.27.1': + '@babel/core@7.28.4': dependencies: - '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.1 + '@babel/generator': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) - '@babel/helpers': 7.27.1 - '@babel/parser': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.1 - '@babel/types': 7.27.1 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.27.1': + '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.2 + '@babel/compat-data': 7.28.4 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.5 + browserslist: 4.26.2 lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-globals@7.28.0': {} + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.27.1 - '@babel/types': 7.27.1 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.1 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color @@ -7317,149 +7601,167 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.27.1': + '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.1 + '@babel/types': 7.28.4 - '@babel/parser@7.27.2': + '@babel/parser@7.28.4': dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.28.4 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.1)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.1)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.1)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.1)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.1)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.1)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.1)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.1)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.27.1': {} + '@babel/runtime@7.28.4': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 - '@babel/traverse@7.27.1': + '@babel/traverse@7.28.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.1 - '@babel/parser': 7.27.2 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/types': 7.27.1 - debug: 4.4.0 - globals: 11.12.0 + '@babel/types': 7.28.4 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/types@7.27.1': + '@babel/types@7.28.4': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@0.2.3': {} - '@bundlr-network/client@0.7.17(bufferutil@4.0.9)(debug@4.4.0)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@blockfrost/blockfrost-js@5.7.0': + dependencies: + '@blockfrost/openapi': 0.1.70-beta.0 + '@emurgo/cardano-serialization-lib-nodejs': 11.5.0 + '@emurgo/cip14-js': 3.0.1 + bottleneck: 2.19.5 + form-data: 4.0.4 + got: 11.8.6 + json-bigint: 1.0.0 + + '@blockfrost/openapi@0.1.70-beta.0': + dependencies: + ajv: 8.17.1 + cbor: 9.0.2 + rimraf: 6.0.1 + yaml: 2.8.1 + + '@bundlr-network/client@0.7.17(@types/node@15.14.9)(bufferutil@4.0.9)(debug@4.4.3)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@solana/wallet-adapter-base': 0.9.26(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@supercharge/promise-pool': 2.4.0 - algosdk: 1.24.1(encoding@0.1.13) - arbundles: 0.6.23(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(debug@4.4.0)(encoding@0.1.13)(utf-8-validate@5.0.10) + algosdk: 1.24.1 + arbundles: 0.6.23(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(debug@4.4.3)(utf-8-validate@5.0.10) arweave: 1.15.7 async-retry: 1.3.3 - axios: 1.9.0(debug@4.4.0) + axios: 1.12.2(debug@4.4.3) base64url: 3.0.1 - bignumber.js: 9.3.0 + bignumber.js: 9.3.1 bs58: 4.0.1 commander: 8.3.0 - csv: 6.3.11 + csv: 6.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - inquirer: 8.2.6 + inquirer: 8.2.7(@types/node@15.14.9) js-sha256: 0.9.0 mime-types: 2.1.35 - near-api-js: 0.44.2(encoding@0.1.13) + near-api-js: 0.44.2 near-seed-phrase: 0.2.1 transitivePeerDependencies: + - '@types/node' - bufferutil - debug - encoding @@ -7468,16 +7770,16 @@ snapshots: '@colors/colors@1.6.0': {} - '@coral-xyz/anchor@0.28.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@coral-xyz/anchor@0.28.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) base64-js: 1.5.1 bn.js: 5.2.1 bs58: 4.0.1 buffer-layout: 1.2.2 camelcase: 6.3.0 - cross-fetch: 3.2.0(encoding@0.1.13) + cross-fetch: 3.2.0 crypto-hash: 1.3.0 eventemitter3: 4.0.7 js-sha256: 0.9.0 @@ -7491,16 +7793,16 @@ snapshots: - typescript - utf-8-validate - '@coral-xyz/anchor@0.29.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@coral-xyz/anchor@0.29.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@coral-xyz/borsh': 0.29.0(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@coral-xyz/borsh': 0.29.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)) '@noble/hashes': 1.8.0 - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) bn.js: 5.2.1 bs58: 4.0.1 buffer-layout: 1.2.2 camelcase: 6.3.0 - cross-fetch: 3.2.0(encoding@0.1.13) + cross-fetch: 3.2.0 crypto-hash: 1.3.0 eventemitter3: 4.0.7 pako: 2.1.0 @@ -7513,15 +7815,15 @@ snapshots: - typescript - utf-8-validate - '@coral-xyz/borsh@0.28.0(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@coral-xyz/borsh@0.28.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) bn.js: 5.2.1 buffer-layout: 1.2.2 - '@coral-xyz/borsh@0.29.0(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@coral-xyz/borsh@0.29.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) bn.js: 5.2.1 buffer-layout: 1.2.2 @@ -7535,98 +7837,108 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@emnapi/core@1.4.3': + '@emnapi/core@1.5.0': dependencies: - '@emnapi/wasi-threads': 1.0.2 + '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.3': + '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.2': + '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.5': + '@emurgo/cardano-serialization-lib-nodejs@11.5.0': {} + + '@emurgo/cip14-js@3.0.1': + dependencies: + bech32: 2.0.0 + blake2b: 2.1.3 + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.25.10': optional: true - '@esbuild/android-arm64@0.25.5': + '@esbuild/android-arm@0.25.10': optional: true - '@esbuild/android-arm@0.25.5': + '@esbuild/android-x64@0.25.10': optional: true - '@esbuild/android-x64@0.25.5': + '@esbuild/darwin-arm64@0.25.10': optional: true - '@esbuild/darwin-arm64@0.25.5': + '@esbuild/darwin-x64@0.25.10': optional: true - '@esbuild/darwin-x64@0.25.5': + '@esbuild/freebsd-arm64@0.25.10': optional: true - '@esbuild/freebsd-arm64@0.25.5': + '@esbuild/freebsd-x64@0.25.10': optional: true - '@esbuild/freebsd-x64@0.25.5': + '@esbuild/linux-arm64@0.25.10': optional: true - '@esbuild/linux-arm64@0.25.5': + '@esbuild/linux-arm@0.25.10': optional: true - '@esbuild/linux-arm@0.25.5': + '@esbuild/linux-ia32@0.25.10': optional: true - '@esbuild/linux-ia32@0.25.5': + '@esbuild/linux-loong64@0.25.10': optional: true - '@esbuild/linux-loong64@0.25.5': + '@esbuild/linux-mips64el@0.25.10': optional: true - '@esbuild/linux-mips64el@0.25.5': + '@esbuild/linux-ppc64@0.25.10': optional: true - '@esbuild/linux-ppc64@0.25.5': + '@esbuild/linux-riscv64@0.25.10': optional: true - '@esbuild/linux-riscv64@0.25.5': + '@esbuild/linux-s390x@0.25.10': optional: true - '@esbuild/linux-s390x@0.25.5': + '@esbuild/linux-x64@0.25.10': optional: true - '@esbuild/linux-x64@0.25.5': + '@esbuild/netbsd-arm64@0.25.10': optional: true - '@esbuild/netbsd-arm64@0.25.5': + '@esbuild/netbsd-x64@0.25.10': optional: true - '@esbuild/netbsd-x64@0.25.5': + '@esbuild/openbsd-arm64@0.25.10': optional: true - '@esbuild/openbsd-arm64@0.25.5': + '@esbuild/openbsd-x64@0.25.10': optional: true - '@esbuild/openbsd-x64@0.25.5': + '@esbuild/openharmony-arm64@0.25.10': optional: true - '@esbuild/sunos-x64@0.25.5': + '@esbuild/sunos-x64@0.25.10': optional: true - '@esbuild/win32-arm64@0.25.5': + '@esbuild/win32-arm64@0.25.10': optional: true - '@esbuild/win32-ia32@0.25.5': + '@esbuild/win32-ia32@0.25.10': optional: true - '@esbuild/win32-x64@0.25.5': + '@esbuild/win32-x64@0.25.10': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 @@ -7636,7 +7948,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -7681,7 +7993,7 @@ snapshots: - bufferutil - utf-8-validate - '@eth-optimism/core-utils@0.13.2(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)': + '@eth-optimism/core-utils@0.13.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/abstract-provider': 5.7.0 @@ -7696,21 +8008,21 @@ snapshots: '@ethersproject/web': 5.8.0 chai: 4.5.0 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate - '@eth-optimism/sdk@3.3.3(bufferutil@4.0.9)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@eth-optimism/sdk@3.3.3(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@eth-optimism/contracts': 0.6.0(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@eth-optimism/core-utils': 0.13.2(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@eth-optimism/core-utils': 0.13.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 merkletreejs: 0.3.11 rlp: 2.2.7 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - bufferutil - encoding @@ -8118,7 +8430,7 @@ snapshots: fastify-plugin: 4.5.1 openapi-types: 12.1.3 rfdc: 1.4.1 - yaml: 2.7.1 + yaml: 2.8.1 '@fastify/swagger@8.15.0': dependencies: @@ -8126,7 +8438,7 @@ snapshots: json-schema-resolver: 2.0.0 openapi-types: 12.1.3 rfdc: 1.4.1 - yaml: 2.7.1 + yaml: 2.8.1 transitivePeerDependencies: - supports-color @@ -8147,7 +8459,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -8156,11 +8468,24 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@inquirer/external-editor@1.0.2(@types/node@15.14.9)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 15.14.9 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 @@ -8190,7 +8515,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -8204,7 +8529,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -8268,7 +8593,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 '@types/node': 15.14.9 chalk: 4.1.2 collect-v8-coverage: 1.0.2 @@ -8279,7 +8604,7 @@ snapshots: istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 + istanbul-reports: 3.2.0 jest-message-util: 29.7.0 jest-util: 29.7.0 jest-worker: 29.7.0 @@ -8302,7 +8627,7 @@ snapshots: '@jest/source-map@29.6.3': dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -8328,9 +8653,9 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -8361,152 +8686,154 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/set-array@1.2.1': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 - '@ledgerhq/cryptoassets-evm-signatures@13.5.9': + '@ledgerhq/cryptoassets-evm-signatures@13.6.2': dependencies: - '@ledgerhq/live-env': 2.11.0 - axios: 1.9.0 + '@ledgerhq/live-env': 2.16.0 + axios: 1.12.2 transitivePeerDependencies: - debug - '@ledgerhq/devices@8.4.7': + '@ledgerhq/devices@8.5.1': dependencies: - '@ledgerhq/errors': 6.22.0 + '@ledgerhq/errors': 6.25.0 '@ledgerhq/logs': 6.13.0 rxjs: 7.8.2 - semver: 7.7.1 + semver: 7.7.2 - '@ledgerhq/domain-service@1.2.35': + '@ledgerhq/domain-service@1.2.43': dependencies: - '@ledgerhq/errors': 6.22.0 + '@ledgerhq/errors': 6.25.0 '@ledgerhq/logs': 6.13.0 - '@ledgerhq/types-live': 6.76.0 - axios: 1.9.0 + '@ledgerhq/types-live': 6.84.0 + axios: 1.12.2 eip55: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - debug - '@ledgerhq/errors@6.22.0': {} + '@ledgerhq/errors@6.25.0': {} - '@ledgerhq/evm-tools@1.7.0': + '@ledgerhq/evm-tools@1.7.6': dependencies: '@ethersproject/constants': 5.8.0 '@ethersproject/hash': 5.8.0 - '@ledgerhq/cryptoassets-evm-signatures': 13.5.9 - '@ledgerhq/live-env': 2.11.0 - axios: 1.9.0 + '@ledgerhq/cryptoassets-evm-signatures': 13.6.2 + '@ledgerhq/live-env': 2.16.0 + axios: 1.12.2 crypto-js: 4.2.0 transitivePeerDependencies: - debug - '@ledgerhq/hw-app-eth@6.45.10': + '@ledgerhq/hw-app-eth@6.45.18': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/rlp': 5.8.0 '@ethersproject/transactions': 5.8.0 - '@ledgerhq/cryptoassets-evm-signatures': 13.5.9 - '@ledgerhq/domain-service': 1.2.35 - '@ledgerhq/errors': 6.22.0 - '@ledgerhq/evm-tools': 1.7.0 - '@ledgerhq/hw-transport': 6.31.7 - '@ledgerhq/hw-transport-mocker': 6.29.7 + '@ledgerhq/cryptoassets-evm-signatures': 13.6.2 + '@ledgerhq/domain-service': 1.2.43 + '@ledgerhq/errors': 6.25.0 + '@ledgerhq/evm-tools': 1.7.6 + '@ledgerhq/hw-transport': 6.31.10 + '@ledgerhq/hw-transport-mocker': 6.29.10 '@ledgerhq/logs': 6.13.0 - '@ledgerhq/types-live': 6.76.0 - axios: 1.9.0 - bignumber.js: 9.3.0 - semver: 7.7.1 + '@ledgerhq/types-live': 6.84.0 + axios: 1.12.2 + bignumber.js: 9.3.1 + semver: 7.7.2 transitivePeerDependencies: - debug - '@ledgerhq/hw-app-solana@7.5.0': + '@ledgerhq/hw-app-solana@7.5.3': dependencies: - '@ledgerhq/errors': 6.22.0 - '@ledgerhq/hw-transport': 6.31.7 + '@ledgerhq/errors': 6.25.0 + '@ledgerhq/hw-transport': 6.31.10 bip32-path: 0.4.2 - '@ledgerhq/hw-transport-mocker@6.29.7': + '@ledgerhq/hw-transport-mocker@6.29.10': dependencies: - '@ledgerhq/hw-transport': 6.31.7 + '@ledgerhq/hw-transport': 6.31.10 '@ledgerhq/logs': 6.13.0 rxjs: 7.8.2 - '@ledgerhq/hw-transport-node-hid-noevents@6.30.8': + '@ledgerhq/hw-transport-node-hid-noevents@6.30.11': dependencies: - '@ledgerhq/devices': 8.4.7 - '@ledgerhq/errors': 6.22.0 - '@ledgerhq/hw-transport': 6.31.7 + '@ledgerhq/devices': 8.5.1 + '@ledgerhq/errors': 6.25.0 + '@ledgerhq/hw-transport': 6.31.10 '@ledgerhq/logs': 6.13.0 node-hid: 2.1.2 - '@ledgerhq/hw-transport-node-hid-singleton@6.31.8': + '@ledgerhq/hw-transport-node-hid-singleton@6.31.11': dependencies: - '@ledgerhq/devices': 8.4.7 - '@ledgerhq/errors': 6.22.0 - '@ledgerhq/hw-transport': 6.31.7 - '@ledgerhq/hw-transport-node-hid-noevents': 6.30.8 + '@ledgerhq/devices': 8.5.1 + '@ledgerhq/errors': 6.25.0 + '@ledgerhq/hw-transport': 6.31.10 + '@ledgerhq/hw-transport-node-hid-noevents': 6.30.11 '@ledgerhq/logs': 6.13.0 node-hid: 2.1.2 usb: 2.9.0 - '@ledgerhq/hw-transport-node-hid@6.29.8': + '@ledgerhq/hw-transport-node-hid@6.29.11': dependencies: - '@ledgerhq/devices': 8.4.7 - '@ledgerhq/errors': 6.22.0 - '@ledgerhq/hw-transport': 6.31.7 - '@ledgerhq/hw-transport-node-hid-noevents': 6.30.8 + '@ledgerhq/devices': 8.5.1 + '@ledgerhq/errors': 6.25.0 + '@ledgerhq/hw-transport': 6.31.10 + '@ledgerhq/hw-transport-node-hid-noevents': 6.30.11 '@ledgerhq/logs': 6.13.0 lodash: 4.17.21 node-hid: 2.1.2 usb: 2.9.0 - '@ledgerhq/hw-transport@6.31.7': + '@ledgerhq/hw-transport@6.31.10': dependencies: - '@ledgerhq/devices': 8.4.7 - '@ledgerhq/errors': 6.22.0 + '@ledgerhq/devices': 8.5.1 + '@ledgerhq/errors': 6.25.0 '@ledgerhq/logs': 6.13.0 events: 3.3.0 - '@ledgerhq/live-env@2.11.0': + '@ledgerhq/live-env@2.16.0': dependencies: rxjs: 7.8.2 utility-types: 3.11.0 '@ledgerhq/logs@6.13.0': {} - '@ledgerhq/types-live@6.76.0': + '@ledgerhq/types-live@6.84.0': dependencies: - bignumber.js: 9.3.0 + bignumber.js: 9.3.1 rxjs: 7.8.2 '@lukeed/ms@2.0.2': {} - '@metaplex-foundation/beet-solana@0.1.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@metaplex-foundation/beet-solana@0.1.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@metaplex-foundation/beet': 0.2.0 - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding @@ -8514,12 +8841,12 @@ snapshots: - typescript - utf-8-validate - '@metaplex-foundation/beet-solana@0.3.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@metaplex-foundation/beet-solana@0.3.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@metaplex-foundation/beet': 0.6.1 - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@metaplex-foundation/beet': 0.4.0 + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) bs58: 5.0.0 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -8527,12 +8854,12 @@ snapshots: - typescript - utf-8-validate - '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@metaplex-foundation/beet': 0.7.2 - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) bs58: 5.0.0 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -8544,7 +8871,7 @@ snapshots: dependencies: ansicolors: 0.3.2 bn.js: 5.2.1 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8552,7 +8879,7 @@ snapshots: dependencies: ansicolors: 0.3.2 bn.js: 5.2.1 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8560,7 +8887,7 @@ snapshots: dependencies: ansicolors: 0.3.2 bn.js: 5.2.1 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8569,35 +8896,36 @@ snapshots: ansicolors: 0.3.2 assert: 2.1.0 bn.js: 5.2.1 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color '@metaplex-foundation/cusper@0.0.2': {} - '@metaplex-foundation/js@0.11.7(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@metaplex-foundation/js@0.11.7(@types/node@15.14.9)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@aws-sdk/client-s3': 3.806.0 - '@bundlr-network/client': 0.7.17(bufferutil@4.0.9)(debug@4.4.0)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@aws-sdk/client-s3': 3.893.0 + '@bundlr-network/client': 0.7.17(@types/node@15.14.9)(bufferutil@4.0.9)(debug@4.4.3)(typescript@5.9.2)(utf-8-validate@5.0.10) '@metaplex-foundation/beet': 0.2.0 - '@metaplex-foundation/beet-solana': 0.1.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@metaplex-foundation/mpl-auction-house': 2.5.1(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@metaplex-foundation/mpl-candy-machine': 4.7.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@metaplex-foundation/mpl-token-metadata': 2.13.0(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/spl-token': 0.2.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@metaplex-foundation/beet-solana': 0.1.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@metaplex-foundation/mpl-auction-house': 2.5.1(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@metaplex-foundation/mpl-candy-machine': 4.7.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@metaplex-foundation/mpl-token-metadata': 2.13.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.2.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) abort-controller: 3.0.0 - bignumber.js: 9.3.0 + bignumber.js: 9.3.1 bn.js: 5.2.1 bs58: 5.0.0 buffer: 6.0.3 - cross-fetch: 3.2.0(encoding@0.1.13) - debug: 4.4.0 + cross-fetch: 3.2.0 + debug: 4.4.3(supports-color@8.1.1) eventemitter3: 4.0.7 lodash.clonedeep: 4.5.0 mime: 3.0.0 tweetnacl: 1.0.3 transitivePeerDependencies: + - '@types/node' - aws-crt - bufferutil - encoding @@ -8606,13 +8934,13 @@ snapshots: - typescript - utf-8-validate - '@metaplex-foundation/mpl-auction-house@2.5.1(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@metaplex-foundation/mpl-auction-house@2.5.1(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@metaplex-foundation/beet': 0.6.1 - '@metaplex-foundation/beet-solana': 0.3.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@metaplex-foundation/beet-solana': 0.3.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) bn.js: 5.2.1 transitivePeerDependencies: - bufferutil @@ -8622,13 +8950,13 @@ snapshots: - typescript - utf-8-validate - '@metaplex-foundation/mpl-candy-machine@4.7.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@metaplex-foundation/mpl-candy-machine@4.7.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@metaplex-foundation/beet': 0.4.0 - '@metaplex-foundation/beet-solana': 0.3.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@metaplex-foundation/beet-solana': 0.3.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@metaplex-foundation/cusper': 0.0.2 - '@metaplex-foundation/mpl-core': 0.6.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@metaplex-foundation/mpl-core': 0.6.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding @@ -8636,9 +8964,9 @@ snapshots: - typescript - utf-8-validate - '@metaplex-foundation/mpl-core@0.6.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@metaplex-foundation/mpl-core@0.6.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) bs58: 4.0.1 transitivePeerDependencies: - bufferutil @@ -8646,15 +8974,15 @@ snapshots: - typescript - utf-8-validate - '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@metaplex-foundation/beet': 0.7.2 - '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) bn.js: 5.2.1 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -8663,15 +8991,15 @@ snapshots: - typescript - utf-8-validate - '@meteora-ag/dlmm@1.3.12(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@meteora-ag/dlmm@1.3.12(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@coral-xyz/anchor': 0.28.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@coral-xyz/anchor': 0.28.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)) '@solana/buffer-layout': 4.0.1 - '@solana/spl-token': 0.4.8(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.4.8(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) bn.js: 5.2.1 - decimal.js: 10.5.0 + decimal.js: 10.6.0 express: 4.21.2 gaussian: 1.3.0 transitivePeerDependencies: @@ -8682,11 +9010,13 @@ snapshots: - typescript - utf-8-validate - '@napi-rs/wasm-runtime@0.2.11': + '@minswap/tiny-invariant@1.2.0': {} + + '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 - '@tybys/wasm-util': 0.9.0 + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 optional: true '@noble/ciphers@1.3.0': {} @@ -8699,15 +9029,15 @@ snapshots: dependencies: '@noble/hashes': 1.7.2 - '@noble/curves@1.9.0': + '@noble/curves@1.9.1': dependencies: '@noble/hashes': 1.8.0 - '@noble/curves@1.9.1': + '@noble/curves@1.9.2': dependencies: '@noble/hashes': 1.8.0 - '@noble/curves@1.9.2': + '@noble/curves@1.9.7': dependencies: '@noble/hashes': 1.8.0 @@ -8735,29 +9065,29 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nomicfoundation/edr-darwin-arm64@0.11.0': {} + '@nomicfoundation/edr-darwin-arm64@0.11.3': {} - '@nomicfoundation/edr-darwin-x64@0.11.0': {} + '@nomicfoundation/edr-darwin-x64@0.11.3': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.11.3': {} - '@nomicfoundation/edr-linux-arm64-musl@0.11.0': {} + '@nomicfoundation/edr-linux-arm64-musl@0.11.3': {} - '@nomicfoundation/edr-linux-x64-gnu@0.11.0': {} + '@nomicfoundation/edr-linux-x64-gnu@0.11.3': {} - '@nomicfoundation/edr-linux-x64-musl@0.11.0': {} + '@nomicfoundation/edr-linux-x64-musl@0.11.3': {} - '@nomicfoundation/edr-win32-x64-msvc@0.11.0': {} + '@nomicfoundation/edr-win32-x64-msvc@0.11.3': {} - '@nomicfoundation/edr@0.11.0': + '@nomicfoundation/edr@0.11.3': dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.11.0 - '@nomicfoundation/edr-darwin-x64': 0.11.0 - '@nomicfoundation/edr-linux-arm64-gnu': 0.11.0 - '@nomicfoundation/edr-linux-arm64-musl': 0.11.0 - '@nomicfoundation/edr-linux-x64-gnu': 0.11.0 - '@nomicfoundation/edr-linux-x64-musl': 0.11.0 - '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 + '@nomicfoundation/edr-darwin-arm64': 0.11.3 + '@nomicfoundation/edr-darwin-x64': 0.11.3 + '@nomicfoundation/edr-linux-arm64-gnu': 0.11.3 + '@nomicfoundation/edr-linux-arm64-musl': 0.11.3 + '@nomicfoundation/edr-linux-x64-gnu': 0.11.3 + '@nomicfoundation/edr-linux-x64-musl': 0.11.3 + '@nomicfoundation/edr-win32-x64-msvc': 0.11.3 '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': optional: true @@ -8794,43 +9124,26 @@ snapshots: '@openzeppelin/contracts@4.9.6': {} - '@orca-so/common-sdk@0.6.11(@solana/spl-token@0.4.8(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@orca-so/common-sdk@0.6.11(@solana/spl-token@0.4.8(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: - '@solana/spl-token': 0.4.8(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - decimal.js: 10.5.0 + '@solana/spl-token': 0.4.8(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + decimal.js: 10.6.0 tiny-invariant: 1.3.3 '@pancakeswap/chains@0.5.1': {} - '@pancakeswap/chains@0.6.0': {} - - '@pancakeswap/infinity-sdk@1.0.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/permit2-sdk': 1.1.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - '@pancakeswap/swap-sdk-core': 1.5.0 - '@pancakeswap/v3-sdk': 3.9.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - bignumber.js: 9.3.0 - tiny-invariant: 1.3.3 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - zod + '@pancakeswap/chains@0.7.0': {} - '@pancakeswap/infinity-sdk@1.0.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@pancakeswap/infinity-sdk@1.0.6(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/permit2-sdk': 1.1.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/chains': 0.7.0 + '@pancakeswap/permit2-sdk': 1.1.6(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@pancakeswap/swap-sdk-core': 1.5.0 - '@pancakeswap/v3-sdk': 3.9.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - bignumber.js: 9.3.0 + '@pancakeswap/v3-sdk': 3.9.6(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + bignumber.js: 9.3.1 tiny-invariant: 1.3.3 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.31.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -8839,11 +9152,11 @@ snapshots: - utf-8-validate - zod - '@pancakeswap/multicall@3.7.2(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@pancakeswap/multicall@3.7.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/sdk': 5.8.16(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/chains': 0.7.0 + '@pancakeswap/sdk': 5.8.17(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.31.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -8852,12 +9165,12 @@ snapshots: - utf-8-validate - zod - '@pancakeswap/permit2-sdk@1.1.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@pancakeswap/permit2-sdk@1.1.6(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/sdk': 5.8.16(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@pancakeswap/chains': 0.7.0 + '@pancakeswap/sdk': 5.8.17(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) tiny-invariant: 1.3.3 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.31.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -8866,72 +9179,37 @@ snapshots: - utf-8-validate - zod - '@pancakeswap/permit2-sdk@1.1.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/sdk': 5.8.16(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - tiny-invariant: 1.3.3 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - zod - - '@pancakeswap/sdk@5.8.12(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@pancakeswap/sdk@5.8.12(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@pancakeswap/chains': 0.5.1 '@pancakeswap/swap-sdk-core': 1.3.0 - '@pancakeswap/swap-sdk-evm': 1.1.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - '@pancakeswap/v2-sdk': 1.1.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - big.js: 5.2.2 - decimal.js-light: 2.5.1 - tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 - toformat: 2.0.0 - viem: 2.37.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@pancakeswap/sdk@5.8.16(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/swap-sdk-core': 1.5.0 - '@pancakeswap/swap-sdk-evm': 1.1.5(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - '@pancakeswap/swap-sdk-solana': 1.1.4(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@pancakeswap/v2-sdk': 1.1.5(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@pancakeswap/swap-sdk-evm': 1.1.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/v2-sdk': 1.1.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) big.js: 5.2.2 decimal.js-light: 2.5.1 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 toformat: 2.0.0 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.37.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - typescript - utf-8-validate - zod - '@pancakeswap/sdk@5.8.16(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@pancakeswap/sdk@5.8.17(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@pancakeswap/chains': 0.6.0 + '@pancakeswap/chains': 0.7.0 '@pancakeswap/swap-sdk-core': 1.5.0 - '@pancakeswap/swap-sdk-evm': 1.1.5(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@pancakeswap/swap-sdk-solana': 1.1.4(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@pancakeswap/v2-sdk': 1.1.5(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/swap-sdk-evm': 1.1.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/swap-sdk-solana': 1.1.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@pancakeswap/v2-sdk': 1.1.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) big.js: 5.2.2 decimal.js-light: 2.5.1 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 toformat: 2.0.0 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.31.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -8940,26 +9218,26 @@ snapshots: - utf-8-validate - zod - '@pancakeswap/smart-router@7.5.2(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@pancakeswap/smart-router@7.5.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/infinity-sdk': 1.0.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@pancakeswap/multicall': 3.7.2(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@pancakeswap/sdk': 5.8.16(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@pancakeswap/stable-swap-sdk': 2.0.9(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/chains': 0.7.0 + '@pancakeswap/infinity-sdk': 1.0.6(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/multicall': 3.7.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/sdk': 5.8.17(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/stable-swap-sdk': 2.0.10(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@pancakeswap/swap-sdk-core': 1.5.0 '@pancakeswap/token-lists': 0.0.16(react@18.3.1) - '@pancakeswap/tokens': 0.7.8(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@pancakeswap/v3-sdk': 3.9.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/tokens': 0.7.9(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/v3-sdk': 3.9.6(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) async-retry: 1.3.3 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) graphql: 16.11.0 - graphql-request: 5.0.0(encoding@0.1.13)(graphql@16.11.0) + graphql-request: 5.0.0(graphql@16.11.0) lodash: 4.17.21 mnemonist: 0.38.5 stats-lite: 2.2.0 tiny-invariant: 1.3.3 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.31.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - '@reduxjs/toolkit' @@ -8973,11 +9251,11 @@ snapshots: - typescript - utf-8-validate - '@pancakeswap/stable-swap-sdk@2.0.9(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@pancakeswap/stable-swap-sdk@2.0.10(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@pancakeswap/chains': 0.6.0 + '@pancakeswap/chains': 0.7.0 '@pancakeswap/swap-sdk-core': 1.5.0 - '@pancakeswap/tokens': 0.7.8(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/tokens': 0.7.9(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) tiny-invariant: 1.3.3 transitivePeerDependencies: - '@reduxjs/toolkit' @@ -9007,51 +9285,38 @@ snapshots: tiny-warning: 1.0.3 toformat: 2.0.0 - '@pancakeswap/swap-sdk-evm@1.1.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@pancakeswap/swap-sdk-evm@1.1.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@pancakeswap/chains': 0.5.1 '@pancakeswap/swap-sdk-core': 1.3.0 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - viem: 2.37.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@pancakeswap/swap-sdk-evm@1.1.5(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/swap-sdk-core': 1.5.0 - tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.37.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@pancakeswap/swap-sdk-evm@1.1.5(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@pancakeswap/swap-sdk-evm@1.1.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@pancakeswap/chains': 0.6.0 + '@pancakeswap/chains': 0.7.0 '@pancakeswap/swap-sdk-core': 1.5.0 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.31.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@pancakeswap/swap-sdk-solana@1.1.4(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@pancakeswap/swap-sdk-solana@1.1.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@pancakeswap/chains': 0.6.0 + '@pancakeswap/chains': 0.7.0 '@pancakeswap/swap-sdk-core': 1.5.0 - '@solana/spl-token': 0.4.14(@solana/web3.js@1.95.8(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.4.14(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 transitivePeerDependencies: @@ -9069,10 +9334,10 @@ snapshots: optionalDependencies: react: 18.3.1 - '@pancakeswap/tokens@0.7.8(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@pancakeswap/tokens@0.7.9(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/sdk': 5.8.16(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/chains': 0.7.0 + '@pancakeswap/sdk': 5.8.17(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@pancakeswap/token-lists': 0.0.16(react@18.3.1) transitivePeerDependencies: - '@reduxjs/toolkit' @@ -9086,18 +9351,18 @@ snapshots: - utf-8-validate - zod - '@pancakeswap/universal-router-sdk@1.4.14(abitype@1.0.9(typescript@5.8.3)(zod@3.24.4))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(lodash@4.17.21)(react@18.3.1)(tiny-invariant@1.3.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.37.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)': + '@pancakeswap/universal-router-sdk@1.4.15(abitype@1.1.0(typescript@5.9.2)(zod@3.25.76))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(lodash@4.17.21)(react@18.3.1)(tiny-invariant@1.3.3)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)': dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/infinity-sdk': 1.0.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - '@pancakeswap/permit2-sdk': 1.1.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - '@pancakeswap/sdk': 5.8.16(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - '@pancakeswap/smart-router': 7.5.2(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@pancakeswap/v3-sdk': 3.9.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - abitype: 1.0.9(typescript@5.8.3)(zod@3.24.4) + '@pancakeswap/chains': 0.7.0 + '@pancakeswap/infinity-sdk': 1.0.6(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/permit2-sdk': 1.1.6(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/sdk': 5.8.17(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/smart-router': 7.5.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@pancakeswap/v3-sdk': 3.9.6(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) lodash: 4.17.21 tiny-invariant: 1.3.3 - viem: 2.37.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.37.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@reduxjs/toolkit' - bufferutil @@ -9111,39 +9376,26 @@ snapshots: - utf-8-validate - zod - '@pancakeswap/v2-sdk@1.1.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@pancakeswap/v2-sdk@1.1.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@pancakeswap/chains': 0.5.1 '@pancakeswap/swap-sdk-core': 1.3.0 - '@pancakeswap/swap-sdk-evm': 1.1.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - tiny-invariant: 1.3.3 - viem: 2.37.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@pancakeswap/v2-sdk@1.1.5(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/swap-sdk-core': 1.5.0 - '@pancakeswap/swap-sdk-evm': 1.1.5(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@pancakeswap/swap-sdk-evm': 1.1.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) tiny-invariant: 1.3.3 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.37.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@pancakeswap/v2-sdk@1.1.5(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@pancakeswap/v2-sdk@1.1.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@pancakeswap/chains': 0.6.0 + '@pancakeswap/chains': 0.7.0 '@pancakeswap/swap-sdk-core': 1.5.0 - '@pancakeswap/swap-sdk-evm': 1.1.5(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/swap-sdk-evm': 1.1.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) tiny-invariant: 1.3.3 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.31.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -9160,34 +9412,34 @@ snapshots: '@uniswap/v2-core': 1.0.1 base64-sol: 1.0.1 - '@pancakeswap/v3-sdk@3.9.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@pancakeswap/v3-sdk@3.9.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@pancakeswap/chains': 0.5.1 - '@pancakeswap/sdk': 5.8.12(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@pancakeswap/sdk': 5.8.12(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@pancakeswap/swap-sdk-core': 1.3.0 big.js: 5.2.2 decimal.js-light: 2.5.1 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 toformat: 2.0.0 - viem: 2.37.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.37.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@pancakeswap/v3-sdk@3.9.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@pancakeswap/v3-sdk@3.9.6(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/sdk': 5.8.16(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@pancakeswap/chains': 0.7.0 + '@pancakeswap/sdk': 5.8.17(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@pancakeswap/swap-sdk-core': 1.5.0 big.js: 5.2.2 decimal.js-light: 2.5.1 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 toformat: 2.0.0 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.31.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -9196,41 +9448,40 @@ snapshots: - utf-8-validate - zod - '@pancakeswap/v3-sdk@3.9.5(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@pancakeswap/v4-sdk@0.1.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@pancakeswap/chains': 0.6.0 - '@pancakeswap/sdk': 5.8.16(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@pancakeswap/swap-sdk-core': 1.5.0 - big.js: 5.2.2 - decimal.js-light: 2.5.1 + '@pancakeswap/swap-sdk-core': 1.3.0 + '@pancakeswap/v3-sdk': 3.9.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 - toformat: 2.0.0 - viem: 2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.37.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - typescript - utf-8-validate - zod - '@pancakeswap/v4-sdk@0.1.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@peculiar/asn1-schema@2.5.0': dependencies: - '@pancakeswap/swap-sdk-core': 1.3.0 - '@pancakeswap/v3-sdk': 3.9.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - tiny-invariant: 1.3.3 - viem: 2.37.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod + asn1js: 3.0.6 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/json-schema@1.1.12': + dependencies: + tslib: 2.8.1 + + '@peculiar/webcrypto@1.5.0': + dependencies: + '@peculiar/asn1-schema': 2.5.0 + '@peculiar/json-schema': 1.1.12 + pvtsutils: 1.3.6 + tslib: 2.8.1 + webcrypto-core: 1.8.1 '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.4': {} + '@pkgr/core@0.2.9': {} '@randlabs/communication-bridge@1.0.1': {} @@ -9238,17 +9489,17 @@ snapshots: dependencies: '@randlabs/communication-bridge': 1.0.1 - '@raydium-io/raydium-sdk-v2@0.1.141-alpha(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@raydium-io/raydium-sdk-v2@0.1.141-alpha(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 - '@solana/spl-token': 0.4.8(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - axios: 1.9.0 + '@solana/spl-token': 0.4.8(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + axios: 1.12.2 big.js: 6.2.2 bn.js: 5.2.1 - dayjs: 1.11.13 + dayjs: 1.11.18 decimal.js-light: 2.5.1 - jsonfile: 6.1.0 + jsonfile: 6.2.0 lodash: 4.17.21 toformat: 2.0.0 tsconfig-paths: 4.2.0 @@ -9264,7 +9515,7 @@ snapshots: '@scure/base@1.1.9': {} - '@scure/base@1.2.5': {} + '@scure/base@1.2.6': {} '@scure/bip32@1.1.5': dependencies: @@ -9280,9 +9531,9 @@ snapshots: '@scure/bip32@1.7.0': dependencies: - '@noble/curves': 1.9.2 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 - '@scure/base': 1.2.5 + '@scure/base': 1.2.6 '@scure/bip39@1.1.1': dependencies: @@ -9297,7 +9548,7 @@ snapshots: '@scure/bip39@1.6.0': dependencies: '@noble/hashes': 1.8.0 - '@scure/base': 1.2.5 + '@scure/base': 1.2.6 '@sentry/core@5.30.0': dependencies: @@ -9360,6 +9611,8 @@ snapshots: '@sinclair/typebox@0.33.22': {} + '@sindresorhus/is@4.6.0': {} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -9368,250 +9621,255 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@4.0.2': + '@smithy/abort-controller@4.1.1': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader-native@4.0.0': + '@smithy/chunked-blob-reader-native@4.1.0': dependencies: - '@smithy/util-base64': 4.0.0 + '@smithy/util-base64': 4.1.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader@5.0.0': + '@smithy/chunked-blob-reader@5.1.0': dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.1.1': + '@smithy/config-resolver@4.2.2': dependencies: - '@smithy/node-config-provider': 4.1.0 - '@smithy/types': 4.2.0 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.2 + '@smithy/node-config-provider': 4.2.2 + '@smithy/types': 4.5.0 + '@smithy/util-config-provider': 4.1.0 + '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@smithy/core@3.3.1': - dependencies: - '@smithy/middleware-serde': 4.0.3 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-stream': 4.2.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/core@3.11.1': + dependencies: + '@smithy/middleware-serde': 4.1.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 + '@smithy/util-base64': 4.1.0 + '@smithy/util-body-length-browser': 4.1.0 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-stream': 4.3.2 + '@smithy/util-utf8': 4.1.0 + '@types/uuid': 9.0.8 tslib: 2.8.1 + uuid: 9.0.1 - '@smithy/credential-provider-imds@4.0.3': + '@smithy/credential-provider-imds@4.1.2': dependencies: - '@smithy/node-config-provider': 4.1.0 - '@smithy/property-provider': 4.0.2 - '@smithy/types': 4.2.0 - '@smithy/url-parser': 4.0.2 + '@smithy/node-config-provider': 4.2.2 + '@smithy/property-provider': 4.1.1 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 tslib: 2.8.1 - '@smithy/eventstream-codec@4.0.2': + '@smithy/eventstream-codec@4.1.1': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.2.0 - '@smithy/util-hex-encoding': 4.0.0 + '@smithy/types': 4.5.0 + '@smithy/util-hex-encoding': 4.1.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.0.2': + '@smithy/eventstream-serde-browser@4.1.1': dependencies: - '@smithy/eventstream-serde-universal': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/eventstream-serde-universal': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.1.0': + '@smithy/eventstream-serde-config-resolver@4.2.1': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.0.2': + '@smithy/eventstream-serde-node@4.1.1': dependencies: - '@smithy/eventstream-serde-universal': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/eventstream-serde-universal': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.0.2': + '@smithy/eventstream-serde-universal@4.1.1': dependencies: - '@smithy/eventstream-codec': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/eventstream-codec': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.0.2': + '@smithy/fetch-http-handler@5.2.1': dependencies: - '@smithy/protocol-http': 5.1.0 - '@smithy/querystring-builder': 4.0.2 - '@smithy/types': 4.2.0 - '@smithy/util-base64': 4.0.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/querystring-builder': 4.1.1 + '@smithy/types': 4.5.0 + '@smithy/util-base64': 4.1.0 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.0.2': + '@smithy/hash-blob-browser@4.1.1': dependencies: - '@smithy/chunked-blob-reader': 5.0.0 - '@smithy/chunked-blob-reader-native': 4.0.0 - '@smithy/types': 4.2.0 + '@smithy/chunked-blob-reader': 5.1.0 + '@smithy/chunked-blob-reader-native': 4.1.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/hash-node@4.0.2': + '@smithy/hash-node@4.1.1': dependencies: - '@smithy/types': 4.2.0 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/types': 4.5.0 + '@smithy/util-buffer-from': 4.1.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/hash-stream-node@4.0.2': + '@smithy/hash-stream-node@4.1.1': dependencies: - '@smithy/types': 4.2.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/types': 4.5.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/invalid-dependency@4.0.2': + '@smithy/invalid-dependency@4.1.1': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.0.0': + '@smithy/is-array-buffer@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.0.2': + '@smithy/md5-js@4.1.1': dependencies: - '@smithy/types': 4.2.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/types': 4.5.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/middleware-content-length@4.0.2': + '@smithy/middleware-content-length@4.1.1': dependencies: - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.1.3': + '@smithy/middleware-endpoint@4.2.3': dependencies: - '@smithy/core': 3.3.1 - '@smithy/middleware-serde': 4.0.3 - '@smithy/node-config-provider': 4.1.0 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 - '@smithy/url-parser': 4.0.2 - '@smithy/util-middleware': 4.0.2 + '@smithy/core': 3.11.1 + '@smithy/middleware-serde': 4.1.1 + '@smithy/node-config-provider': 4.2.2 + '@smithy/shared-ini-file-loader': 4.2.0 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 + '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@smithy/middleware-retry@4.1.4': + '@smithy/middleware-retry@4.2.4': dependencies: - '@smithy/node-config-provider': 4.1.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/service-error-classification': 4.0.3 - '@smithy/smithy-client': 4.2.3 - '@smithy/types': 4.2.0 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-retry': 4.0.3 + '@smithy/node-config-provider': 4.2.2 + '@smithy/protocol-http': 5.2.1 + '@smithy/service-error-classification': 4.1.2 + '@smithy/smithy-client': 4.6.3 + '@smithy/types': 4.5.0 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-retry': 4.1.2 + '@types/uuid': 9.0.8 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@4.0.3': + '@smithy/middleware-serde@4.1.1': dependencies: - '@smithy/types': 4.2.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/middleware-stack@4.0.2': + '@smithy/middleware-stack@4.1.1': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.1.0': + '@smithy/node-config-provider@4.2.2': dependencies: - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.0.4': + '@smithy/node-http-handler@4.2.1': dependencies: - '@smithy/abort-controller': 4.0.2 - '@smithy/protocol-http': 5.1.0 - '@smithy/querystring-builder': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/abort-controller': 4.1.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/querystring-builder': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/property-provider@4.0.2': + '@smithy/property-provider@4.1.1': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/protocol-http@5.1.0': + '@smithy/protocol-http@5.2.1': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/querystring-builder@4.0.2': + '@smithy/querystring-builder@4.1.1': dependencies: - '@smithy/types': 4.2.0 - '@smithy/util-uri-escape': 4.0.0 + '@smithy/types': 4.5.0 + '@smithy/util-uri-escape': 4.1.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.0.2': + '@smithy/querystring-parser@4.1.1': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/service-error-classification@4.0.3': + '@smithy/service-error-classification@4.1.2': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.5.0 - '@smithy/shared-ini-file-loader@4.0.2': + '@smithy/shared-ini-file-loader@4.2.0': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/signature-v4@5.1.0': + '@smithy/signature-v4@5.2.1': dependencies: - '@smithy/is-array-buffer': 4.0.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-uri-escape': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/is-array-buffer': 4.1.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 + '@smithy/util-hex-encoding': 4.1.0 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-uri-escape': 4.1.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/smithy-client@4.2.3': + '@smithy/smithy-client@4.6.3': dependencies: - '@smithy/core': 3.3.1 - '@smithy/middleware-endpoint': 4.1.3 - '@smithy/middleware-stack': 4.0.2 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 - '@smithy/util-stream': 4.2.0 + '@smithy/core': 3.11.1 + '@smithy/middleware-endpoint': 4.2.3 + '@smithy/middleware-stack': 4.1.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 + '@smithy/util-stream': 4.3.2 tslib: 2.8.1 - '@smithy/types@4.2.0': + '@smithy/types@4.5.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.0.2': + '@smithy/url-parser@4.1.1': dependencies: - '@smithy/querystring-parser': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/querystring-parser': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-base64@4.0.0': + '@smithy/util-base64@4.1.0': dependencies: - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/util-buffer-from': 4.1.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/util-body-length-browser@4.0.0': + '@smithy/util-body-length-browser@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@4.0.0': + '@smithy/util-body-length-node@4.1.0': dependencies: tslib: 2.8.1 @@ -9620,66 +9878,66 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.0.0': + '@smithy/util-buffer-from@4.1.0': dependencies: - '@smithy/is-array-buffer': 4.0.0 + '@smithy/is-array-buffer': 4.1.0 tslib: 2.8.1 - '@smithy/util-config-provider@4.0.0': + '@smithy/util-config-provider@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.11': + '@smithy/util-defaults-mode-browser@4.1.3': dependencies: - '@smithy/property-provider': 4.0.2 - '@smithy/smithy-client': 4.2.3 - '@smithy/types': 4.2.0 - bowser: 2.11.0 + '@smithy/property-provider': 4.1.1 + '@smithy/smithy-client': 4.6.3 + '@smithy/types': 4.5.0 + bowser: 2.12.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.11': + '@smithy/util-defaults-mode-node@4.1.3': dependencies: - '@smithy/config-resolver': 4.1.1 - '@smithy/credential-provider-imds': 4.0.3 - '@smithy/node-config-provider': 4.1.0 - '@smithy/property-provider': 4.0.2 - '@smithy/smithy-client': 4.2.3 - '@smithy/types': 4.2.0 + '@smithy/config-resolver': 4.2.2 + '@smithy/credential-provider-imds': 4.1.2 + '@smithy/node-config-provider': 4.2.2 + '@smithy/property-provider': 4.1.1 + '@smithy/smithy-client': 4.6.3 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-endpoints@3.0.3': + '@smithy/util-endpoints@3.1.2': dependencies: - '@smithy/node-config-provider': 4.1.0 - '@smithy/types': 4.2.0 + '@smithy/node-config-provider': 4.2.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-hex-encoding@4.0.0': + '@smithy/util-hex-encoding@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.0.2': + '@smithy/util-middleware@4.1.1': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-retry@4.0.3': + '@smithy/util-retry@4.1.2': dependencies: - '@smithy/service-error-classification': 4.0.3 - '@smithy/types': 4.2.0 + '@smithy/service-error-classification': 4.1.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-stream@4.2.0': + '@smithy/util-stream@4.3.2': dependencies: - '@smithy/fetch-http-handler': 5.0.2 - '@smithy/node-http-handler': 4.0.4 - '@smithy/types': 4.2.0 - '@smithy/util-base64': 4.0.0 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/fetch-http-handler': 5.2.1 + '@smithy/node-http-handler': 4.2.1 + '@smithy/types': 4.5.0 + '@smithy/util-base64': 4.1.0 + '@smithy/util-buffer-from': 4.1.0 + '@smithy/util-hex-encoding': 4.1.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/util-uri-escape@4.0.0': + '@smithy/util-uri-escape@4.1.0': dependencies: tslib: 2.8.1 @@ -9688,23 +9946,23 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.0.0': + '@smithy/util-utf8@4.1.0': dependencies: - '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-buffer-from': 4.1.0 tslib: 2.8.1 - '@smithy/util-waiter@4.0.3': + '@smithy/util-waiter@4.1.1': dependencies: - '@smithy/abort-controller': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/abort-controller': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) bigint-buffer: 1.1.5 - bignumber.js: 9.3.0 + bignumber.js: 9.3.1 transitivePeerDependencies: - bufferutil - encoding @@ -9715,160 +9973,152 @@ snapshots: dependencies: buffer: 6.0.3 - '@solana/codecs-core@2.0.0-preview.4(typescript@5.8.3)': + '@solana/codecs-core@2.0.0-preview.4(typescript@5.9.2)': dependencies: - '@solana/errors': 2.0.0-preview.4(typescript@5.8.3) - typescript: 5.8.3 + '@solana/errors': 2.0.0-preview.4(typescript@5.9.2) + typescript: 5.9.2 - '@solana/codecs-core@2.0.0-rc.1(typescript@5.8.3)': + '@solana/codecs-core@2.0.0-rc.1(typescript@5.9.2)': dependencies: - '@solana/errors': 2.0.0-rc.1(typescript@5.8.3) - typescript: 5.8.3 + '@solana/errors': 2.0.0-rc.1(typescript@5.9.2) + typescript: 5.9.2 - '@solana/codecs-core@2.1.0(typescript@5.8.3)': + '@solana/codecs-core@2.3.0(typescript@5.9.2)': dependencies: - '@solana/errors': 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + '@solana/errors': 2.3.0(typescript@5.9.2) + typescript: 5.9.2 - '@solana/codecs-data-structures@2.0.0-preview.4(typescript@5.8.3)': + '@solana/codecs-data-structures@2.0.0-preview.4(typescript@5.9.2)': dependencies: - '@solana/codecs-core': 2.0.0-preview.4(typescript@5.8.3) - '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.8.3) - '@solana/errors': 2.0.0-preview.4(typescript@5.8.3) - typescript: 5.8.3 + '@solana/codecs-core': 2.0.0-preview.4(typescript@5.9.2) + '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.9.2) + '@solana/errors': 2.0.0-preview.4(typescript@5.9.2) + typescript: 5.9.2 - '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.8.3)': + '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.9.2)': dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.8.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.8.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.8.3) - typescript: 5.8.3 + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.2) + '@solana/errors': 2.0.0-rc.1(typescript@5.9.2) + typescript: 5.9.2 - '@solana/codecs-numbers@2.0.0-preview.4(typescript@5.8.3)': + '@solana/codecs-numbers@2.0.0-preview.4(typescript@5.9.2)': dependencies: - '@solana/codecs-core': 2.0.0-preview.4(typescript@5.8.3) - '@solana/errors': 2.0.0-preview.4(typescript@5.8.3) - typescript: 5.8.3 + '@solana/codecs-core': 2.0.0-preview.4(typescript@5.9.2) + '@solana/errors': 2.0.0-preview.4(typescript@5.9.2) + typescript: 5.9.2 - '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.8.3)': + '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.9.2)': dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.8.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.8.3) - typescript: 5.8.3 + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.2) + '@solana/errors': 2.0.0-rc.1(typescript@5.9.2) + typescript: 5.9.2 - '@solana/codecs-numbers@2.1.0(typescript@5.8.3)': + '@solana/codecs-numbers@2.3.0(typescript@5.9.2)': dependencies: - '@solana/codecs-core': 2.1.0(typescript@5.8.3) - '@solana/errors': 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + '@solana/codecs-core': 2.3.0(typescript@5.9.2) + '@solana/errors': 2.3.0(typescript@5.9.2) + typescript: 5.9.2 - '@solana/codecs-strings@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + '@solana/codecs-strings@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': dependencies: - '@solana/codecs-core': 2.0.0-preview.4(typescript@5.8.3) - '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.8.3) - '@solana/errors': 2.0.0-preview.4(typescript@5.8.3) + '@solana/codecs-core': 2.0.0-preview.4(typescript@5.9.2) + '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.9.2) + '@solana/errors': 2.0.0-preview.4(typescript@5.9.2) fastestsmallesttextencoderdecoder: 1.0.22 - typescript: 5.8.3 + typescript: 5.9.2 - '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.8.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.8.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.8.3) + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.2) + '@solana/errors': 2.0.0-rc.1(typescript@5.9.2) fastestsmallesttextencoderdecoder: 1.0.22 - typescript: 5.8.3 + typescript: 5.9.2 - '@solana/codecs@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + '@solana/codecs@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': dependencies: - '@solana/codecs-core': 2.0.0-preview.4(typescript@5.8.3) - '@solana/codecs-data-structures': 2.0.0-preview.4(typescript@5.8.3) - '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.8.3) - '@solana/codecs-strings': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/options': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - typescript: 5.8.3 + '@solana/codecs-core': 2.0.0-preview.4(typescript@5.9.2) + '@solana/codecs-data-structures': 2.0.0-preview.4(typescript@5.9.2) + '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.9.2) + '@solana/codecs-strings': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/options': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.8.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.8.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.8.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - typescript: 5.8.3 + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.2) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.2) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/errors@2.0.0-preview.4(typescript@5.8.3)': + '@solana/errors@2.0.0-preview.4(typescript@5.9.2)': dependencies: - chalk: 5.6.0 + chalk: 5.6.2 commander: 12.1.0 - typescript: 5.8.3 + typescript: 5.9.2 - '@solana/errors@2.0.0-rc.1(typescript@5.8.3)': + '@solana/errors@2.0.0-rc.1(typescript@5.9.2)': dependencies: - chalk: 5.6.0 + chalk: 5.6.2 commander: 12.1.0 - typescript: 5.8.3 + typescript: 5.9.2 - '@solana/errors@2.1.0(typescript@5.8.3)': + '@solana/errors@2.3.0(typescript@5.9.2)': dependencies: - chalk: 5.6.0 - commander: 13.1.0 - typescript: 5.8.3 + chalk: 5.6.2 + commander: 14.0.1 + typescript: 5.9.2 - '@solana/options@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + '@solana/options@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': dependencies: - '@solana/codecs-core': 2.0.0-preview.4(typescript@5.8.3) - '@solana/codecs-data-structures': 2.0.0-preview.4(typescript@5.8.3) - '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.8.3) - '@solana/codecs-strings': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/errors': 2.0.0-preview.4(typescript@5.8.3) - typescript: 5.8.3 + '@solana/codecs-core': 2.0.0-preview.4(typescript@5.9.2) + '@solana/codecs-data-structures': 2.0.0-preview.4(typescript@5.9.2) + '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.9.2) + '@solana/codecs-strings': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 2.0.0-preview.4(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.8.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.8.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.8.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.8.3) - typescript: 5.8.3 + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.2) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.2) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 2.0.0-rc.1(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/spl-token-group@0.0.5(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + '@solana/spl-token-group@0.0.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': dependencies: - '@solana/codecs': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) '@solana/spl-type-length-value': 0.1.0 - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - - '@solana/spl-token-group@0.0.7(@solana/web3.js@1.95.8(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.95.8(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + '@solana/spl-token-group@0.0.7(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript @@ -9877,11 +10127,11 @@ snapshots: dependencies: cross-fetch: 3.0.6 - '@solana/spl-token@0.2.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@solana/spl-token@0.2.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) start-server-and-test: 1.15.4 transitivePeerDependencies: - bufferutil @@ -9890,12 +10140,12 @@ snapshots: - typescript - utf-8-validate - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) buffer: 6.0.3 transitivePeerDependencies: - bufferutil @@ -9904,13 +10154,13 @@ snapshots: - typescript - utf-8-validate - '@solana/spl-token@0.4.14(@solana/web3.js@1.95.8(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@solana/spl-token@0.4.14(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.95.8(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.8(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) buffer: 6.0.3 transitivePeerDependencies: - bufferutil @@ -9919,13 +10169,13 @@ snapshots: - typescript - utf-8-validate - '@solana/spl-token@0.4.8(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@solana/spl-token@0.4.8(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/spl-token-group': 0.0.5(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/spl-token-group': 0.0.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) buffer: 6.0.3 transitivePeerDependencies: - bufferutil @@ -9938,10 +10188,10 @@ snapshots: dependencies: buffer: 6.0.3 - '@solana/wallet-adapter-base@0.9.26(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: '@solana/wallet-standard-features': 1.3.0 - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@wallet-standard/base': 1.1.0 '@wallet-standard/features': 1.1.0 eventemitter3: 5.0.1 @@ -9951,35 +10201,13 @@ snapshots: '@wallet-standard/base': 1.1.0 '@wallet-standard/features': 1.1.0 - '@solana/web3.js@1.95.8(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.2 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - agentkeepalive: 4.6.0 - bigint-buffer: 1.1.5 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0(encoding@0.1.13) - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - - '@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.0 + '@babel/runtime': 7.28.4 + '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.0(typescript@5.8.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.2) agentkeepalive: 4.6.0 bn.js: 5.2.1 borsh: 0.7.0 @@ -9987,8 +10215,8 @@ snapshots: buffer: 6.0.3 fast-stable-stringify: 1.0.0 jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0(encoding@0.1.13) - rpc-websockets: 9.1.1 + node-fetch: 2.7.0 + rpc-websockets: 9.1.3 superstruct: 2.0.2 transitivePeerDependencies: - bufferutil @@ -9996,14 +10224,15 @@ snapshots: - typescript - utf-8-validate - '@solflare-wallet/utl-sdk@1.4.0(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@solflare-wallet/utl-sdk@1.4.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/node@15.14.9)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@metaplex-foundation/js': 0.11.7(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) - axios: 1.9.0 + '@metaplex-foundation/js': 0.11.7(@types/node@15.14.9)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + axios: 1.12.2 eventemitter3: 5.0.1 lodash: 4.17.21 transitivePeerDependencies: + - '@types/node' - aws-crt - bufferutil - debug @@ -10013,12 +10242,30 @@ snapshots: - typescript - utf-8-validate + '@sundaeswap/asset@1.0.11': + dependencies: + '@sundaeswap/fraction': 1.0.8 + + '@sundaeswap/bigint-math@0.6.3': {} + + '@sundaeswap/cpp@1.0.13(@sundaeswap/asset@1.0.11)(@sundaeswap/bigint-math@0.6.3)(@sundaeswap/fraction@1.0.8)': + dependencies: + '@sundaeswap/asset': 1.0.11 + '@sundaeswap/bigint-math': 0.6.3 + '@sundaeswap/fraction': 1.0.8 + + '@sundaeswap/fraction@1.0.8': {} + '@supercharge/promise-pool@2.4.0': {} '@swc/helpers@0.5.17': dependencies: tslib: 2.8.1 + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -10027,7 +10274,7 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@tybys/wasm-util@0.9.0': + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true @@ -10038,30 +10285,30 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.28.4 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 - '@types/babel__traverse@7.20.7': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.28.4 '@types/bn.js@5.1.6': dependencies: '@types/node': 15.14.9 - '@types/body-parser@1.19.5': + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 '@types/node': 15.14.9 @@ -10075,6 +10322,13 @@ snapshots: '@types/node': 15.14.9 base-x: 3.0.11 + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 15.14.9 + '@types/responselike': 1.0.3 + '@types/connect@3.4.38': dependencies: '@types/node': 15.14.9 @@ -10087,16 +10341,16 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: '@types/node': 15.14.9 - '@types/qs': 6.9.18 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 0.17.5 - '@types/express@4.17.21': + '@types/express@4.17.23': dependencies: - '@types/body-parser': 1.19.5 + '@types/body-parser': 1.19.6 '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.9.18 - '@types/serve-static': 1.15.7 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.8 '@types/fs-extra@9.0.13': dependencies: @@ -10106,7 +10360,9 @@ snapshots: dependencies: '@types/node': 15.14.9 - '@types/http-errors@2.0.4': {} + '@types/http-cache-semantics@4.0.4': {} + + '@types/http-errors@2.0.5': {} '@types/istanbul-lib-coverage@2.0.6': {} @@ -10132,6 +10388,10 @@ snapshots: '@types/json5@0.0.29': {} + '@types/keyv@3.1.4': + dependencies: + '@types/node': 15.14.9 + '@types/level-codec@9.0.4': {} '@types/level-errors@3.0.2': {} @@ -10148,8 +10408,6 @@ snapshots: '@types/level-errors': 3.0.2 '@types/node': 15.14.9 - '@types/lru-cache@5.1.1': {} - '@types/mathjs@9.4.2': dependencies: mathjs: 10.6.4 @@ -10158,10 +10416,10 @@ snapshots: '@types/minimist@1.2.5': {} - '@types/node-fetch@2.6.12': + '@types/node-fetch@2.6.13': dependencies: '@types/node': 15.14.9 - form-data: 4.0.2 + form-data: 4.0.4 '@types/node@11.11.6': {} @@ -10173,24 +10431,28 @@ snapshots: dependencies: '@types/node': 15.14.9 - '@types/qs@6.9.18': {} + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} + '@types/responselike@1.0.3': + dependencies: + '@types/node': 15.14.9 + '@types/secp256k1@4.0.6': dependencies: '@types/node': 15.14.9 - '@types/send@0.17.4': + '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 '@types/node': 15.14.9 - '@types/serve-static@1.15.7': + '@types/serve-static@1.15.8': dependencies: - '@types/http-errors': 2.0.4 + '@types/http-errors': 2.0.5 '@types/node': 15.14.9 - '@types/send': 0.17.4 + '@types/send': 0.17.5 '@types/stack-utils@1.0.1': {} @@ -10200,7 +10462,9 @@ snapshots: '@types/uuid@8.3.4': {} - '@types/w3c-web-usb@1.0.10': {} + '@types/uuid@9.0.8': {} + + '@types/w3c-web-usb@1.0.12': {} '@types/ws@7.4.7': dependencies: @@ -10220,34 +10484,34 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.2) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.2) '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.8.3) + ts-api-utils: 1.4.3(typescript@5.9.2) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -10256,41 +10520,41 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.9.2)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.2) + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.8.3) + ts-api-utils: 1.4.3(typescript@5.9.2) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.8.3) + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.2) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) eslint: 8.57.1 transitivePeerDependencies: - supports-color @@ -10307,7 +10571,7 @@ snapshots: '@uniswap/lib@4.0.1-alpha': {} - '@uniswap/permit2-sdk@1.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@uniswap/permit2-sdk@1.4.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) tiny-invariant: 1.3.3 @@ -10315,25 +10579,25 @@ snapshots: - bufferutil - utf-8-validate - '@uniswap/router-sdk@1.23.0(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@uniswap/router-sdk@1.23.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@uniswap/sdk-core': 7.7.2 - '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@uniswap/v2-sdk': 4.15.2 - '@uniswap/v3-sdk': 3.25.2(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@uniswap/v4-sdk': 1.21.4(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@uniswap/v3-sdk': 3.25.2(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@uniswap/v4-sdk': 1.21.4(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) transitivePeerDependencies: - hardhat - '@uniswap/router-sdk@2.0.4(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@uniswap/router-sdk@2.0.4(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@uniswap/sdk-core': 7.7.2 - '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@uniswap/v2-sdk': 4.15.2 - '@uniswap/v3-sdk': 3.25.2(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@uniswap/v4-sdk': 1.21.4(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@uniswap/v3-sdk': 3.25.2(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@uniswap/v4-sdk': 1.21.4(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) transitivePeerDependencies: - hardhat @@ -10376,30 +10640,30 @@ snapshots: tiny-warning: 1.0.3 toformat: 2.0.0 - '@uniswap/smart-order-router@3.59.0(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(jsbi@3.2.5)(utf-8-validate@5.0.10)': + '@uniswap/smart-order-router@3.59.0(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(jsbi@3.2.5)(utf-8-validate@5.0.10)': dependencies: - '@eth-optimism/sdk': 3.3.3(bufferutil@4.0.9)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@eth-optimism/sdk': 3.3.3(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@types/brotli': 1.3.4 '@uniswap/default-token-list': 11.19.0 - '@uniswap/permit2-sdk': 1.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@uniswap/router-sdk': 1.23.0(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@uniswap/permit2-sdk': 1.4.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@uniswap/router-sdk': 1.23.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@uniswap/sdk-core': 5.9.0 - '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@uniswap/token-lists': 1.0.0-beta.34 '@uniswap/universal-router': 1.6.0 - '@uniswap/universal-router-sdk': 3.4.0(bufferutil@4.0.9)(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@uniswap/universal-router-sdk': 3.4.0(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@uniswap/v2-sdk': 4.15.2 - '@uniswap/v3-sdk': 3.25.2(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@uniswap/v4-sdk': 1.21.4(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@uniswap/v3-sdk': 3.25.2(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@uniswap/v4-sdk': 1.21.4(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) async-retry: 1.3.3 await-timeout: 1.1.1 - axios: 1.9.0 + axios: 1.12.2 brotli: 1.3.2 bunyan: 1.8.15 bunyan-blackhole: 1.1.1(bunyan@1.8.15) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) graphql: 15.10.1 - graphql-request: 3.7.0(encoding@0.1.13)(graphql@15.10.1) + graphql-request: 3.7.0(graphql@15.10.1) jsbi: 3.2.5 lodash: 4.17.21 mnemonist: 0.38.5 @@ -10412,51 +10676,51 @@ snapshots: - hardhat - utf-8-validate - '@uniswap/swap-router-contracts@1.3.1(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@uniswap/swap-router-contracts@1.3.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: '@openzeppelin/contracts': 4.9.6 '@uniswap/v2-core': 1.0.1 '@uniswap/v3-core': 1.0.1 '@uniswap/v3-periphery': 1.4.4 dotenv: 14.3.2 - hardhat-watcher: 2.5.0(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + hardhat-watcher: 2.5.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) transitivePeerDependencies: - hardhat '@uniswap/token-lists@1.0.0-beta.34': {} - '@uniswap/universal-router-sdk@3.4.0(bufferutil@4.0.9)(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@uniswap/universal-router-sdk@3.4.0(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@openzeppelin/contracts': 4.9.6 - '@uniswap/permit2-sdk': 1.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@uniswap/router-sdk': 1.23.0(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@uniswap/permit2-sdk': 1.4.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@uniswap/router-sdk': 1.23.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@uniswap/sdk-core': 5.9.0 '@uniswap/universal-router': 2.0.0-beta.1 '@uniswap/v2-core': 1.0.1 '@uniswap/v2-sdk': 4.15.2 '@uniswap/v3-core': 1.0.0 - '@uniswap/v3-sdk': 3.25.2(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@uniswap/v4-sdk': 1.21.4(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - bignumber.js: 9.3.0 + '@uniswap/v3-sdk': 3.25.2(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@uniswap/v4-sdk': 1.21.4(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + bignumber.js: 9.3.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - hardhat - utf-8-validate - '@uniswap/universal-router-sdk@4.19.6(bufferutil@4.0.9)(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@uniswap/universal-router-sdk@4.19.7(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@openzeppelin/contracts': 4.9.6 - '@uniswap/permit2-sdk': 1.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@uniswap/router-sdk': 2.0.4(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@uniswap/permit2-sdk': 1.4.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@uniswap/router-sdk': 2.0.4(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@uniswap/sdk-core': 7.7.2 '@uniswap/universal-router': 2.0.0-beta.2 '@uniswap/v2-core': 1.0.1 '@uniswap/v2-sdk': 4.15.2 '@uniswap/v3-core': 1.0.0 - '@uniswap/v3-sdk': 3.25.2(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@uniswap/v4-sdk': 1.21.4(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - bignumber.js: 9.3.0 + '@uniswap/v3-sdk': 3.25.2(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@uniswap/v4-sdk': 1.21.4(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + bignumber.js: 9.3.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -10503,12 +10767,12 @@ snapshots: '@uniswap/v3-core': 1.0.1 base64-sol: 1.0.1 - '@uniswap/v3-sdk@3.25.2(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@uniswap/v3-sdk@3.25.2(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/solidity': 5.7.0 '@uniswap/sdk-core': 7.7.2 - '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@uniswap/v3-periphery': 1.4.4 '@uniswap/v3-staker': 1.0.0 tiny-invariant: 1.3.3 @@ -10522,73 +10786,73 @@ snapshots: '@uniswap/v3-core': 1.0.0 '@uniswap/v3-periphery': 1.4.4 - '@uniswap/v4-sdk@1.21.4(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@uniswap/v4-sdk@1.21.4(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/solidity': 5.7.0 '@uniswap/sdk-core': 7.7.2 - '@uniswap/v3-sdk': 3.25.2(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@uniswap/v3-sdk': 3.25.2(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 transitivePeerDependencies: - hardhat - '@unrs/resolver-binding-android-arm-eabi@1.9.2': + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true - '@unrs/resolver-binding-android-arm64@1.9.2': + '@unrs/resolver-binding-android-arm64@1.11.1': optional: true - '@unrs/resolver-binding-darwin-arm64@1.9.2': + '@unrs/resolver-binding-darwin-arm64@1.11.1': optional: true - '@unrs/resolver-binding-darwin-x64@1.9.2': + '@unrs/resolver-binding-darwin-x64@1.11.1': optional: true - '@unrs/resolver-binding-freebsd-x64@1.9.2': + '@unrs/resolver-binding-freebsd-x64@1.11.1': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.2': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.9.2': + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.9.2': + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.9.2': + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.9.2': + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.9.2': + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.9.2': + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.9.2': + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.9.2': + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.9.2': + '@unrs/resolver-binding-linux-x64-musl@1.11.1': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.9.2': + '@unrs/resolver-binding-wasm32-wasi@1.11.1': dependencies: - '@napi-rs/wasm-runtime': 0.2.11 + '@napi-rs/wasm-runtime': 0.2.12 optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.9.2': + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.9.2': + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.9.2': + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true '@wallet-standard/base@1.1.0': {} @@ -10597,20 +10861,15 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 - abitype@1.0.8(typescript@5.8.3)(zod@3.24.4): - optionalDependencies: - typescript: 5.8.3 - zod: 3.24.4 - - abitype@1.0.8(typescript@5.8.3)(zod@3.25.76): + abitype@1.0.8(typescript@5.9.2)(zod@3.25.76): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 zod: 3.25.76 - abitype@1.0.9(typescript@5.8.3)(zod@3.24.4): + abitype@1.1.0(typescript@5.9.2)(zod@3.25.76): optionalDependencies: - typescript: 5.8.3 - zod: 3.24.4 + typescript: 5.9.2 + zod: 3.25.76 abort-controller@3.0.0: dependencies: @@ -10633,15 +10892,15 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 acorn-walk@8.3.4: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 - acorn@8.14.1: {} + acorn@8.15.0: {} adm-zip@0.4.16: {} @@ -10649,7 +10908,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -10680,17 +10939,17 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 algo-msgpack-with-bigint@2.1.1: {} - algosdk@1.24.1(encoding@0.1.13): + algosdk@1.24.1: dependencies: algo-msgpack-with-bigint: 2.1.1 buffer: 6.0.3 - cross-fetch: 3.2.0(encoding@0.1.13) + cross-fetch: 3.2.0 hi-base32: 0.5.1 js-sha256: 0.9.0 js-sha3: 0.8.0 @@ -10711,7 +10970,7 @@ snapshots: dependencies: type-fest: 0.21.3 - ansi-escapes@7.0.0: + ansi-escapes@7.1.0: dependencies: environment: 1.1.0 @@ -10721,7 +10980,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} ansi-styles@3.2.1: dependencies: @@ -10733,7 +10992,7 @@ snapshots: ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} ansicolors@0.3.2: {} @@ -10744,16 +11003,16 @@ snapshots: app-root-path@3.1.0: {} - arbundles@0.6.23(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(debug@4.4.0)(encoding@0.1.13)(utf-8-validate@5.0.10): + arbundles@0.6.23(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(debug@4.4.3)(utf-8-validate@5.0.10): dependencies: '@noble/ed25519': 1.7.5 '@randlabs/myalgo-connect': 1.4.2 - '@solana/wallet-adapter-base': 0.9.26(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)) - algosdk: 1.24.1(encoding@0.1.13) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)) + algosdk: 1.24.1 arweave: 1.15.7 arweave-stream-tx: 1.2.2(arweave@1.15.7) avsc: https://codeload.github.com/Irys-xyz/avsc/tar.gz/a730cc8018b79e114b6a3381bbb57760a24c6cef - axios: 1.9.0(debug@4.4.0) + axios: 1.12.2(debug@4.4.3) base64url: 3.0.1 bs58: 4.0.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -10796,14 +11055,16 @@ snapshots: array-flatten@1.1.1: {} - array-includes@3.1.8: + array-includes@3.1.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 + math-intrinsics: 1.1.0 array-union@2.1.0: {} @@ -10814,7 +11075,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -10823,14 +11084,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: @@ -10838,7 +11099,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -10853,7 +11114,7 @@ snapshots: arconnect: 0.4.2 asn1.js: 5.4.1 base64-js: 1.5.1 - bignumber.js: 9.3.0 + bignumber.js: 9.3.1 asn1.js@5.4.1: dependencies: @@ -10862,6 +11123,12 @@ snapshots: minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 + asn1js@3.0.6: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.3 + tslib: 2.8.1 + assert@2.1.0: dependencies: call-bind: 1.0.8 @@ -10903,37 +11170,37 @@ snapshots: await-timeout@1.1.1: {} - axios@1.9.0: + axios@1.12.2: dependencies: - follow-redirects: 1.15.9(debug@4.4.0) - form-data: 4.0.2 + follow-redirects: 1.15.11(debug@4.3.4) + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.9.0(debug@4.3.4): + axios@1.12.2(debug@4.3.4): dependencies: - follow-redirects: 1.15.9(debug@4.3.4) - form-data: 4.0.2 + follow-redirects: 1.15.11(debug@4.3.4) + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.9.0(debug@4.4.0): + axios@1.12.2(debug@4.4.3): dependencies: - follow-redirects: 1.15.9(debug@4.4.0) - form-data: 4.0.2 + follow-redirects: 1.15.11(debug@4.4.3) + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - babel-jest@29.7.0(@babel/core@7.27.1): + babel-jest@29.7.0(@babel/core@7.28.4): dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.27.1) + babel-preset-jest: 29.6.3(@babel/core@7.28.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -10953,34 +11220,34 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.1 + '@babel/types': 7.28.4 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.7 - - babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.1): - dependencies: - '@babel/core': 7.27.1 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.1) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.1) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.1) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.1) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.1) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.1) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.1) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.1) - - babel-preset-jest@29.6.3(@babel/core@7.27.1): - dependencies: - '@babel/core': 7.27.1 + '@types/babel__traverse': 7.28.0 + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4) + + babel-preset-jest@29.6.3(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.1) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) balanced-match@1.0.2: {} @@ -11006,8 +11273,12 @@ snapshots: mixin-deep: 1.3.2 pascalcase: 0.1.1 + baseline-browser-mapping@2.8.6: {} + bech32@1.1.4: {} + bech32@2.0.0: {} + big.js@5.2.2: {} big.js@6.2.2: {} @@ -11016,7 +11287,7 @@ snapshots: dependencies: bindings: 1.5.0 - bignumber.js@9.3.0: {} + bignumber.js@9.3.1: {} binary-extensions@2.3.0: {} @@ -11044,6 +11315,15 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + blake2b-wasm@1.1.7: + dependencies: + nanoassert: 1.1.0 + + blake2b@2.1.3: + dependencies: + blake2b-wasm: 1.1.7 + nanoassert: 1.1.0 + blakejs@1.2.1: {} bluebird@3.7.2: {} @@ -11079,7 +11359,9 @@ snapshots: bs58: 4.0.1 text-encoding-utf-8: 1.0.2 - bowser@2.11.0: {} + bottleneck@2.19.5: {} + + bowser@2.12.1: {} boxen@5.1.2: dependencies: @@ -11092,12 +11374,12 @@ snapshots: widest-line: 3.1.0 wrap-ansi: 7.0.0 - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -11144,12 +11426,13 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - browserslist@4.24.5: + browserslist@4.26.2: dependencies: - caniuse-lite: 1.0.30001717 - electron-to-chromium: 1.5.151 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.5) + baseline-browser-mapping: 2.8.6 + caniuse-lite: 1.0.30001743 + electron-to-chromium: 1.5.222 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.2) bs-logger@0.2.6: dependencies: @@ -11202,7 +11485,7 @@ snapshots: builtins@5.1.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 bunyan-blackhole@1.1.1(bunyan@1.8.15): dependencies: @@ -11230,6 +11513,18 @@ snapshots: union-value: 1.0.1 unset-value: 1.0.0 + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -11253,12 +11548,16 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001717: {} + caniuse-lite@1.0.30001743: {} capability@0.2.5: {} catering@2.1.1: {} + cbor@9.0.2: + dependencies: + nofilter: 3.1.0 + chai@4.5.0: dependencies: assertion-error: 1.1.0 @@ -11280,11 +11579,11 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.6.0: {} + chalk@5.6.2: {} char-regex@1.0.2: {} - chardet@0.7.0: {} + chardet@2.1.0: {} check-error@1.0.3: dependencies: @@ -11350,10 +11649,10 @@ snapshots: cli-spinners@2.9.2: {} - cli-truncate@4.0.0: + cli-truncate@5.1.0: dependencies: - slice-ansi: 5.0.0 - string-width: 7.2.0 + slice-ansi: 7.1.2 + string-width: 8.1.0 cli-width@3.0.0: {} @@ -11369,6 +11668,10 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + clone@1.0.4: {} clone@2.1.2: {} @@ -11397,7 +11700,7 @@ snapshots: color-string@1.9.1: dependencies: color-name: 1.1.4 - simple-swizzle: 0.2.2 + simple-swizzle: 0.2.4 color@3.2.1: dependencies: @@ -11419,9 +11722,7 @@ snapshots: commander@12.1.0: {} - commander@13.1.0: {} - - commander@14.0.0: {} + commander@14.0.1: {} commander@2.20.3: {} @@ -11463,14 +11764,16 @@ snapshots: untildify: 4.0.0 yargs: 16.2.0 + core-js@3.45.1: {} + core-util-is@1.0.3: {} create-hash@1.1.3: dependencies: cipher-base: 1.0.6 inherits: 2.0.4 - ripemd160: 2.0.2 - sha.js: 2.4.11 + ripemd160: 2.0.1 + sha.js: 2.4.12 create-hash@1.2.0: dependencies: @@ -11478,7 +11781,7 @@ snapshots: inherits: 2.0.4 md5.js: 1.3.5 ripemd160: 2.0.2 - sha.js: 2.4.11 + sha.js: 2.4.12 create-hmac@1.1.7: dependencies: @@ -11487,15 +11790,15 @@ snapshots: inherits: 2.0.4 ripemd160: 2.0.2 safe-buffer: 5.2.1 - sha.js: 2.4.11 + sha.js: 2.4.12 - create-jest@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)): + create-jest@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -11510,9 +11813,9 @@ snapshots: dependencies: node-fetch: 2.6.1 - cross-fetch@3.2.0(encoding@0.1.13): + cross-fetch@3.2.0: dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 transitivePeerDependencies: - encoding @@ -11526,18 +11829,20 @@ snapshots: crypto-js@4.2.0: {} - csv-generate@4.4.2: {} + csv-generate@4.5.0: {} - csv-parse@5.6.0: {} + csv-parse@6.1.0: {} - csv-stringify@6.5.2: {} + csv-stringify@6.6.0: {} - csv@6.3.11: + csv@6.4.1: dependencies: - csv-generate: 4.4.2 - csv-parse: 5.6.0 - csv-stringify: 6.5.2 - stream-transform: 3.3.3 + csv-generate: 4.5.0 + csv-parse: 6.1.0 + csv-stringify: 6.6.0 + stream-transform: 3.4.0 + + data-uri-to-buffer@4.0.1: {} data-view-buffer@1.0.2: dependencies: @@ -11559,7 +11864,7 @@ snapshots: dateformat@4.6.3: {} - dayjs@1.11.13: {} + dayjs@1.11.18: {} debug@2.6.9: dependencies: @@ -11573,11 +11878,7 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.4.0: - dependencies: - ms: 2.1.3 - - debug@4.4.1(supports-color@8.1.1): + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 optionalDependencies: @@ -11587,7 +11888,7 @@ snapshots: decimal.js-light@2.5.1: {} - decimal.js@10.5.0: {} + decimal.js@10.6.0: {} decode-uri-component@0.2.2: {} @@ -11595,7 +11896,7 @@ snapshots: dependencies: mimic-response: 3.1.0 - dedent@1.6.0: {} + dedent@1.7.0: {} deep-eql@4.1.4: dependencies: @@ -11611,6 +11912,8 @@ snapshots: dependencies: clone: 1.0.4 + defer-to-connect@2.0.1: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -11646,7 +11949,7 @@ snapshots: destroy@1.2.0: {} - detect-libc@2.0.4: {} + detect-libc@2.1.0: {} detect-newline@3.1.0: {} @@ -11677,11 +11980,11 @@ snapshots: dotenv@14.3.2: {} - dotenv@16.5.0: {} + dotenv@16.6.1: {} dtrace-provider@0.8.8: dependencies: - nan: 2.22.2 + nan: 2.23.0 optional: true dunder-proto@1.0.1: @@ -11700,11 +12003,7 @@ snapshots: dependencies: keccak: 3.0.4 - ejs@3.1.10: - dependencies: - jake: 10.9.2 - - electron-to-chromium@1.5.151: {} + electron-to-chromium@1.5.222: {} elliptic@6.6.1: dependencies: @@ -11718,7 +12017,7 @@ snapshots: emittery@0.13.1: {} - emoji-regex@10.4.0: {} + emoji-regex@10.5.0: {} emoji-regex@8.0.0: {} @@ -11730,12 +12029,7 @@ snapshots: encodeurl@2.0.0: {} - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -11748,7 +12042,7 @@ snapshots: environment@1.1.0: {} - error-ex@1.3.2: + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -11758,7 +12052,7 @@ snapshots: o3: 1.0.3 u3: 0.1.1 - es-abstract@1.23.9: + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -11787,7 +12081,9 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 + is-set: 2.0.3 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 @@ -11802,6 +12098,7 @@ snapshots: safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -11843,33 +12140,34 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild@0.25.5: + esbuild@0.25.10: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.5 - '@esbuild/android-arm': 0.25.5 - '@esbuild/android-arm64': 0.25.5 - '@esbuild/android-x64': 0.25.5 - '@esbuild/darwin-arm64': 0.25.5 - '@esbuild/darwin-x64': 0.25.5 - '@esbuild/freebsd-arm64': 0.25.5 - '@esbuild/freebsd-x64': 0.25.5 - '@esbuild/linux-arm': 0.25.5 - '@esbuild/linux-arm64': 0.25.5 - '@esbuild/linux-ia32': 0.25.5 - '@esbuild/linux-loong64': 0.25.5 - '@esbuild/linux-mips64el': 0.25.5 - '@esbuild/linux-ppc64': 0.25.5 - '@esbuild/linux-riscv64': 0.25.5 - '@esbuild/linux-s390x': 0.25.5 - '@esbuild/linux-x64': 0.25.5 - '@esbuild/netbsd-arm64': 0.25.5 - '@esbuild/netbsd-x64': 0.25.5 - '@esbuild/openbsd-arm64': 0.25.5 - '@esbuild/openbsd-x64': 0.25.5 - '@esbuild/sunos-x64': 0.25.5 - '@esbuild/win32-arm64': 0.25.5 - '@esbuild/win32-ia32': 0.25.5 - '@esbuild/win32-x64': 0.25.5 + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 escalade@3.2.0: {} @@ -11886,16 +12184,16 @@ snapshots: eslint-compat-utils@0.5.1(eslint@8.57.1): dependencies: eslint: 8.57.1 - semver: 7.7.1 + semver: 7.7.2 - eslint-config-prettier@9.1.0(eslint@8.57.1): + eslint-config-prettier@9.1.2(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-config-standard@17.1.0(eslint-plugin-import@2.31.0)(eslint-plugin-n@16.6.2(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1): + eslint-config-standard@17.1.0(eslint-plugin-import@2.32.0)(eslint-plugin-n@16.6.2(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1) eslint-plugin-n: 16.6.2(eslint@8.57.1) eslint-plugin-promise: 6.6.0(eslint@8.57.1) @@ -11904,12 +12202,12 @@ snapshots: chalk: 4.1.2 table: 6.9.0 - eslint-import-context@0.1.9(unrs-resolver@1.9.2): + eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: get-tsconfig: 4.10.1 stable-hash-x: 0.2.0 optionalDependencies: - unrs-resolver: 1.9.2 + unrs-resolver: 1.11.1 eslint-import-resolver-node@0.3.9: dependencies: @@ -11919,43 +12217,43 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@4.4.3(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@4.4.3(eslint-plugin-import@2.32.0)(eslint@8.57.1): dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 - eslint-import-context: 0.1.9(unrs-resolver@1.9.2) + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash-x: 0.1.1 - tinyglobby: 0.2.14 - unrs-resolver: 1.9.2 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 4.4.3(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 4.4.3(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color eslint-plugin-es-x@7.8.0(eslint@8.57.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) '@eslint-community/regexpp': 4.12.1 eslint: 8.57.1 eslint-compat-utils: 0.5.1(eslint@8.57.1) - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 @@ -11963,7 +12261,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -11975,7 +12273,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -11983,27 +12281,27 @@ snapshots: eslint-plugin-n@16.6.2(eslint@8.57.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) builtins: 5.1.0 eslint: 8.57.1 eslint-plugin-es-x: 7.8.0(eslint@8.57.1) - get-tsconfig: 4.10.0 + get-tsconfig: 4.10.1 globals: 13.24.0 ignore: 5.3.2 is-builtin-module: 3.2.1 is-core-module: 2.16.1 minimatch: 3.1.2 resolve: 1.22.10 - semver: 7.7.1 + semver: 7.7.2 - eslint-plugin-prettier@5.4.0(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.3): + eslint-plugin-prettier@5.5.4(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2): dependencies: eslint: 8.57.1 - prettier: 3.5.3 + prettier: 3.6.2 prettier-linter-helpers: 1.0.0 - synckit: 0.11.4 + synckit: 0.11.11 optionalDependencies: - eslint-config-prettier: 9.1.0(eslint@8.57.1) + eslint-config-prettier: 9.1.2(eslint@8.57.1) eslint-plugin-promise@6.6.0(eslint@8.57.1): dependencies: @@ -12022,7 +12320,7 @@ snapshots: eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 @@ -12033,7 +12331,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -12065,8 +12363,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -12287,12 +12585,6 @@ snapshots: assign-symbols: 1.0.0 is-extendable: 1.0.1 - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - extglob@2.0.4: dependencies: array-unique: 0.3.2 @@ -12354,11 +12646,11 @@ snapshots: fast-uri@2.4.0: {} - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} - fast-xml-parser@4.4.1: + fast-xml-parser@5.2.5: dependencies: - strnum: 1.1.2 + strnum: 2.1.1 fastestsmallesttextencoderdecoder@1.0.22: {} @@ -12366,11 +12658,11 @@ snapshots: fastify-plugin@4.5.1: {} - fastify-type-provider-zod@2.1.0(fastify@4.29.1)(zod@3.24.4): + fastify-type-provider-zod@2.1.0(fastify@4.29.1)(zod@3.25.76): dependencies: fastify: 4.29.1 - zod: 3.24.4 - zod-to-json-schema: 3.24.5(zod@3.24.4) + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) fastify@4.29.1: dependencies: @@ -12383,12 +12675,12 @@ snapshots: fast-json-stringify: 5.16.1 find-my-way: 8.2.2 light-my-request: 5.14.0 - pino: 9.6.0 + pino: 9.11.0 process-warning: 3.0.0 proxy-addr: 2.0.7 rfdc: 1.4.1 secure-json-parse: 2.7.0 - semver: 7.7.1 + semver: 7.7.2 toad-cache: 3.7.0 fastq@1.19.1: @@ -12399,12 +12691,17 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.4.4(picomatch@4.0.2): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 fecha@4.2.3: {} + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -12419,10 +12716,6 @@ snapshots: file-uri-to-path@1.0.0: {} - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - fill-range@4.0.0: dependencies: extend-shallow: 2.0.1 @@ -12474,17 +12767,13 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.9(debug@4.3.4): + follow-redirects@1.15.11(debug@4.3.4): optionalDependencies: debug: 4.3.4 - follow-redirects@1.15.9(debug@4.4.0): - optionalDependencies: - debug: 4.4.0 - - follow-redirects@1.15.9(debug@4.4.1): + follow-redirects@1.15.11(debug@4.4.3): optionalDependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) for-each@0.3.5: dependencies: @@ -12497,20 +12786,26 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@3.0.3: + form-data@3.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 - form-data@4.0.2: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + forwarded@0.2.0: {} fp-ts@1.19.3: {} @@ -12530,7 +12825,7 @@ snapshots: fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-extra@7.0.1: @@ -12563,7 +12858,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.3.0: {} + get-east-asian-width@1.4.0: {} get-func-name@2.0.2: {} @@ -12587,6 +12882,10 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + get-stream@6.0.1: {} get-symbol-description@1.1.0: @@ -12595,10 +12894,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.0: - dependencies: - resolve-pkg-maps: 1.0.0 - get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -12624,6 +12919,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@6.0.4: dependencies: inflight: 1.0.6 @@ -12650,8 +12954,6 @@ snapshots: minimatch: 5.1.6 once: 1.4.0 - globals@11.12.0: {} - globals@13.24.0: dependencies: type-fest: 0.20.2 @@ -12672,25 +12974,39 @@ snapshots: gopd@1.2.0: {} + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + graceful-fs@4.2.11: {} graphemer@1.4.0: {} - graphql-request@3.7.0(encoding@0.1.13)(graphql@15.10.1): + graphql-request@3.7.0(graphql@15.10.1): dependencies: - cross-fetch: 3.2.0(encoding@0.1.13) + cross-fetch: 3.2.0 extract-files: 9.0.0 - form-data: 3.0.3 + form-data: 3.0.4 graphql: 15.10.1 transitivePeerDependencies: - encoding - graphql-request@5.0.0(encoding@0.1.13)(graphql@16.11.0): + graphql-request@5.0.0(graphql@16.11.0): dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) - cross-fetch: 3.2.0(encoding@0.1.13) + cross-fetch: 3.2.0 extract-files: 9.0.0 - form-data: 3.0.3 + form-data: 3.0.4 graphql: 16.11.0 transitivePeerDependencies: - encoding @@ -12699,27 +13015,34 @@ snapshots: graphql@16.11.0: {} - hardhat-watcher@2.5.0(hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + handlebars@4.7.8: + dependencies: + minimist: 0.2.4 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + hardhat-watcher@2.5.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)): dependencies: chokidar: 3.6.0 - hardhat: 2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) - hardhat@2.24.0(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.0 + '@nomicfoundation/edr': 0.11.3 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.6 - '@types/lru-cache': 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -12739,17 +13062,17 @@ snapshots: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.4.1) + solc: 0.8.26(debug@4.4.3) source-map-support: 0.5.21 stacktrace-parser: 0.1.11 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 tsort: 0.0.1 undici: 5.29.0 uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@types/node@15.14.9)(typescript@5.8.3) - typescript: 5.8.3 + ts-node: 10.9.2(@types/node@15.14.9)(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - bufferutil - supports-color @@ -12827,6 +13150,8 @@ snapshots: html-escaper@2.0.2: {} + http-cache-semantics@4.2.0: {} + http-errors@1.8.1: dependencies: depd: 1.1.2 @@ -12843,10 +13168,15 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -12862,10 +13192,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: + iconv-lite@0.7.0: dependencies: safer-buffer: 2.1.2 - optional: true ieee754@1.2.1: {} @@ -12896,13 +13225,13 @@ snapshots: ini@1.3.8: {} - inquirer@8.2.6: + inquirer@8.2.7(@types/node@15.14.9): dependencies: + '@inquirer/external-editor': 1.0.2(@types/node@15.14.9) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-width: 3.0.0 - external-editor: 3.1.0 figures: 3.2.0 lodash: 4.17.21 mute-stream: 0.0.8 @@ -12913,6 +13242,8 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0 + transitivePeerDependencies: + - '@types/node' internal-slot@1.1.0: dependencies: @@ -12943,7 +13274,7 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: {} + is-arrayish@0.3.4: {} is-async-function@2.1.1: dependencies: @@ -12976,7 +13307,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 is-callable@1.2.7: {} @@ -13023,11 +13354,9 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-fullwidth-code-point@4.0.0: {} - - is-fullwidth-code-point@5.0.0: + is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.3.0 + get-east-asian-width: 1.4.0 is-generator-fn@2.1.0: {} @@ -13053,6 +13382,8 @@ snapshots: call-bind: 1.0.8 define-properties: 1.2.1 + is-negative-zero@2.0.3: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -13149,8 +13480,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.27.1 - '@babel/parser': 7.27.2 + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -13159,11 +13490,11 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.27.1 - '@babel/parser': 7.27.2 + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -13175,13 +13506,13 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -13192,12 +13523,9 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.2: + jackspeak@4.1.1: dependencies: - async: 3.2.6 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 + '@isaacs/cliui': 8.0.2 javascript-natural-sort@0.7.1: {} @@ -13234,7 +13562,7 @@ snapshots: '@types/node': 15.14.9 chalk: 4.1.2 co: 4.6.0 - dedent: 1.6.0 + dedent: 1.7.0 is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -13251,16 +13579,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)): + jest-cli@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)) + create-jest: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -13270,12 +13598,12 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)): + jest-config@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)): dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.27.1) + babel-jest: 29.7.0(@babel/core@7.28.4) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -13296,7 +13624,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 15.14.9 - ts-node: 10.9.2(@types/node@15.14.9)(typescript@5.8.3) + ts-node: 10.9.2(@types/node@15.14.9)(typescript@5.9.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -13504,15 +13832,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.27.1 - '@babel/generator': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.1) - '@babel/types': 7.27.1 + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/types': 7.28.4 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.1) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -13523,7 +13851,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -13563,12 +13891,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)): + jest@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)) + jest-cli: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13608,7 +13936,7 @@ snapshots: json-bigint@1.0.0: dependencies: - bignumber.js: 9.3.0 + bignumber.js: 9.3.1 json-buffer@3.0.1: {} @@ -13620,7 +13948,7 @@ snapshots: json-schema-resolver@2.0.0: dependencies: - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) rfdc: 1.4.1 uri-js: 4.4.1 transitivePeerDependencies: @@ -13646,7 +13974,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -13704,33 +14032,26 @@ snapshots: process-warning: 3.0.0 set-cookie-parser: 2.7.1 - lilconfig@3.1.3: {} - lines-and-columns@1.2.4: {} - lint-staged@16.1.2: + lint-staged@16.2.0: dependencies: - chalk: 5.6.0 - commander: 14.0.0 - debug: 4.4.1(supports-color@8.1.1) - lilconfig: 3.1.3 - listr2: 8.3.3 + commander: 14.0.1 + listr2: 9.0.4 micromatch: 4.0.8 - nano-spawn: 1.0.2 + nano-spawn: 1.0.3 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.8.0 - transitivePeerDependencies: - - supports-color + yaml: 2.8.1 - listr2@8.3.3: + listr2@9.0.4: dependencies: - cli-truncate: 4.0.0 + cli-truncate: 5.1.0 colorette: 2.0.20 eventemitter3: 5.0.1 log-update: 6.1.0 rfdc: 1.4.1 - wrap-ansi: 9.0.0 + wrap-ansi: 9.0.2 locate-path@5.0.0: dependencies: @@ -13757,11 +14078,11 @@ snapshots: log-update@6.1.0: dependencies: - ansi-escapes: 7.0.0 + ansi-escapes: 7.1.0 cli-cursor: 5.0.0 - slice-ansi: 7.1.0 - strip-ansi: 7.1.0 - wrap-ansi: 9.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 logform@2.7.0: dependencies: @@ -13784,8 +14105,12 @@ snapshots: dependencies: tslib: 2.8.1 + lowercase-keys@2.0.0: {} + lru-cache@10.4.3: {} + lru-cache@11.2.1: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -13794,7 +14119,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 make-error@1.3.6: {} @@ -13814,9 +14139,9 @@ snapshots: mathjs@10.6.4: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.28.4 complex.js: 2.4.2 - decimal.js: 10.5.0 + decimal.js: 10.6.0 escape-latex: 1.2.0 fraction.js: 4.3.7 javascript-natural-sort: 0.7.1 @@ -13842,7 +14167,7 @@ snapshots: merkletreejs@0.3.11: dependencies: - bignumber.js: 9.3.0 + bignumber.js: 9.3.1 buffer-reverse: 1.0.1 crypto-js: 4.2.0 treeify: 1.1.0 @@ -13858,7 +14183,7 @@ snapshots: micro-packed@0.7.3: dependencies: - '@scure/base': 1.2.5 + '@scure/base': 1.2.6 micromatch@3.1.10: dependencies: @@ -13897,23 +14222,29 @@ snapshots: mimic-function@5.0.1: {} + mimic-response@1.0.1: {} + mimic-response@3.1.0: {} minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@5.1.6: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@0.2.4: {} @@ -13937,7 +14268,7 @@ snapshots: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -13983,10 +14314,12 @@ snapshots: mylas@2.1.13: {} - nan@2.22.2: + nan@2.23.0: optional: true - nano-spawn@1.0.2: {} + nano-spawn@1.0.3: {} + + nanoassert@1.1.0: {} nanomatch@1.2.13: dependencies: @@ -14008,14 +14341,14 @@ snapshots: napi-macros@2.2.2: {} - napi-postinstall@0.2.5: {} + napi-postinstall@0.3.3: {} natural-compare@1.4.0: {} ncp@2.0.0: optional: true - near-api-js@0.44.2(encoding@0.1.13): + near-api-js@0.44.2: dependencies: bn.js: 5.2.1 borsh: 0.6.0 @@ -14025,7 +14358,7 @@ snapshots: http-errors: 1.8.1 js-sha256: 0.9.0 mustache: 4.2.0 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 text-encoding-utf-8: 1.0.2 tweetnacl: 1.0.3 transitivePeerDependencies: @@ -14046,6 +14379,8 @@ snapshots: negotiator@0.6.3: {} + neo-async@2.6.2: {} + no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -14053,9 +14388,9 @@ snapshots: no-case@4.0.0: {} - node-abi@3.75.0: + node-abi@3.77.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 node-addon-api@2.0.2: {} @@ -14069,13 +14404,19 @@ snapshots: dependencies: clone: 2.1.2 + node-domexception@1.0.0: {} + node-fetch@2.6.1: {} - node-fetch@2.7.0(encoding@0.1.13): + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 node-gyp-build@4.8.4: {} @@ -14087,7 +14428,9 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.19: {} + node-releases@2.0.21: {} + + nofilter@3.1.0: {} noms@0.0.0: dependencies: @@ -14096,6 +14439,8 @@ snapshots: normalize-path@3.0.0: {} + normalize-url@6.1.0: {} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -14143,14 +14488,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 object.pick@1.3.0: dependencies: @@ -14218,51 +14563,38 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.8.1(typescript@5.8.3)(zod@3.24.4): - dependencies: - '@adraffy/ens-normalize': 1.11.0 - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.2 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.24.4) - eventemitter3: 5.0.1 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - zod - - ox@0.8.1(typescript@5.8.3)(zod@3.25.76): + ox@0.8.1(typescript@5.9.2)(zod@3.25.76): dependencies: - '@adraffy/ens-normalize': 1.11.0 + '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.76) + abitype: 1.0.8(typescript@5.9.2)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - zod - ox@0.9.3(typescript@5.8.3)(zod@3.24.4): + ox@0.9.6(typescript@5.9.2)(zod@3.25.76): dependencies: - '@adraffy/ens-normalize': 1.11.0 + '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.9(typescript@5.8.3)(zod@3.24.4) + abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - zod + p-cancelable@2.1.1: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -14296,7 +14628,7 @@ snapshots: parse-json@5.2.0: dependencies: '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 + error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -14317,6 +14649,11 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.0: + dependencies: + lru-cache: 11.2.1 + minipass: 7.1.2 + path-to-regexp@0.1.12: {} path-type@4.0.0: {} @@ -14333,14 +14670,14 @@ snapshots: create-hmac: 1.1.7 ripemd160: 2.0.1 safe-buffer: 5.2.1 - sha.js: 2.4.11 + sha.js: 2.4.12 to-buffer: 1.2.1 picocolors@1.1.1: {} picomatch@2.3.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} pidtree@0.6.0: {} @@ -14359,7 +14696,7 @@ snapshots: minimist: 0.2.4 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 - pump: 3.0.2 + pump: 3.0.3 readable-stream: 4.7.0 secure-json-parse: 2.7.0 sonic-boom: 4.2.0 @@ -14367,14 +14704,14 @@ snapshots: pino-std-serializers@7.0.0: {} - pino@9.6.0: + pino@9.11.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 - process-warning: 4.0.1 + process-warning: 5.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 @@ -14391,7 +14728,7 @@ snapshots: dependencies: queue-lit: 1.5.2 - pnpm@10.10.0: {} + pnpm@10.17.0: {} posix-character-classes@0.1.1: {} @@ -14399,17 +14736,17 @@ snapshots: prebuild-install@7.1.3: dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.0 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 0.2.4 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.75.0 - pump: 3.0.2 + node-abi: 3.77.0 + pump: 3.0.3 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 2.1.3 + tar-fs: 2.1.4 tunnel-agent: 0.6.0 prelude-ls@1.2.1: {} @@ -14418,7 +14755,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.5.3: {} + prettier@3.6.2: {} pretty-format@22.4.3: dependencies: @@ -14442,7 +14779,7 @@ snapshots: process-warning@3.0.0: {} - process-warning@4.0.1: {} + process-warning@5.0.0: {} process@0.11.10: {} @@ -14462,15 +14799,21 @@ snapshots: dependencies: event-stream: 3.3.4 - pump@3.0.2: + pump@3.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 punycode@2.3.1: {} pure-rand@6.1.0: {} + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.3: {} + qs@6.13.0: dependencies: side-channel: 1.1.0 @@ -14481,6 +14824,8 @@ snapshots: quick-format-unescaped@4.0.4: {} + quick-lru@5.1.1: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -14558,7 +14903,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -14589,6 +14934,8 @@ snapshots: require-from-string@2.0.2: {} + resolve-alpn@1.2.1: {} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -14613,6 +14960,10 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -14642,6 +14993,11 @@ snapshots: dependencies: glob: 7.2.3 + rimraf@6.0.1: + dependencies: + glob: 11.0.3 + package-json-from-dist: 1.0.1 + ripemd160@2.0.1: dependencies: hash-base: 2.0.2 @@ -14656,7 +15012,7 @@ snapshots: dependencies: bn.js: 5.2.1 - rpc-websockets@9.1.1: + rpc-websockets@9.1.3: dependencies: '@swc/helpers': 0.5.17 '@types/uuid': 8.3.4 @@ -14745,7 +15101,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.1: {} + semver@7.7.2: {} send@0.19.0: dependencies: @@ -14813,10 +15169,15 @@ snapshots: setprototypeof@1.2.0: {} - sha.js@2.4.11: + sha.js@2.4.12: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 + to-buffer: 1.2.1 + + sha3@2.1.4: + dependencies: + buffer: 6.0.3 shebang-command@2.0.0: dependencies: @@ -14864,9 +15225,9 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 - simple-swizzle@0.2.2: + simple-swizzle@0.2.4: dependencies: - is-arrayish: 0.3.2 + is-arrayish: 0.3.4 sisteransi@1.0.5: {} @@ -14880,15 +15241,10 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - slice-ansi@5.0.0: - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - - slice-ansi@7.1.0: + slice-ansi@7.1.2: dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.0.0 + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 snake-case@3.0.4: dependencies: @@ -14922,11 +15278,11 @@ snapshots: transitivePeerDependencies: - supports-color - solc@0.8.26(debug@4.4.1): + solc@0.8.26(debug@4.4.3): dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.11(debug@4.4.3) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -15018,6 +15374,11 @@ snapshots: statuses@2.0.1: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + stream-blackhole@1.0.3: {} stream-chain@2.2.5: {} @@ -15030,7 +15391,7 @@ snapshots: dependencies: stream-chain: 2.2.5 - stream-transform@3.3.3: {} + stream-transform@3.4.0: {} string-argv@0.3.2: {} @@ -15049,13 +15410,18 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string-width@7.2.0: dependencies: - emoji-regex: 10.4.0 - get-east-asian-width: 1.3.0 - strip-ansi: 7.1.0 + emoji-regex: 10.5.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 string.prototype.trim@1.2.10: dependencies: @@ -15063,7 +15429,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -15094,9 +15460,9 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-bom@3.0.0: {} @@ -15112,7 +15478,7 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@1.1.2: {} + strnum@2.1.1: {} superstruct@0.15.5: {} @@ -15132,10 +15498,9 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.11.4: + synckit@0.11.11: dependencies: - '@pkgr/core': 0.2.4 - tslib: 2.8.1 + '@pkgr/core': 0.2.9 table@6.9.0: dependencies: @@ -15145,17 +15510,17 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tar-fs@2.1.3: + tar-fs@2.1.4: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 - pump: 3.0.2 + pump: 3.0.3 tar-stream: 2.2.0 tar-stream@2.2.0: dependencies: bl: 4.1.0 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 @@ -15189,20 +15554,20 @@ snapshots: tiny-warning@1.0.3: {} - tinyglobby@0.2.14: + tinyglobby@0.2.15: dependencies: - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tmp-promise@3.0.3: dependencies: - tmp: 0.2.3 + tmp: 0.2.5 tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - tmp@0.2.3: {} + tmp@0.2.5: {} tmpl@1.0.5: {} @@ -15246,31 +15611,31 @@ snapshots: triple-beam@1.4.1: {} - ts-api-utils@1.4.3(typescript@5.8.3): + ts-api-utils@1.4.3(typescript@5.9.2): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 - ts-jest@29.3.2(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(jest@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.4.4(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)))(typescript@5.9.2): dependencies: bs-logger: 0.2.6 - ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)) - jest-util: 29.7.0 + handlebars: 4.7.8 + jest: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.1 + semver: 7.7.2 type-fest: 4.41.0 - typescript: 5.8.3 + typescript: 5.9.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.4 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.27.1) + babel-jest: 29.7.0(@babel/core@7.28.4) + jest-util: 29.7.0 - ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3): + ts-node@10.9.2(@types/node@15.14.9)(typescript@5.9.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -15278,13 +15643,13 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 15.14.9 - acorn: 8.14.1 + acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.3 + typescript: 5.9.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -15317,10 +15682,10 @@ snapshots: tsort@0.0.1: {} - tsx@4.20.3: + tsx@4.20.5: dependencies: - esbuild: 0.25.5 - get-tsconfig: 4.10.0 + esbuild: 0.25.10 + get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 @@ -15386,10 +15751,13 @@ snapshots: typed-function@2.1.0: {} - typescript@5.8.3: {} + typescript@5.9.2: {} u3@0.1.1: {} + uglify-js@3.19.3: + optional: true + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -15414,29 +15782,29 @@ snapshots: unpipe@1.0.0: {} - unrs-resolver@1.9.2: + unrs-resolver@1.11.1: dependencies: - napi-postinstall: 0.2.5 + napi-postinstall: 0.3.3 optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.9.2 - '@unrs/resolver-binding-android-arm64': 1.9.2 - '@unrs/resolver-binding-darwin-arm64': 1.9.2 - '@unrs/resolver-binding-darwin-x64': 1.9.2 - '@unrs/resolver-binding-freebsd-x64': 1.9.2 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.9.2 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.9.2 - '@unrs/resolver-binding-linux-arm64-gnu': 1.9.2 - '@unrs/resolver-binding-linux-arm64-musl': 1.9.2 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.9.2 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.9.2 - '@unrs/resolver-binding-linux-riscv64-musl': 1.9.2 - '@unrs/resolver-binding-linux-s390x-gnu': 1.9.2 - '@unrs/resolver-binding-linux-x64-gnu': 1.9.2 - '@unrs/resolver-binding-linux-x64-musl': 1.9.2 - '@unrs/resolver-binding-wasm32-wasi': 1.9.2 - '@unrs/resolver-binding-win32-arm64-msvc': 1.9.2 - '@unrs/resolver-binding-win32-ia32-msvc': 1.9.2 - '@unrs/resolver-binding-win32-x64-msvc': 1.9.2 + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 unset-value@1.0.0: dependencies: @@ -15445,9 +15813,9 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.1.3(browserslist@4.24.5): + update-browserslist-db@1.1.3(browserslist@4.26.2): dependencies: - browserslist: 4.24.5 + browserslist: 4.26.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -15459,7 +15827,7 @@ snapshots: usb@2.9.0: dependencies: - '@types/w3c-web-usb': 1.0.10 + '@types/w3c-web-usb': 1.0.12 node-addon-api: 6.1.0 node-gyp-build: 4.8.4 @@ -15494,58 +15862,41 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 vary@1.1.2: {} - viem@2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4): - dependencies: - '@noble/curves': 1.9.2 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.24.4) - isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.8.1(typescript@5.8.3)(zod@3.24.4) - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - viem@2.31.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.31.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.76) + abitype: 1.0.8(typescript@5.9.2)(zod@3.25.76) isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.8.1(typescript@5.8.3)(zod@3.25.76) + ox: 0.8.1(typescript@5.9.2)(zod@3.25.76) ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - viem@2.37.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4): + viem@2.37.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(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.0.8(typescript@5.8.3)(zod@3.24.4) + abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.9.3(typescript@5.8.3)(zod@3.24.4) + ox: 0.9.6(typescript@5.9.2)(zod@3.25.76) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -15555,7 +15906,7 @@ snapshots: wait-on@7.0.1(debug@4.3.4): dependencies: - axios: 1.9.0(debug@4.3.4) + axios: 1.12.2(debug@4.3.4) joi: 17.13.3 lodash: 4.17.21 minimist: 0.2.4 @@ -15571,6 +15922,8 @@ snapshots: dependencies: defaults: 1.0.4 + web-streams-polyfill@3.3.3: {} + web3-utils@1.7.3: dependencies: bn.js: 5.2.1 @@ -15581,6 +15934,14 @@ snapshots: randombytes: 2.1.0 utf8: 3.0.0 + webcrypto-core@1.8.1: + dependencies: + '@peculiar/asn1-schema': 2.5.0 + '@peculiar/json-schema': 1.1.12 + asn1js: 3.0.6 + pvtsutils: 1.3.6 + tslib: 2.8.1 + webidl-conversions@3.0.1: {} whatwg-url@5.0.0: @@ -15667,6 +16028,8 @@ snapshots: word-wrap@1.2.5: {} + wordwrap@1.0.0: {} + workerpool@6.5.1: {} wrap-ansi@6.2.0: @@ -15683,15 +16046,15 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 - wrap-ansi@9.0.0: + wrap-ansi@9.0.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} @@ -15731,9 +16094,7 @@ snapshots: yallist@3.1.1: {} - yaml@2.7.1: {} - - yaml@2.8.0: {} + yaml@2.8.1: {} yargs-parser@20.2.9: {} @@ -15770,10 +16131,8 @@ snapshots: yocto-queue@0.1.0: {} - zod-to-json-schema@3.24.5(zod@3.24.4): + zod-to-json-schema@3.24.6(zod@3.25.76): dependencies: - zod: 3.24.4 - - zod@3.24.4: {} + zod: 3.25.76 zod@3.25.76: {} diff --git a/src/app.ts b/src/app.ts index 12b896308a..9fac9ed4e8 100644 --- a/src/app.ts +++ b/src/app.ts @@ -13,14 +13,17 @@ import Fastify, { FastifyInstance } from 'fastify'; // Internal dependencies // Routes +import { cardanoRoutes } from './chains/cardano/cardano.routes'; import { ethereumRoutes } from './chains/ethereum/ethereum.routes'; import { solanaRoutes } from './chains/solana/solana.routes'; import { configRoutes } from './config/config.routes'; import { register0xRoutes } from './connectors/0x/0x.routes'; import { jupiterRoutes } from './connectors/jupiter/jupiter.routes'; import { meteoraRoutes } from './connectors/meteora/meteora.routes'; +import { minswapRoutes } from './connectors/minswap/minswap.routes'; import { pancakeswapRoutes } from './connectors/pancakeswap/pancakeswap.routes'; import { raydiumRoutes } from './connectors/raydium/raydium.routes'; +import { sundaeswapRoutes } from './connectors/sundaeswap/sundaeswap.routes'; import { uniswapRoutes } from './connectors/uniswap/uniswap.routes'; import { getHttpsOptions } from './https'; import { poolRoutes } from './pools/pools.routes'; @@ -71,6 +74,10 @@ const swaggerOptions = { name: '/chain/ethereum', description: 'Ethereum and EVM-based chain endpoints', }, + { + name: '/chain/cardano', + description: 'Cardano chain endpoints', + }, // Connectors { @@ -90,6 +97,14 @@ const swaggerOptions = { description: 'Uniswap connector endpoints', }, { name: '/connector/0x', description: '0x connector endpoints' }, + { + name: '/connector/minswap/amm', + description: 'Minswap pool connector (Cardano)', + }, + { + name: '/connector/sundaeswap/amm', + description: 'Sundaeswap pool connector (Cardano)', + }, ], components: { parameters: { @@ -216,6 +231,7 @@ const configureGatewayServer = () => { // Register chain routes app.register(solanaRoutes, { prefix: '/chains/solana' }); app.register(ethereumRoutes, { prefix: '/chains/ethereum' }); + app.register(cardanoRoutes, { prefix: '/chains/cardano' }); // Register DEX connector routes - organized by connector @@ -238,6 +254,14 @@ const configureGatewayServer = () => { app.register(uniswapRoutes.amm, { prefix: '/connectors/uniswap/amm' }); app.register(uniswapRoutes.clmm, { prefix: '/connectors/uniswap/clmm' }); + // Minswap routes + app.register(minswapRoutes.amm, { prefix: '/connectors/minswap/amm' }); + + // Sundaeswap routes + app.register(sundaeswapRoutes.amm, { + prefix: '/connectors/sundaeswap/amm', + }); + // 0x routes app.register(register0xRoutes); diff --git a/src/chains/cardano/cardano.config.ts b/src/chains/cardano/cardano.config.ts new file mode 100644 index 0000000000..816c6fe68b --- /dev/null +++ b/src/chains/cardano/cardano.config.ts @@ -0,0 +1,19 @@ +import { ConfigManagerV2 } from '../../services/config-manager-v2'; + +export interface Config { + chainID: number; + nativeCurrencySymbol: string; + apiurl: string; + projectId: string; +} + +export function getCardanoConfig(networkName: string): Config { + const namespaceId = `cardano-${networkName}`; + return { + chainID: ConfigManagerV2.getInstance().get(namespaceId + '.chainID'), + nativeCurrencySymbol: ConfigManagerV2.getInstance().get(namespaceId + '.nativeCurrencySymbol'), + apiurl: ConfigManagerV2.getInstance().get(namespaceId + '.apiurl'), + projectId: ConfigManagerV2.getInstance().get(namespaceId + '.projectId'), + // Additional Cardano-specific configurations can be added here + }; +} diff --git a/src/chains/cardano/cardano.routes.ts b/src/chains/cardano/cardano.routes.ts new file mode 100644 index 0000000000..d7200ddf26 --- /dev/null +++ b/src/chains/cardano/cardano.routes.ts @@ -0,0 +1,16 @@ +import { FastifyPluginAsync } from 'fastify'; + +import { balancesRoute } from './routes/balances'; +import { pollRoute } from './routes/poll'; +import { statusRoute } from './routes/status'; +import { tokensRoute } from './routes/tokens'; + +export const cardanoRoutes: FastifyPluginAsync = async (fastify) => { + // Register all the route handlers + fastify.register(statusRoute); + fastify.register(tokensRoute); + fastify.register(balancesRoute); + fastify.register(pollRoute); +}; + +export default cardanoRoutes; diff --git a/src/chains/cardano/cardano.ts b/src/chains/cardano/cardano.ts new file mode 100644 index 0000000000..43e9b21cbe --- /dev/null +++ b/src/chains/cardano/cardano.ts @@ -0,0 +1,453 @@ +import crypto from 'crypto'; + +import { Lucid, Blockfrost, UTxO, Network } from '@aiquant/lucid-cardano'; +import fse from 'fs-extra'; + +import { TokenService } from '#src/services/token-service'; +import { CardanoToken } from '#src/tokens/types'; + +import { ConfigManagerCertPassphrase } from '../../services/config-manager-cert-passphrase'; +import { logger } from '../../services/logger'; +import { walletPath } from '../../wallet/utils'; + +import { Config, getCardanoConfig } from './cardano.config'; +import { + NETWORK_ERROR_CODE, + NETWORK_ERROR_MESSAGE, + HttpException, + TOKEN_NOT_SUPPORTED_ERROR_CODE, + TOKEN_NOT_SUPPORTED_ERROR_MESSAGE, + TransactionStatus, +} from './cardano.utils'; + +export class Cardano { + private static _instances: { [name: string]: Cardano }; + public tokenList: CardanoToken[] = []; + public config: Config; + public tokenMap: Record = {}; + public lucidInstance: Lucid | null = null; + public network: string; + private _chain: string; + private _ready: boolean = false; + public apiURL: any; + public nativeTokenSymbol: string; + public projectId: string; + + private constructor(network: string) { + this.config = getCardanoConfig(network); + this._chain = 'cardano'; + // Determine the appropriate Blockfrost Project ID and API URL + this.apiURL = this.config.apiurl; + this.network = network; + this.nativeTokenSymbol = this.config.nativeCurrencySymbol; + this.projectId = this.config.projectId; + } + + public static async getInstance(network: string): Promise { + // Add stack trace to find WHO is calling this + // console.log(`🔍 Cardano.getInstance('${network}') called from:`); + // console.trace(); + if (!Cardano._instances) { + Cardano._instances = {}; + } + if (!Cardano._instances[network]) { + const instance = new Cardano(network); + await instance.init(); + Cardano._instances[network] = instance; + } + return Cardano._instances[network]; + } + + private async init(): Promise { + // Add validation here instead of constructor + if (this.network !== 'mainnet' && this.network !== 'preprod' && this.network !== 'preview') { + throw new HttpException(503, NETWORK_ERROR_MESSAGE, NETWORK_ERROR_CODE); + } + try { + logger.info( + `Initializing Cardano connector for network: ${this.network}, API URL: ${this.apiURL}, Project ID: ${this.projectId}`, + ); + if (!this.lucidInstance) { + this.lucidInstance = await Lucid.new( + new Blockfrost(this.apiURL, this.projectId), + this.network === 'preprod' ? 'Preprod' : this.network === 'preview' ? 'Preview' : 'Mainnet', + ); + } + await this.loadTokens(); + this._ready = true; + logger.info(`Cardano chain initialized for network=${this.network}`); + } catch (e) { + logger.error(`Failed to initialize ${this.network}: ${e}`); + throw e; + } + } + + public static getConnectedInstances(): { [name: string]: Cardano } { + return Cardano._instances; + } + + public get chain(): string { + return this._chain; + } + + public ready(): boolean { + return this._ready; + } + + private getLucid(): Lucid { + if (!this.lucidInstance) { + // Use instance-specific Lucid + throw new Error('Lucid is not initialized. Call `init` first.'); + } + return this.lucidInstance; + } + + public async getWalletFromPrivateKey(privateKey: string): Promise<{ + address: string; + }> { + if (!this._ready) { + throw new Error('Cardano instance is not initialized. Call `init` first.'); + } + + try { + const lucid = this.getLucid(); + lucid.selectWalletFromPrivateKey(privateKey); + + // Get wallet address + const address = await lucid.wallet.address(); + return { address }; + } catch (error: any) { + throw new Error(`Error retrieving wallet from private key: ${error.message}`); + } + } + + public async getWalletFromAddress(address: string): Promise { + const path = `${walletPath}/${this._chain}`; + const encryptedPrivateKey: string = await fse.readFile(`${path}/${address}.json`, 'utf8'); + const passphrase = ConfigManagerCertPassphrase.readPassphrase(); + if (!passphrase) { + throw new Error('missing passphrase'); + } + + // Ensure decrypt is awaited if it's asynchronous + const privateKey = await this.decrypt(encryptedPrivateKey, passphrase); + + return privateKey; // Correctly resolved the Promise to string + } + // get native balance ADA + public async getNativeBalance(privateKey: string): Promise { + const Lucid = this.getLucid(); + Lucid.selectWalletFromPrivateKey(privateKey); + + // Get wallet address + const address = await Lucid.wallet.address(); + // Fetch UTXOs at the wallet's address + const utxos = await Lucid.utxosAt(address); + + // Calculate total balance in ADA using BigInt + const totalLovelace = utxos.reduce((acc, utxo) => acc + (utxo.assets.lovelace || 0n), 0n); + + // Convert Lovelace (BigInt) to ADA (Number) + const balanceInADA = Number(totalLovelace) / 1_000_000; + + return balanceInADA.toString(); + } + // get Asset balance like MIN and LP + async getAssetBalance(privateKey: string, token: CardanoToken): Promise { + // If token information is not found, throw an error + if (!token || Object.keys(token).length === 0) { + throw new Error(`Token ${token} is not supported.`); + } + const tokenAddress: string = token.policyId + token.assetName; + + const Lucid = this.getLucid(); + Lucid.selectWalletFromPrivateKey(privateKey); + + // Get wallet address + const address = await Lucid.wallet.address(); + + // Fetch UTXOs at the wallet's address + const utxos = await Lucid.utxosAt(address); + + // Calculate token balance + const calculatedTokenBalance = utxos.reduce((acc, utxo) => { + if (utxo.assets[tokenAddress]) { + return acc + Number(utxo.assets[tokenAddress]); + } + return acc; + }, 0); + // Divide raw balance by 10^decimals to get the actual amount + const decimals = token.decimals; + const actualTokenBalance = calculatedTokenBalance / Math.pow(10, decimals); + logger.debug(`Token balance for ${address}: ${actualTokenBalance.toString()}`); + return actualTokenBalance.toString(); + } + + async encrypt(secret: string, password: string): Promise { + const algorithm = 'aes-256-ctr'; + const iv = crypto.randomBytes(16); + const salt = crypto.randomBytes(32); + const key = crypto.pbkdf2Sync(password, new Uint8Array(salt), 5000, 32, 'sha512'); + const cipher = crypto.createCipheriv(algorithm, new Uint8Array(key), new Uint8Array(iv)); + + const encryptedBuffers = [ + new Uint8Array(cipher.update(new Uint8Array(Buffer.from(secret)))), + new Uint8Array(cipher.final()), + ]; + const encrypted = Buffer.concat(encryptedBuffers); + + const ivJSON = iv.toJSON(); + const saltJSON = salt.toJSON(); + const encryptedJSON = encrypted.toJSON(); + + return JSON.stringify({ + algorithm, + iv: ivJSON, + salt: saltJSON, + encrypted: encryptedJSON, + }); + } + + async decrypt(encryptedSecret: string, password: string): Promise { + const hash = JSON.parse(encryptedSecret); + const salt = new Uint8Array(Buffer.from(hash.salt, 'utf8')); + const iv = new Uint8Array(Buffer.from(hash.iv, 'utf8')); + + const key = crypto.pbkdf2Sync(password, salt, 5000, 32, 'sha512'); + + const decipher = crypto.createDecipheriv(hash.algorithm, new Uint8Array(key), iv); + + const decryptedBuffers = [ + new Uint8Array(decipher.update(new Uint8Array(Buffer.from(hash.encrypted, 'hex')))), + new Uint8Array(decipher.final()), + ]; + const decrypted = Buffer.concat(decryptedBuffers); + + return decrypted.toString(); + } + + async getCurrentBlockNumber(): Promise { + const response = await fetch(`${this.apiURL}/blocks/latest`, { + headers: { + project_id: this.projectId, + }, + }); + + if (!response.ok) { + throw new Error(`Error fetching latest block: ${response.statusText}`); + } + + const latestBlock = await response.json(); + return latestBlock.height; + } + + public async getTransaction(txHash: string): Promise { + try { + // Fetch transaction details from Blockfrost + const response = await fetch(`${this.apiURL}/txs/${txHash}`, { + method: 'GET', + headers: { + project_id: this.projectId, // Pass project ID in the header + }, + }); + + // Check if the response is successful + if (!response.ok) { + throw new Error(`Failed to fetch transaction: ${response.statusText}`); + } + + // Parse the response JSON + const tx = await response.json(); + + // Simplify the response for the bot + return { + txHash: tx.hash, + block: tx.block, + blockHeight: tx.block_height, + blockTime: tx.block_time, + fees: Number(tx.fees), + validContract: tx.valid_contract, + status: tx.block ? 1 : 0, // Simplified status + }; + } catch (error) { + console.error(`Error fetching transaction: ${error}`); + throw error; + } + } + + /** + * Load tokens from the token list source + */ + public async loadTokens(): Promise { + logger.info(`Loading tokens for cardano/${this.network} using TokenService`); + + try { + // Use TokenService to load tokens + const tokens = await TokenService.getInstance().loadTokenList('cardano', this.network); + + // Transform to CardanoToken format with required Cardano-specific properties + this.tokenList = tokens.map((token): CardanoToken => { + let policyId: string; + let assetName: string; + + // Check if this is a Cardano native token (ADA) + if (token.address === 'ada.lovelace' || token.symbol.toLowerCase() === 'ada') { + // Native ADA token - empty policyId and assetName + policyId = ''; + assetName = ''; + } else if (token.address.includes('.')) { + // Custom token with format: policyId.assetName + const addressParts = token.address.split('.'); + policyId = addressParts[0]; + assetName = addressParts[1] || ''; + } else { + // Custom token with just policyId (no asset name) + policyId = token.address; + assetName = ''; + } + return { + ...token, + policyId: policyId, + assetName: assetName, + }; + }); + + if (this.tokenList) { + logger.info(`Loaded ${this.tokenList.length} tokens for cardano/${this.network}`); + // Build token map for faster lookups + this.tokenList.forEach((token: CardanoToken) => (this.tokenMap[token.symbol] = token)); + } + } catch (error) { + logger.error(`Failed to load token list: ${error.message}`); + throw error; + } + } + + public get storedTokenList(): CardanoToken[] { + return this.tokenList; + } + + /** + * Get token info by symbol or address + */ + public getTokenBySymbol(tokenSymbol: string): CardanoToken | undefined { + // First try to find token by symbol + const tokenBySymbol = this.tokenList.find( + (token: CardanoToken) => token.symbol.toUpperCase() === tokenSymbol.toUpperCase(), + ); + + if (tokenBySymbol) { + return tokenBySymbol; + } + } + + public getTokenAddress(symbol: string): string { + let tokenAddress: string = ''; + const tokenInfo = this.getTokenBySymbol(symbol); + // If token information is not found, throw an error + if (!tokenInfo || Object.keys(tokenInfo).length === 0) { + // Handle token not supported errors + throw new HttpException(500, TOKEN_NOT_SUPPORTED_ERROR_MESSAGE, TOKEN_NOT_SUPPORTED_ERROR_CODE); + } + + tokenAddress = tokenInfo[0]?.policyId + tokenInfo[0]?.assetName; + + return tokenAddress; + } + + /** + * Get the first available Cardano wallet address + */ + public async getFirstWalletAddress(): Promise { + // Specifically look in the cardano subdirectory, not in any other chain's directory + const path = `${walletPath}/cardano`; + try { + // Create directory if it doesn't exist + await fse.ensureDir(path); + + // Get all .json files in the directory + const files = await fse.readdir(path); + const walletFiles = files.filter((f) => f.endsWith('.json')); + + if (walletFiles.length === 0) { + return null; + } + + // Return first wallet address (without .json extension) + const walletAddress = walletFiles[0].slice(0, -5); + + // Validate it looks like an Cardano address + if (!walletAddress.startsWith('addr')) { + logger.warn(`Invalid Cardano address found in wallet directory: ${walletAddress}`); + return null; + } + + return walletAddress; + } catch (error) { + logger.error(`Error getting Cardano wallet address: ${error.message}`); + return null; + } + } + + /** + * Given a payment address, load its private key & select that + * wallet in Lucid, then return all UTxOs at that address. + */ + public async getUtxos(address: string): Promise { + try { + // 1) derive the private key from your store (e.g. DB or seed) + const privateKey = await this.getWalletFromAddress(address); + if (!privateKey) { + throw new Error(`No private key found for address ${address}`); + } + + // 2) tell Lucid to use that key for signing / UTxO queries + this.lucidInstance.selectWalletFromPrivateKey(privateKey); + + // 3) fetch & return UTxOs + const utxos: UTxO[] = await this.lucidInstance.utxosAt(address); + return utxos; + } catch (error: any) { + // 4) log the failure for debugging + logger.error(`Cardano.getUtxos failed for address ${address}: ${error.message || error}`); + // 5) rethrow a trimmed error + throw new Error(`Unable to fetch UTxOs for ${address}: ${error.message || error}`); + } + } + + /** + * Validate Cardano address format + * @param address The address to validate + * @returns The address if valid + * @throws Error if the address is invalid + */ + public static validateAddress(address: string): string { + try { + const cardanoAddressRegex = /^(addr|addr_test)[0-9a-zA-Z]{1,}$/; + + // Additional check for proper length + if (!cardanoAddressRegex.test(address)) { + throw new Error('Invalid address length'); + } + + return address; + } catch (error) { + throw new Error(`Invalid Cardano address format: ${address}`); + } + } + + public async getTokenByAddress(tokenAddress: string): Promise { + const token = this.tokenList.find((token: CardanoToken) => { + const splitAddress = token.address.split('.').join(''); + const splitTokenAddress = tokenAddress.split('.').join(''); + return splitTokenAddress === splitAddress; + }); + return token; + } + + async close() { + if (this._chain in Cardano._instances) { + delete Cardano._instances[this._chain]; + } + } +} diff --git a/src/chains/cardano/cardano.utils.ts b/src/chains/cardano/cardano.utils.ts new file mode 100644 index 0000000000..dbdbd5fca3 --- /dev/null +++ b/src/chains/cardano/cardano.utils.ts @@ -0,0 +1,68 @@ +export const NETWORK_ERROR_CODE = 1001; +export const RATE_LIMIT_ERROR_CODE = 1002; +export const OUT_OF_GAS_ERROR_CODE = 1003; +export const TRANSACTION_GAS_PRICE_TOO_LOW = 1004; +export const LOAD_WALLET_ERROR_CODE = 1005; +export const TOKEN_NOT_SUPPORTED_ERROR_CODE = 1006; +export const TRADE_FAILED_ERROR_CODE = 1007; +export const SWAP_PRICE_EXCEEDS_LIMIT_PRICE_ERROR_CODE = 1008; +export const SWAP_PRICE_LOWER_THAN_LIMIT_PRICE_ERROR_CODE = 1009; +export const SERVICE_UNITIALIZED_ERROR_CODE = 1010; +export const UNKNOWN_CHAIN_ERROR_CODE = 1011; +export const INVALID_NONCE_ERROR_CODE = 1012; +export const PRICE_FAILED_ERROR_CODE = 1013; +export const INCOMPLETE_REQUEST_PARAM_CODE = 1014; +export const ERROR_RETRIEVING_WALLET_ADDRESS_ERROR_CODE = 1015; +export const ACCOUNT_NOT_SPECIFIED_CODE = 1016; +export const TRADE_NOT_FOUND_ERROR_CODE = 1017; +export const UNKNOWN_ERROR_ERROR_CODE = 1099; +export const AMOUNT_NOT_SUPPORTED_ERROR_CODE = 1016; +export const ENDPOINT_NOT_SUPPORTED_ERROR_CODE = 1018; +export const INSUFFICIENT_FUNDS_ERROR_CODE = 1019; +export const GAS_LIMIT_EXCEEDED_ERROR_CODE = 1020; +export const AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_CODE = 1021; + +export const NETWORK_ERROR_MESSAGE = + 'Network error. Please check your node URL, API key, and Internet connection.'; +export const RATE_LIMIT_ERROR_MESSAGE = + 'Blockchain node API rate limit exceeded.'; +export const LOAD_WALLET_ERROR_MESSAGE = 'Failed to load wallet: '; +export const TOKEN_NOT_SUPPORTED_ERROR_MESSAGE = 'Token not supported: '; +export const TRADE_FAILED_ERROR_MESSAGE = 'Trade query failed: '; +export const INCOMPLETE_REQUEST_PARAM = 'Incomplete request parameters.'; +export const INVALID_NONCE_ERROR_MESSAGE = 'Invalid Nonce provided: '; +export const AMOUNT_NOT_SUPPORTED_ERROR_MESSAGE = + 'Amount provided in an unexpected format'; +export const ENDPOINT_NOT_SUPPORTED_ERROR_MESSAGE = + 'Endpoint not supported by this chain/controller.'; +export const INSUFFICIENT_FUNDS_ERROR_MESSAGE = + 'Insufficient funds for transaction.'; +export const GAS_LIMIT_EXCEEDED_ERROR_MESSAGE = + 'Gas limit exceeded (gasWanted greater than gasLimitEstimate).'; +export const AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_MESSAGE = + 'Calculated amount less than min amount provided with slippage. Maybe try increasing slippage. '; + +// custom error for http exceptions +export class HttpException extends Error { + status: number; + message: string; + errorCode: number; + constructor(status: number, message: string, errorCode: number = -1) { + super(message); + this.status = status; + this.message = message; + this.errorCode = errorCode; + } +} + +export interface TransactionStatus { + txHash: string; + block: number | null; + blockHeight: number | null; + blockTime: number | null; + fees: number; + validContract: boolean; + status: 0 | 1; // 0 = pending, 1 = confirmed +} + +export interface CardanoTokensResponseType {} diff --git a/src/chains/cardano/routes/balances.ts b/src/chains/cardano/routes/balances.ts new file mode 100644 index 0000000000..6be7e280f4 --- /dev/null +++ b/src/chains/cardano/routes/balances.ts @@ -0,0 +1,166 @@ +import { FastifyPluginAsync, FastifyInstance } from 'fastify'; + +import { + BalanceRequestType, + BalanceResponseType, + BalanceRequestSchema, + BalanceResponseSchema, +} from '../../../schemas/chain-schema'; +import { tokenValueToString } from '../../../services/base'; +import { logger } from '../../../services/logger'; +import { Cardano } from '../cardano'; + +export async function getCardanoBalances( + fastify: FastifyInstance, + network: string, + address: string, + tokens?: string[], +): Promise { + try { + const cardano = await Cardano.getInstance(network); + // await cardano.init(); + + let wallet: string; + const balances: Record = {}; + + // Treat empty array as if no tokens were specified + const effectiveTokens = tokens && tokens.length === 0 ? undefined : tokens; + + // If no tokens specified, check all tokens in the token list + const checkAllTokens = !effectiveTokens; + + try { + wallet = await cardano.getWalletFromAddress(address); + } catch (err) { + logger.error(`Failed to load wallet: ${err.message}`); + throw fastify.httpErrors.internalServerError(`Failed to load wallet: ${err.message}`); + } + + // Always get native token balance + const nativeBalance = await cardano.getNativeBalance(wallet); + // Convert string to number as required by schema + balances[cardano.nativeTokenSymbol] = parseFloat(tokenValueToString(nativeBalance)); + + if (checkAllTokens) { + // No tokens specified, check all tokens in the token list + logger.info(`Checking balances for all ${cardano.storedTokenList.length} tokens in the token list`); + + // Process tokens in batches to avoid overwhelming the provider + // This allows for provider-specific rate limiting while still being efficient + const batchSize = 25; // Reasonable default batch size + const tokenList = cardano.storedTokenList; + const totalTokens = tokenList.length; + + // Set a maximum time limit for the entire operation + const maxScanTimeMs = 30000; // 30 seconds maximum for scanning + const startTime = Date.now(); + let timeExceeded = false; + + logger.info(`Processing ${totalTokens} tokens in batches of ${batchSize} with ${maxScanTimeMs}ms time limit`); + + for (let i = 0; i < totalTokens && !timeExceeded; i += batchSize) { + // Check if we've exceeded the time limit + if (Date.now() - startTime > maxScanTimeMs) { + logger.warn(`Time limit of ${maxScanTimeMs}ms exceeded after checking ${i} tokens. Stopping scan.`); + timeExceeded = true; + break; + } + + const batch = tokenList.slice(i, i + batchSize); + logger.debug(`Processing batch ${Math.floor(i / batchSize) + 1}/${Math.ceil(totalTokens / batchSize)}`); + + // Process batch in parallel with timeout + await Promise.all( + batch.map(async (token) => { + try { + const balance = await cardano.getAssetBalance(wallet, token); + // Parse balance to number + const balanceNum = parseFloat(tokenValueToString(balance)); + + // Only add tokens with non-zero balances + if (balanceNum > 0) { + balances[token.symbol] = balanceNum; + logger.debug(`Found non-zero balance for ${token.symbol}: ${balanceNum}`); + } + } catch (err) { + // Log error but continue with other tokens + logger.warn(`Error getting balance for ${token.symbol}: ${err.message}`); + } + }), + ); + } + } else if (effectiveTokens) { + // Get ERC20 token balances for specific tokens + await Promise.all( + effectiveTokens.map(async (symbolOrAddress) => { + // Don't process the native token again + if (symbolOrAddress === cardano.nativeTokenSymbol) { + return; + } + + const token = cardano.getTokenBySymbol(symbolOrAddress); + if (token) { + const balance = await cardano.getAssetBalance(wallet, token); + // Convert string to number as required by schema + balances[token.symbol] = parseFloat(tokenValueToString(balance)); + } + }), + ); + } + + if (!Object.keys(balances).length) { + throw fastify.httpErrors.badRequest('No token balances found for the given wallet'); + } + + return { balances }; + } catch (error) { + if (error.statusCode) { + throw error; // Re-throw if it's already a Fastify error + } + logger.error(`Error getting balances: ${error.message}`); + throw fastify.httpErrors.internalServerError(`Failed to get balances: ${error.message}`); + } +} + +export const balancesRoute: FastifyPluginAsync = async (fastify) => { + fastify.post<{ + Body: BalanceRequestType; + Reply: BalanceResponseType; + }>( + '/balances', + { + schema: { + description: + 'Get Cardano balances. If no tokens specified or empty array provided, returns native token (ADA) and only non-zero balances for tokens from the token list. If specific tokens are requested, returns those exact tokens with their balances, including zeros.', + tags: ['/chain/cardano'], + body: { + ...BalanceRequestSchema, + properties: { + ...BalanceRequestSchema.properties, + network: { + type: 'string', + examples: ['mainnet', 'preprod', 'preview'], + }, + address: { type: 'string', examples: ['address'] }, + tokens: { + type: 'array', + items: { type: 'string' }, + description: + 'A list of token symbols or addresses. An empty array is treated the same as if the parameter was not provided, returning only non-zero balances plus the native token.', + examples: [['ADA', 'MIN', 'LP']], + }, + }, + }, + response: { + 200: BalanceResponseSchema, + }, + }, + }, + async (request) => { + const { network, address, tokens } = request.body; + return await getCardanoBalances(fastify, network, address, tokens); + }, + ); +}; + +export default balancesRoute; diff --git a/src/chains/cardano/routes/poll.ts b/src/chains/cardano/routes/poll.ts new file mode 100644 index 0000000000..88b93e7848 --- /dev/null +++ b/src/chains/cardano/routes/poll.ts @@ -0,0 +1,106 @@ +import { FastifyPluginAsync, FastifyInstance } from 'fastify'; + +import { + PollRequestType, + PollResponseType, + PollRequestSchema, + PollResponseSchema, +} from '../../../schemas/chain-schema'; +import { logger } from '../../../services/logger'; +import { Cardano } from '../cardano'; + +export async function pollCardanoTransaction( + _fastify: FastifyInstance, + network: string, + signature: string, +): Promise { + const cardano = await Cardano.getInstance(network); + + try { + const currentBlock = await cardano.getCurrentBlockNumber(); + + // Validate transaction signature format + if (!signature || typeof signature !== 'string') { + return { + currentBlock, + signature, + txBlock: null, + txStatus: 0, + txData: null, + fee: null, + error: 'Invalid transaction signature format', + }; + } + + const txData = await cardano.getTransaction(signature); + + if (!txData) { + return { + currentBlock, + signature, + txBlock: null, + txStatus: 0, + txData: null, + fee: null, + }; + } + + return { + currentBlock, + signature, + txBlock: txData.blockHeight, + txStatus: txData.status, + fee: txData.fees, + txData, + }; + } catch (error) { + logger.error(`Error polling transaction ${signature}: ${error.message}`); + return { + currentBlock: await cardano.getCurrentBlockNumber(), + signature, + txBlock: null, + txStatus: 0, + txData: null, + fee: null, + error: 'Transaction not found or invalid', + }; + } +} + +export const pollRoute: FastifyPluginAsync = async (fastify) => { + fastify.post<{ + Body: PollRequestType; + Reply: PollResponseType; + }>( + '/poll', + { + schema: { + description: 'Poll for the status of a Cardano transaction', + tags: ['/chain/cardano'], + body: { + ...PollRequestSchema, + properties: { + ...PollRequestSchema.properties, + network: { + type: 'string', + examples: ['mainnet', 'preprod', 'preview'], + }, + signature: { + type: 'string', + examples: ['66f5f15d15124a77418cfa3ec0e72cc1d2295647e528a9ecb4636f9ed5342d06'], + }, + }, + }, + response: { + 200: PollResponseSchema, + }, + }, + }, + async (request) => { + const { network, signature } = request.body; + return await pollCardanoTransaction(fastify, network, signature); + }, + ); +}; + +export default pollRoute; diff --git a/src/chains/cardano/routes/status.ts b/src/chains/cardano/routes/status.ts new file mode 100644 index 0000000000..add4e3a38f --- /dev/null +++ b/src/chains/cardano/routes/status.ts @@ -0,0 +1,98 @@ +import { FastifyPluginAsync } from 'fastify'; + +import { + StatusRequestType, + StatusResponseType, + StatusRequestSchema, + StatusResponseSchema, +} from '../../../schemas/chain-schema'; +import { logger } from '../../../services/logger'; +import { Cardano } from '../cardano'; + +export async function getCardanoStatus(network: string): Promise { + try { + const cardano = await Cardano.getInstance(network); + const chain = 'cardano'; + const rpcUrl = cardano.apiURL; + const nativeCurrency = cardano.nativeTokenSymbol; + const rpcProvider = 'blockfrost'; // Currently only Blockfrost is supported + + // Directly try to get the current block number with a timeout + let currentBlockNumber = 0; + try { + // Set up a timeout promise to prevent hanging on unresponsive nodes + const blockPromise = await cardano.getCurrentBlockNumber(); + const timeoutPromise = new Promise((_, reject) => { + setTimeout(() => reject(new Error('Request timed out')), 5000); + }); + + // Race the block request against the timeout + currentBlockNumber = await Promise.race([blockPromise, timeoutPromise]); + } catch (blockError) { + logger.warn(`Failed to get block number: ${blockError.message}`); + // Continue with default block number + } + + return { + chain, + network, + rpcUrl, + rpcProvider, + currentBlockNumber, + nativeCurrency, + }; + } catch (error) { + logger.error(`Error getting Cardano status: ${error.message}`); + throw new Error(`Failed to get Cardano status: ${error.message}`); + } +} + +export const statusRoute: FastifyPluginAsync = async (fastify) => { + fastify.get<{ + Querystring: StatusRequestType; + Reply: StatusResponseType; + }>( + '/status', + { + schema: { + description: 'Get Cardano chain status', + tags: ['/chain/cardano'], + querystring: { + ...StatusRequestSchema, + properties: { + ...StatusRequestSchema.properties, + network: { + type: 'string', + examples: ['mainnet', 'preprod', 'preview'], + }, + }, + }, + response: { + 200: StatusResponseSchema, + }, + }, + }, + async (request, reply) => { + const { network } = request.query; + try { + // This will handle node timeout internally + return await getCardanoStatus(network); + } catch (error) { + // This will catch any other unexpected errors + logger.error(`Error in Cardano status endpoint: ${error.message}`); + reply.status(500); + // Return a minimal valid response + return { + chain: 'cardano', + network, + rpcUrl: 'unavailable', + rpcProvider: 'unavailable', + currentBlockNumber: 0, + nativeCurrency: 'ADA', + }; + } + }, + ); +}; + +export default statusRoute; diff --git a/src/chains/cardano/routes/tokens.ts b/src/chains/cardano/routes/tokens.ts new file mode 100644 index 0000000000..57cd35799d --- /dev/null +++ b/src/chains/cardano/routes/tokens.ts @@ -0,0 +1,73 @@ +import { FastifyPluginAsync, FastifyInstance } from 'fastify'; + +import { + TokensRequestType, + TokensResponseType, + TokensRequestSchema, + TokensResponseSchema, +} from '../../../schemas/chain-schema'; +import { logger } from '../../../services/logger'; +import { Cardano } from '../cardano'; + +export async function getCardanoTokens( + fastify: FastifyInstance, + network: string, + tokenSymbols?: string[] | string, +): Promise { + try { + const cardano = await Cardano.getInstance(network); + let tokens = []; + + if (!tokenSymbols) { + tokens = cardano.tokenList; + } else { + const symbolsArray = Array.isArray(tokenSymbols) + ? tokenSymbols + : typeof tokenSymbols === 'string' + ? tokenSymbols.replace(/[\[\]]/g, '').split(',') + : []; + + for (const symbol of symbolsArray) { + const token = cardano.getTokenBySymbol(symbol.trim()); + if (token) tokens.push(token); + } + } + + return { tokens }; + } catch (error) { + logger.error(`Error getting tokens: ${error.message}`); + throw fastify.httpErrors.internalServerError(`Failed to get tokens: ${error.message}`); + } +} + +export const tokensRoute: FastifyPluginAsync = async (fastify) => { + fastify.get<{ + Querystring: TokensRequestType; + Reply: TokensResponseType; + }>( + '/tokens', + { + schema: { + description: 'Get list of supported Cardano tokens with their addresses and decimals', + tags: ['/chain/cardano'], + querystring: { + ...TokensRequestSchema, + properties: { + ...TokensRequestSchema.properties, + network: { type: 'string', default: 'preprod' }, + tokenSymbols: { type: 'array', items: { type: 'string' } }, + }, + }, + response: { + 200: TokensResponseSchema, + }, + }, + }, + async (request) => { + const { network, tokenSymbols } = request.query; + return await getCardanoTokens(fastify, network, tokenSymbols); + }, + ); +}; + +export default tokensRoute; diff --git a/src/config/routes/getChains.ts b/src/config/routes/getChains.ts index 1f22242f4f..bc59cd7d39 100644 --- a/src/config/routes/getChains.ts +++ b/src/config/routes/getChains.ts @@ -49,7 +49,7 @@ export const getChainsRoute: FastifyPluginAsync = async (fastify) => { const network = networkParts.join('-'); // Handle networks like mainnet-beta // Only process known chains - if (['ethereum', 'solana'].includes(chain)) { + if (['ethereum', 'solana', 'cardano'].includes(chain)) { if (!chainNetworks[chain]) { chainNetworks[chain] = []; } @@ -64,6 +64,9 @@ export const getChainsRoute: FastifyPluginAsync = async (fastify) => { if (!chainNetworks['solana']) { chainNetworks['solana'] = []; } + if (!chainNetworks['cardano']) { + chainNetworks['cardano'] = []; + } const chains = Object.entries(chainNetworks).map(([chain, networks]) => ({ chain, diff --git a/src/config/routes/getConnectors.ts b/src/config/routes/getConnectors.ts index aa2a8a7139..123a21070e 100644 --- a/src/config/routes/getConnectors.ts +++ b/src/config/routes/getConnectors.ts @@ -1,7 +1,9 @@ import { Type, Static } from '@sinclair/typebox'; import { FastifyPluginAsync } from 'fastify'; +import { MinswapConfig } from '#src/connectors/minswap/minswap.config'; import { PancakeswapConfig } from '#src/connectors/pancakeswap/pancakeswap.config'; +import { SundaeswapConfig } from '#src/connectors/sundaeswap/sundaeswap.config'; import { ZeroXConfig } from '../../connectors/0x/0x.config'; import { JupiterConfig } from '../../connectors/jupiter/jupiter.config'; @@ -63,6 +65,18 @@ export const connectorsConfig = [ chain: PancakeswapConfig.chain, networks: [...PancakeswapConfig.networks], }, + { + name: 'minswap', + trading_types: [...MinswapConfig.tradingTypes], + chain: MinswapConfig.chain, + networks: [...MinswapConfig.networks], + }, + { + name: 'sundaeswap', + trading_types: [...SundaeswapConfig.tradingTypes], + chain: SundaeswapConfig.chain, + networks: [...SundaeswapConfig.networks], + }, ]; export const getConnectorsRoute: FastifyPluginAsync = async (fastify) => { diff --git a/src/config/routes/updateConfig.ts b/src/config/routes/updateConfig.ts index a2bbd38b69..066fe42dcd 100644 --- a/src/config/routes/updateConfig.ts +++ b/src/config/routes/updateConfig.ts @@ -1,5 +1,7 @@ import { FastifyPluginAsync } from 'fastify'; +import { Cardano } from '#src/chains/cardano/cardano'; + import { ConfigManagerV2 } from '../../services/config-manager-v2'; import { logger } from '../../services/logger'; import { diff --git a/src/config/schemas.ts b/src/config/schemas.ts index 5617647241..dbc3f816ab 100644 --- a/src/config/schemas.ts +++ b/src/config/schemas.ts @@ -28,15 +28,23 @@ export const DefaultPoolRequestSchema = Type.Object({ connector: Type.String({ description: 'Connector name in format "connector/type" (e.g., raydium/amm, raydium/clmm, uniswap/amm, uniswap/clmm, meteora/clmm)', - examples: ['raydium/amm', 'raydium/clmm', 'uniswap/amm', 'uniswap/clmm', 'meteora/clmm'], + examples: [ + 'raydium/amm', + 'raydium/clmm', + 'uniswap/amm', + 'uniswap/clmm', + 'meteora/clmm', + 'minswap/amm', + 'sundaeswap/amm', + ], }), baseToken: Type.String({ description: 'Base token symbol', - examples: ['SOL', 'USDC', 'ETH', 'WETH'], + examples: ['SOL', 'USDC', 'ETH', 'WETH', 'ADA'], }), quoteToken: Type.String({ description: 'Quote token symbol', - examples: ['USDC', 'USDT', 'DAI', 'WETH'], + examples: ['USDC', 'USDT', 'DAI', 'WETH', 'MIN', 'SUNDAE'], }), poolAddress: Type.Optional( Type.String({ @@ -72,7 +80,7 @@ export const ConfigQuerySchema = Type.Object({ Type.String({ description: 'Optional configuration namespace (e.g., "server", "ethereum-mainnet", "solana-mainnet-beta", "uniswap")', - examples: ['server', 'ethereum-mainnet', 'solana-mainnet-beta', 'uniswap'], + examples: ['server', 'ethereum-mainnet', 'solana-mainnet-beta', 'uniswap', 'cardano-mainnet', 'cardano-preprod'], }), ), }); diff --git a/src/connectors/minswap/amm-routes/addLiquidity.ts b/src/connectors/minswap/amm-routes/addLiquidity.ts new file mode 100644 index 0000000000..d54ff1bf02 --- /dev/null +++ b/src/connectors/minswap/amm-routes/addLiquidity.ts @@ -0,0 +1,213 @@ +import { TxComplete } from '@aiquant/lucid-cardano'; +import { calculateDeposit, Dex } from '@aiquant/minswap-sdk'; +import { FastifyPluginAsync } from 'fastify'; + +import { CardanoToken } from '#src/tokens/types'; + +import { + AddLiquidityRequestType, + AddLiquidityRequest, + AddLiquidityResponseType, + AddLiquidityResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Minswap } from '../minswap'; + +import { getMinswapAmmLiquidityQuote } from './quoteLiquidity'; + +async function addLiquidity( + fastify: any, + network: string, + walletAddress: string, + poolAddress: string, + baseToken: CardanoToken, + quoteToken: CardanoToken, + baseTokenAmount: number, + quoteTokenAmount: number, + slippagePct?: number, +): Promise { + const networkToUse = network || 'mainnet'; + + // 1) Get quote for optimal amounts + const quote = await getMinswapAmmLiquidityQuote( + networkToUse, + poolAddress, + baseToken, + quoteToken, + baseTokenAmount, + quoteTokenAmount, + slippagePct, + ); + + // 2) Prepare Minswap + const minswap = await Minswap.getInstance(networkToUse); + const { cardano } = minswap; + + // 3) Ensure wallet key + const privateKey = await cardano.getWalletFromAddress(walletAddress); + if (!privateKey) { + throw fastify.httpErrors.badRequest('Wallet not found'); + } + cardano.lucidInstance.selectWalletFromPrivateKey(privateKey); + + // 4) Determine slippage + const slippage = slippagePct !== undefined ? slippagePct : minswap.getAllowedSlippage(); + + const { poolState, poolDatum } = await minswap.getPoolData(poolAddress); + if (!poolState) { + throw fastify.httpErrors.internalServerError('Pool state not found'); + } + + const { reserveA, reserveB } = poolState; + const { totalLiquidity, assetA, assetB } = poolDatum; + + // Use poolState asset IDs (which are already strings) + const baseTokenId = baseToken.symbol === 'ADA' ? 'lovelace' : baseToken.policyId + baseToken.assetName; + const quoteTokenId = quoteToken.symbol === 'ADA' ? 'lovelace' : quoteToken.policyId + quoteToken.assetName; + + const baseRaw = quote.rawBaseTokenAmount.toBigInt(); + const quoteRaw = quote.rawQuoteTokenAmount.toBigInt(); + + let depositedAmountA: bigint; + let depositedAmountB: bigint; + + // Use poolState.assetA and poolState.assetB (these are strings) + if (baseTokenId === poolState.assetA) { + // Base token is assetA, quote token is assetB + depositedAmountA = baseRaw; + depositedAmountB = quoteRaw; + } else if (baseTokenId === poolState.assetB) { + // Base token is assetB, quote token is assetA + depositedAmountA = quoteRaw; // Quote amount goes to assetA + depositedAmountB = baseRaw; // Base amount goes to assetB + } else { + throw new Error(`Base token ${baseToken.symbol} not found in pool`); + } + + // 6) Compute necessary amounts and LP tokens + const { necessaryAmountA, necessaryAmountB, lpAmount } = calculateDeposit({ + depositedAmountA, + depositedAmountB, + reserveA, + reserveB, + totalLiquidity, + }); + + // 7) Apply slippage to LP minimum + const minLP = (lpAmount * BigInt(Math.floor((1 - slippage) * 1e6))) / BigInt(1e6); + + // 8) Build tx - amounts are already correctly mapped to assetA/assetB + const dex = new Dex(cardano.lucidInstance); + const utxos = await cardano.lucidInstance.utxosAt(walletAddress); + + const txBuild: TxComplete = await dex.buildDepositTx({ + assetA, + assetB, + amountA: necessaryAmountA, + amountB: necessaryAmountB, + minimumLPReceived: minLP, + sender: walletAddress, + availableUtxos: utxos, + }); + + // 9) Sign & submit + const signed = await txBuild.sign().complete(); + const txHash = await signed.submit(); + + return { + signature: txHash, + status: 1, + data: { + fee: txBuild.fee, + baseTokenAmountAdded: quote.baseTokenAmount, + quoteTokenAmountAdded: quote.quoteTokenAmount, + }, + }; +} + +export const addLiquidityRoute: FastifyPluginAsync = async (fastify) => { + await fastify.register(require('@fastify/sensible')); + fastify.post<{ + Body: AddLiquidityRequestType; + Reply: AddLiquidityResponseType; + }>( + '/add-liquidity', + { + schema: { + description: 'Add liquidity to a Minswap pool', + tags: ['/connector/minswap/amm'], + body: { + ...AddLiquidityRequest, + properties: { + ...AddLiquidityRequest.properties, + network: { type: 'string', default: 'mainnet' }, + walletAddress: { type: 'string', examples: ['addr...'] }, + poolAddress: { type: 'string', examples: [''] }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['MIN'] }, + baseTokenAmount: { type: 'number', examples: [0.001] }, + quoteTokenAmount: { type: 'number', examples: [2.5] }, + slippagePct: { type: 'number', examples: [1] }, + }, + }, + response: { 200: AddLiquidityResponse }, + }, + }, + async (request) => { + try { + const { + network, + poolAddress: reqPool, + baseTokenAmount, + quoteTokenAmount, + slippagePct, + walletAddress: reqWallet, + } = request.body; + + if (!baseTokenAmount || !quoteTokenAmount) { + throw fastify.httpErrors.badRequest('Missing parameters'); + } + + const minswap = await Minswap.getInstance(network || 'mainnet'); + const walletAddr = reqWallet || (await minswap.cardano.getFirstWalletAddress()); + if (!walletAddr) { + throw fastify.httpErrors.badRequest('No wallet address'); + } + + // Check if poolAddress is provided + if (!reqPool) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); + } + + const poolInfo = await minswap.getAmmPoolInfo(reqPool); + + const baseTokenAddress = poolInfo.baseTokenAddress; + + const quoteTokenAddress = poolInfo.quoteTokenAddress; + + // Find token symbol from token address + const baseToken = await minswap.cardano.getTokenByAddress(baseTokenAddress); + + const quoteToken = await minswap.cardano.getTokenByAddress(quoteTokenAddress); + + return await addLiquidity( + fastify, + network || 'mainnet', + walletAddr, + reqPool, + baseToken, + quoteToken, + baseTokenAmount, + quoteTokenAmount, + slippagePct !== undefined ? slippagePct / 100 : undefined, // convert % to decimal + ); + } catch (e: any) { + logger.error(e); + if (e.statusCode) throw e; + throw fastify.httpErrors.internalServerError('Failed to add liquidity'); + } + }, + ); +}; + +export default addLiquidityRoute; diff --git a/src/connectors/minswap/amm-routes/executeSwap.ts b/src/connectors/minswap/amm-routes/executeSwap.ts new file mode 100644 index 0000000000..eb9421d58d --- /dev/null +++ b/src/connectors/minswap/amm-routes/executeSwap.ts @@ -0,0 +1,203 @@ +import { TxComplete } from '@aiquant/lucid-cardano'; +import { ADA, Asset, Dex, calculateSwapExactIn, calculateSwapExactOut } from '@aiquant/minswap-sdk'; +import { FastifyPluginAsync } from 'fastify'; + +import { + ExecuteSwapRequestType, + SwapExecuteResponseType, + SwapExecuteResponse, + ExecuteSwapRequest, +} from '../../../schemas/router-schema'; +import { logger } from '../../../services/logger'; +import { Minswap } from '../minswap'; +import { formatTokenAmount } from '../minswap.utils'; + +export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { + await fastify.register(require('@fastify/sensible')); + + fastify.post<{ + Body: ExecuteSwapRequestType; + Reply: SwapExecuteResponseType; + }>( + '/execute-swap', + { + schema: { + description: 'Execute a swap on Minswap AMM (Cardano)', + tags: ['/connector/minswap/amm'], + body: { + ...ExecuteSwapRequest, + properties: { + ...ExecuteSwapRequest.properties, + network: { type: 'string', default: 'mainnet' }, + walletAddress: { type: 'string' }, + baseToken: { type: 'string', examples: ['MIN'] }, + quoteToken: { type: 'string', examples: ['ADA'] }, + amount: { type: 'number', examples: [10000] }, // now always BASE token amount + side: { type: 'string', enum: ['BUY', 'SELL'] }, + poolAddress: { type: 'string' }, + slippagePct: { type: 'number', examples: [1] }, + }, + }, + response: { 200: SwapExecuteResponse }, + }, + }, + async (request) => { + try { + const { + network, + walletAddress: reqAddr, + baseToken, + quoteToken, + amount, // this is always BASE token quantity + side, + slippagePct = 1, + } = request.body; + + const net = network || 'mainnet'; + const minswap = await Minswap.getInstance(net); + + const walletAddr = reqAddr || (await minswap.cardano.getFirstWalletAddress()); + if (!walletAddr) { + throw fastify.httpErrors.badRequest('No wallet address provided'); + } + + const poolAddr = await minswap.findDefaultPool(baseToken, quoteToken, 'amm'); + + if (!poolAddr) { + throw fastify.httpErrors.notFound(`Pool not found for ${baseToken}-${quoteToken}`); + } + + const baseInfo = minswap.cardano.getTokenBySymbol(baseToken)!; + const quoteInfo = minswap.cardano.getTokenBySymbol(quoteToken)!; + + // Build Assets + const assetA: Asset = { + policyId: baseInfo.policyId, + tokenName: baseInfo.assetName, + }; + const assetB: Asset = { + policyId: quoteInfo.policyId, + tokenName: quoteInfo.assetName, + }; + + const { poolState } = await minswap.getPoolData(poolAddr); + if (!poolState) { + throw fastify.httpErrors.notFound('Pool state unavailable'); + } + + // Determine reserves based on input/output tokens, not base/quote + const exactIn = side === 'SELL'; + const [inputToken, outputToken] = exactIn ? [baseToken, quoteToken] : [quoteToken, baseToken]; + const [inputInfo, outputInfo] = exactIn ? [baseInfo, quoteInfo] : [quoteInfo, baseInfo]; + + // Determine reserves based on actual input token + const inputAssetId = inputToken === 'ADA' ? 'lovelace' : inputInfo.policyId + inputInfo.assetName; + const idA = poolState.assetA; + const idB = poolState.assetB; + + let reserveIn: bigint, reserveOut: bigint; + if (inputAssetId === idA) { + reserveIn = poolState.reserveA; + reserveOut = poolState.reserveB; + } else if (inputAssetId === idB) { + reserveIn = poolState.reserveB; + reserveOut = poolState.reserveA; + } else { + throw new Error(`Input token not in pool`); + } + + const pct = BigInt(slippagePct); + + const privateKey = await minswap.cardano.getWalletFromAddress(walletAddr); + minswap.cardano.lucidInstance.selectWalletFromPrivateKey(privateKey); + const dex = new Dex(minswap.cardano.lucidInstance); + + let txBuild: TxComplete; + let baseAmountChange: number; + let quoteAmountChange: number; + let totalInputSwapped: number; + let totalOutputSwapped: number; + + if (side === 'SELL') { + // SELL = selling BASE tokens to get QUOTE tokens + // `amount` is the amount of base tokens to sell (input) + const amountIn = BigInt(Math.floor(amount * 10 ** baseInfo.decimals).toString()); + + const { amountOut: idealQuoteOut } = calculateSwapExactIn({ + amountIn, + reserveIn, + reserveOut, + }); + const minQuoteOut = (idealQuoteOut * (100n - pct)) / 100n; + + txBuild = await dex.buildSwapExactInTx({ + sender: walletAddr, + availableUtxos: await minswap.cardano.lucidInstance.utxosAt(walletAddr), + assetIn: baseToken === 'ADA' ? ADA : assetA, + amountIn, + assetOut: quoteToken === 'ADA' ? ADA : assetB, + minimumAmountOut: minQuoteOut, + isLimitOrder: false, + }); + + // SELL: spending base tokens (-), receiving quote tokens (+) + baseAmountChange = -Number(amount); + quoteAmountChange = +Number(formatTokenAmount(minQuoteOut.toString(), quoteInfo.decimals)); + totalInputSwapped = amount; // base tokens spent + totalOutputSwapped = Number(formatTokenAmount(minQuoteOut.toString(), quoteInfo.decimals)); // quote tokens received + } else { + // BUY = buying BASE tokens with QUOTE tokens + // `amount` is the amount of base tokens to buy (output) + const exactBaseOut = BigInt(Math.floor(amount * 10 ** baseInfo.decimals).toString()); + + const { amountIn: idealQuoteIn } = calculateSwapExactOut({ + exactAmountOut: exactBaseOut, + reserveIn, + reserveOut, + }); + + const maxQuoteIn = (idealQuoteIn * (100n + pct)) / 100n; + + txBuild = await dex.buildSwapExactOutTx({ + sender: walletAddr, + availableUtxos: await minswap.cardano.lucidInstance.utxosAt(walletAddr), + assetIn: quoteToken === 'ADA' ? ADA : assetB, + maximumAmountIn: maxQuoteIn, + assetOut: baseToken === 'ADA' ? ADA : assetA, + expectedAmountOut: exactBaseOut, + }); + + // BUY: spending quote tokens (-), receiving base tokens (+) + quoteAmountChange = -Number(formatTokenAmount(maxQuoteIn.toString(), quoteInfo.decimals)); + baseAmountChange = +Number(amount); + totalInputSwapped = Number(formatTokenAmount(maxQuoteIn.toString(), quoteInfo.decimals)); // quote tokens spent + totalOutputSwapped = amount; // base tokens received + } + + const signed = await txBuild.sign().complete(); + const txHash = await signed.submit(); + + // Return correct token addresses and amounts + return { + signature: txHash, + status: 1, + data: { + tokenIn: side === 'SELL' ? baseToken : quoteToken, + tokenOut: side === 'SELL' ? quoteToken : baseToken, + amountIn: totalInputSwapped, + amountOut: totalOutputSwapped, + fee: txBuild.fee, + baseTokenBalanceChange: baseAmountChange, + quoteTokenBalanceChange: quoteAmountChange, + }, + }; + } catch (err: any) { + logger.error('Swap failed:', err); + if (err.statusCode) throw err; + throw fastify.httpErrors.internalServerError(`Swap execution error: ${err.message}`); + } + }, + ); +}; + +export default executeSwapRoute; diff --git a/src/connectors/minswap/amm-routes/poolInfo.ts b/src/connectors/minswap/amm-routes/poolInfo.ts new file mode 100644 index 0000000000..ed196b28a3 --- /dev/null +++ b/src/connectors/minswap/amm-routes/poolInfo.ts @@ -0,0 +1,55 @@ +import { FastifyPluginAsync } from 'fastify'; + +import { GetPoolInfoRequestType, GetPoolInfoRequest, PoolInfo, PoolInfoSchema } from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Minswap } from '../minswap'; + +export const ammPoolInfoRoute: FastifyPluginAsync = async (fastify) => { + fastify.get<{ + Querystring: GetPoolInfoRequestType; + Reply: Record; + }>( + '/pool-info', + { + schema: { + description: 'Get AMM pool information from Minswap', + tags: ['/connector/minswap/amm'], + querystring: { + ...GetPoolInfoRequest, + properties: { + network: { type: 'string', examples: ['mainnet'] }, + poolAddress: { + type: 'string', + examples: ['6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2'], + }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['MIN'] }, + }, + }, + response: { + 200: PoolInfoSchema, + }, + }, + }, + async (request): Promise => { + try { + const { poolAddress } = request.query; + const network = request.query.network || 'mainnet'; + + const minswap = await Minswap.getInstance(network); + + // Check if either poolAddress is provided + if (!poolAddress) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); + } + + const poolInfo = await minswap.getAmmPoolInfo(poolAddress); + if (!poolInfo) throw fastify.httpErrors.notFound('Pool not found'); + return poolInfo; + } catch (e) { + logger.error(e); + throw fastify.httpErrors.internalServerError('Failed to fetch pool info'); + } + }, + ); +}; diff --git a/src/connectors/minswap/amm-routes/quoteLiquidity.ts b/src/connectors/minswap/amm-routes/quoteLiquidity.ts new file mode 100644 index 0000000000..298e46d7a4 --- /dev/null +++ b/src/connectors/minswap/amm-routes/quoteLiquidity.ts @@ -0,0 +1,223 @@ +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync } from 'fastify'; + +import { CardanoToken } from '#src/tokens/types'; + +import { + QuoteLiquidityRequestType, + QuoteLiquidityRequest, + QuoteLiquidityResponseType, + QuoteLiquidityResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Minswap } from '../minswap'; +import { formatTokenAmount } from '../minswap.utils'; + +export async function getMinswapAmmLiquidityQuote( + network: string, + poolAddress?: string, + baseToken?: CardanoToken, + quoteToken?: CardanoToken, + baseTokenAmount?: number, + quoteTokenAmount?: number, + _slippagePct?: number, +): Promise<{ + baseLimited: boolean; + baseTokenAmount: number; + quoteTokenAmount: number; + baseTokenAmountMax: number; + quoteTokenAmountMax: number; + baseTokenObj: CardanoToken; + quoteTokenObj: CardanoToken; + poolAddress?: string; + rawBaseTokenAmount: BigNumber; + rawQuoteTokenAmount: BigNumber; + routerAddress: string; +}> { + const networkToUse = network || 'mainnet'; + + if (!baseToken || !quoteToken) { + throw new Error('Base token and quote token are required'); + } + if (baseTokenAmount === undefined && quoteTokenAmount === undefined) { + throw new Error('At least one token amount must be provided'); + } + + const minswap = await Minswap.getInstance(networkToUse); + + let poolAddressToUse = poolAddress; + let existingPool = true; + if (!poolAddressToUse) { + poolAddressToUse = await minswap.findDefaultPool(baseToken.symbol, quoteToken.symbol, 'amm'); + if (!poolAddressToUse) { + existingPool = false; + logger.info(`No existing pool found for ${baseToken}-${quoteToken}, providing theoretical quote`); + } + } + + let baseTokenAmountOptimal = baseTokenAmount!; + let quoteTokenAmountOptimal = quoteTokenAmount!; + let baseLimited = false; + + if (existingPool) { + const { poolState, poolDatum } = await minswap.getPoolData(poolAddressToUse); + + if (!poolState) { + throw new Error(`Unable to load pool ${poolAddressToUse}`); + } + + // Map reserves based on actual token addresses + const baseTokenId = baseToken.symbol === 'ADA' ? 'lovelace' : baseToken.policyId + baseToken.assetName; + const quoteTokenId = quoteToken.symbol === 'ADA' ? 'lovelace' : quoteToken.policyId + quoteToken.assetName; + + let baseReserve: bigint; + let quoteReserve: bigint; + + if (baseTokenId === poolState.assetA) { + baseReserve = poolState.reserveA; + quoteReserve = poolState.reserveB; + } else if (baseTokenId === poolState.assetB) { + baseReserve = poolState.reserveB; + quoteReserve = poolState.reserveA; + } else { + throw new Error(`Base token ${baseToken.symbol} not found in pool`); + } + + // Convert user inputs into raw bigints + const baseRaw = baseTokenAmount ? BigInt(Math.floor(baseTokenAmount * 10 ** baseToken.decimals).toString()) : null; + const quoteRaw = quoteTokenAmount + ? BigInt(Math.floor(quoteTokenAmount * 10 ** quoteToken.decimals).toString()) + : null; + + // Compute the "optimal" opposite amount + if (baseRaw !== null && quoteRaw !== null) { + // both sides provided → pick the limiting one + const quoteOptimal = (baseRaw * quoteReserve) / baseReserve; + if (quoteOptimal <= quoteRaw) { + baseLimited = true; + quoteTokenAmountOptimal = Number(formatTokenAmount(quoteOptimal.toString(), quoteToken.decimals)); + } else { + baseLimited = false; + const baseOptimal = (quoteRaw * baseReserve) / quoteReserve; + baseTokenAmountOptimal = Number(formatTokenAmount(baseOptimal.toString(), baseToken.decimals)); + } + } else if (baseRaw !== null) { + // only base provided + const quoteOptimal = baseReserve === BigInt(0) ? BigInt(0) : (baseRaw * quoteReserve) / baseReserve; + quoteTokenAmountOptimal = Number(formatTokenAmount(quoteOptimal.toString(), quoteToken.decimals)); + baseLimited = true; + } else if (quoteRaw !== null) { + // only quote provided + const baseOptimal = quoteReserve === BigInt(0) ? BigInt(0) : (quoteRaw * baseReserve) / quoteReserve; + baseTokenAmountOptimal = Number(formatTokenAmount(baseOptimal.toString(), baseToken.decimals)); + baseLimited = false; + } + } else { + // new pool → must supply both + if (baseTokenAmount == null || quoteTokenAmount == null) { + throw new Error('For a new pool, you must supply both baseTokenAmount and quoteTokenAmount'); + } + baseLimited = false; // arbitrary; both get used + } + + // Convert back into Ethers BigNumber for any on‐chain tx + const rawBaseTokenAmount = BigNumber.from(Math.floor(baseTokenAmountOptimal * 10 ** baseToken.decimals).toString()); + const rawQuoteTokenAmount = BigNumber.from( + Math.floor(quoteTokenAmountOptimal * 10 ** quoteToken.decimals).toString(), + ); + + return { + baseLimited, + baseTokenAmount: baseTokenAmountOptimal, + quoteTokenAmount: quoteTokenAmountOptimal, + baseTokenAmountMax: baseTokenAmount ?? baseTokenAmountOptimal, + quoteTokenAmountMax: quoteTokenAmount ?? quoteTokenAmountOptimal, + baseTokenObj: baseToken, + quoteTokenObj: quoteToken, + poolAddress: poolAddressToUse, + rawBaseTokenAmount, + rawQuoteTokenAmount, + routerAddress: 'N/A', + }; +} + +export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { + await fastify.register(require('@fastify/sensible')); + fastify.get<{ + Querystring: QuoteLiquidityRequestType; + Reply: QuoteLiquidityResponseType; + }>( + '/quote-liquidity', + { + schema: { + description: 'Get liquidity quote for Minswap', + tags: ['/connector/minswap/amm'], + querystring: { + ...QuoteLiquidityRequest, + properties: { + ...QuoteLiquidityRequest.properties, + network: { type: 'string', default: 'mainnet' }, + poolAddress: { + type: 'string', + examples: [''], + }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['MIN'] }, + baseTokenAmount: { type: 'number', examples: [0.029314] }, + quoteTokenAmount: { type: 'number', examples: [1] }, + slippagePct: { type: 'number', examples: [1] }, + }, + }, + response: { + 200: QuoteLiquidityResponse, + }, + }, + }, + async (request) => { + try { + const { network, poolAddress, baseTokenAmount, quoteTokenAmount, slippagePct } = request.query; + + const minswap = await Minswap.getInstance(network); + + // Check if poolAddress is provided + if (!poolAddress) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); + } + + const poolInfo = await minswap.getAmmPoolInfo(poolAddress); + + const baseTokenAddress = poolInfo.baseTokenAddress; + const quoteTokenAddress = poolInfo.quoteTokenAddress; + // Find token symbol from token address + const baseToken = await minswap.cardano.getTokenByAddress(baseTokenAddress); + const quoteToken = await minswap.cardano.getTokenByAddress(quoteTokenAddress); + + const quote = await getMinswapAmmLiquidityQuote( + network, + poolAddress, + baseToken, + quoteToken, + baseTokenAmount, + quoteTokenAmount, + slippagePct, + ); + + return { + baseLimited: quote.baseLimited, + baseTokenAmount: quote.baseTokenAmount, + quoteTokenAmount: quote.quoteTokenAmount, + baseTokenAmountMax: quote.baseTokenAmountMax, + quoteTokenAmountMax: quote.quoteTokenAmountMax, + }; + } catch (e) { + logger.error(e); + if (e.statusCode) { + throw e; + } + throw fastify.httpErrors.internalServerError('Failed to get liquidity quote'); + } + }, + ); +}; + +export default quoteLiquidityRoute; diff --git a/src/connectors/minswap/amm-routes/quoteSwap.ts b/src/connectors/minswap/amm-routes/quoteSwap.ts new file mode 100644 index 0000000000..b7d9784af8 --- /dev/null +++ b/src/connectors/minswap/amm-routes/quoteSwap.ts @@ -0,0 +1,350 @@ +import { Asset, calculateSwapExactIn, calculateSwapExactOut } from '@aiquant/minswap-sdk'; +import { BN } from 'bn.js'; +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync, FastifyInstance } from 'fastify'; + +import { CardanoToken } from '#src/tokens/types'; + +import { Cardano } from '../../../chains/cardano/cardano'; +// NEW - v2.8 schema structure +import { + QuoteSwapRequestType, + QuoteSwapResponseType, + QuoteSwapRequest, + QuoteSwapResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Minswap } from '../minswap'; +import { formatTokenAmount } from '../minswap.utils'; + +async function quoteAmmSwap( + minswap: Minswap, + poolAddress: string, + baseToken: CardanoToken, + quoteToken: CardanoToken, + amount: number, + side: 'BUY' | 'SELL', + _slippagePct?: number, +): Promise { + const exactIn = side === 'SELL'; + + const [inputToken, outputToken] = exactIn ? [baseToken, quoteToken] : [quoteToken, baseToken]; + + let amountInSmallestUnit: bigint; + if (exactIn) { + // SELL: amount is in baseToken units, inputToken is baseToken + amountInSmallestUnit = BigNumber.from(Math.floor(amount * 10 ** baseToken.decimals)).toBigInt(); + } else { + // BUY: amount is in baseToken units, outputToken is baseToken + amountInSmallestUnit = BigNumber.from(Math.floor(amount * 10 ** baseToken.decimals)).toBigInt(); + } + + // Rest of your pool logic... + const { poolState, poolDatum } = await minswap.getPoolData(poolAddress); + if (!poolState) throw new Error(`Pool not found for ${baseToken.symbol}-${quoteToken.symbol}`); + + // Figure out reserves + const idA = poolState.assetA; + const idB = poolState.assetB; + const assetIdIn = inputToken.symbol === 'ADA' ? 'lovelace' : inputToken.policyId + inputToken.assetName; + + let reserveIn: bigint, reserveOut: bigint; + if (assetIdIn === idA) { + reserveIn = poolState.reserveA; + reserveOut = poolState.reserveB; + } else if (assetIdIn === idB) { + reserveIn = poolState.reserveB; + reserveOut = poolState.reserveA; + } else { + throw new Error(`Input token not in pool`); + } + + // Calculate swap amounts + let inputAmount: bigint, outputAmount: bigint, priceImpact: number; + if (exactIn) { + // SELL: spending exact amount of baseToken + inputAmount = amountInSmallestUnit; + const { amountOut, priceImpact: pi } = calculateSwapExactIn({ + amountIn: inputAmount, + reserveIn, + reserveOut, + }); + outputAmount = amountOut; + priceImpact = pi.toNumber(); + } else { + // BUY: want to receive exact amount of baseToken + outputAmount = amountInSmallestUnit; + const { amountIn, priceImpact: pi } = calculateSwapExactOut({ + exactAmountOut: outputAmount, + reserveIn, + reserveOut, + }); + inputAmount = amountIn; + priceImpact = pi.toNumber(); + } + + // Format amounts + const estimatedIn = formatTokenAmount(inputAmount.toString(), inputToken.decimals); + const estimatedOut = formatTokenAmount(outputAmount.toString(), outputToken.decimals); + + // Return with proper token references + return { + poolAddress, + estimatedAmountIn: estimatedIn, + estimatedAmountOut: estimatedOut, + inputToken, + outputToken, + // FIXED: Simple path addresses like Uniswap + pathAddresses: [inputToken.address, outputToken.address], + }; +} + +export async function getMinswapAmmQuote( + _fastify: FastifyInstance, + network: string, + poolAddress: string, + baseToken: string, + quoteToken: string, + amount: number, + side: 'BUY' | 'SELL', + slippagePct?: number, +): Promise<{ + quote: any; + minswap: any; + cardano: any; + baseTokenObj: any; + quoteTokenObj: any; +}> { + // Get instances + const minswap = await Minswap.getInstance(network); + const cardano = await Cardano.getInstance(network); + + if (!cardano.ready()) { + logger.info('Cardano instance not ready, initializing...'); + // await cardano.init(); + } + + // Resolve tokens + const baseTokenObj = cardano.getTokenBySymbol(baseToken); + const quoteTokenObj = cardano.getTokenBySymbol(quoteToken); + + if (!baseTokenObj) { + logger.error(`Base token not found: ${baseToken}`); + throw new Error(`Base token not found: ${baseToken}`); + } + + if (!quoteTokenObj) { + logger.error(`Quote token not found: ${quoteToken}`); + throw new Error(`Quote token not found: ${quoteToken}`); + } + + logger.info(`Base token: ${baseTokenObj.symbol}, address=${baseTokenObj.address}, decimals=${baseTokenObj.decimals}`); + logger.info( + `Quote token: ${quoteTokenObj.symbol}, address=${quoteTokenObj.address}, decimals=${quoteTokenObj.decimals}`, + ); + + // Get the quote + const quote = await quoteAmmSwap( + minswap, + poolAddress, + baseTokenObj, + quoteTokenObj, + amount, + side as 'BUY' | 'SELL', + slippagePct, + ); + + if (!quote) { + throw new Error('Failed to get swap quote'); + } + + return { + quote, + minswap, + cardano, + baseTokenObj, + quoteTokenObj, + }; +} + +async function formatSwapQuote( + fastify: FastifyInstance, + network: string, + poolAddress: string, + baseToken: string, + quoteToken: string, + amount: number, + side: 'BUY' | 'SELL', + slippagePct?: number, +): Promise { + logger.info( + `formatSwapQuote: poolAddress=${poolAddress}, baseToken=${baseToken}, quoteToken=${quoteToken}, amount=${amount}, side=${side}, network=${network}`, + ); + + try { + // Use the extracted quote function + const { quote, minswap, cardano, baseTokenObj, quoteTokenObj } = await getMinswapAmmQuote( + fastify, + network, + poolAddress, + baseToken, + quoteToken, + amount, + side, + slippagePct, + ); + + logger.info( + `Quote result: estimatedAmountIn=${quote.estimatedAmountIn}, estimatedAmountOut=${quote.estimatedAmountOut}`, + ); + + // Calculate balance changes based on which tokens are being swapped + // The quote object tells us which token is input and which is output + let baseTokenBalanceChange: number; + let quoteTokenBalanceChange: number; + + if (side === 'SELL') { + // SELL: spending quoteToken, receiving baseToken + // Input token is quoteToken, output token is baseToken + baseTokenBalanceChange = quote.estimatedAmountOut; // positive (receiving) + quoteTokenBalanceChange = -quote.estimatedAmountIn; // negative (spending) + } else { + // BUY: spending baseToken, receiving quoteToken + // Input token is baseToken, output token is quoteToken + baseTokenBalanceChange = -quote.estimatedAmountIn; // negative (spending) + quoteTokenBalanceChange = quote.estimatedAmountOut; // positive (receiving) + } + + logger.info( + `Balance changes: baseTokenBalanceChange=${baseTokenBalanceChange}, quoteTokenBalanceChange=${quoteTokenBalanceChange}`, + ); + + // Calculate price based on side + // For SELL: price = quote received / base sold + // For BUY: price = quote needed / base received + const price = + side === 'SELL' + ? quote.estimatedAmountOut / quote.estimatedAmountIn + : quote.estimatedAmountIn / quote.estimatedAmountOut; + + return { + // Base QuoteSwapResponse fields (matching Uniswap structure) + poolAddress, + tokenIn: quote.inputToken.address || `${quote.inputToken.policyId}.${quote.inputToken.assetName}`, + tokenOut: quote.outputToken.address || `${quote.outputToken.policyId}.${quote.outputToken.assetName}`, + amountIn: quote.estimatedAmountIn, + amountOut: quote.estimatedAmountOut, + price, + slippagePct: slippagePct || 1, + minAmountOut: quote.minAmountOut, + maxAmountIn: quote.maxAmountIn, + // AMM-specific fields + priceImpactPct: quote.priceImpact, + }; + } catch (error) { + logger.error(`Error formatting swap quote: ${error.message}`); + if (error.stack) { + logger.debug(`Stack trace: ${error.stack}`); + } + throw error; + } +} + +export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { + // Import the httpErrors plugin to ensure it's available + await fastify.register(require('@fastify/sensible')); + + fastify.get<{ + Querystring: QuoteSwapRequestType; + Reply: QuoteSwapResponseType; + }>( + '/quote-swap', + { + schema: { + description: 'Get swap quote for Minswap AMM', + tags: ['/connector/minswap/amm'], + querystring: { + ...QuoteSwapRequest, + properties: { + ...QuoteSwapRequest.properties, + network: { type: 'string', default: 'mainnet' }, + baseToken: { type: 'string', examples: ['MIN'] }, + quoteToken: { type: 'string', examples: ['ADA'] }, + amount: { type: 'number', examples: [1000] }, + side: { type: 'string', enum: ['BUY', 'SELL'], examples: ['BUY'] }, + poolAddress: { type: 'string', examples: ['addr'] }, + slippagePct: { type: 'number', examples: [1] }, + }, + }, + response: { + 200: { + properties: { + ...QuoteSwapResponse.properties, + }, + }, + }, + }, + }, + async (request) => { + try { + const { + network, + poolAddress: requestedPoolAddress, + baseToken, + quoteToken, + amount, + side, + slippagePct, + } = request.query; + + const networkToUse = network || 'mainnet'; + + const minswap = await Minswap.getInstance(networkToUse); + let poolAddress = requestedPoolAddress; + + if (!poolAddress) { + // Look up the pool from configuration pools dictionary + poolAddress = await minswap.findDefaultPool(baseToken, quoteToken, 'amm'); + + if (!poolAddress) { + throw fastify.httpErrors.notFound(`No AMM pool found for pair ${baseToken}-${quoteToken}`); + } + } + + return await formatSwapQuote( + fastify, + networkToUse, + poolAddress, + baseToken, + quoteToken, + amount, + side as 'BUY' | 'SELL', + slippagePct, + ); + } catch (e) { + logger.error(`Error in quote-swap route: ${e.message}`); + + // If it's already a Fastify HTTP error, re-throw it + if (e.statusCode) { + throw e; + } + + // Check for specific error types + if (e.message?.includes('Insufficient liquidity')) { + throw fastify.httpErrors.badRequest(e.message); + } + if (e.message?.includes('Pool not found') || e.message?.includes('No AMM pool found')) { + throw fastify.httpErrors.notFound(e.message); + } + if (e.message?.includes('token not found')) { + throw fastify.httpErrors.badRequest(e.message); + } + + // Default to internal server error with the actual error message + throw fastify.httpErrors.internalServerError(`Error getting swap quote: ${e.message || 'Unknown error'}`); + } + }, + ); +}; + +export default quoteSwapRoute; diff --git a/src/connectors/minswap/amm-routes/removeLiquidity.ts b/src/connectors/minswap/amm-routes/removeLiquidity.ts new file mode 100644 index 0000000000..f18533af32 --- /dev/null +++ b/src/connectors/minswap/amm-routes/removeLiquidity.ts @@ -0,0 +1,165 @@ +import { Asset, calculateWithdraw, Dex } from '@aiquant/minswap-sdk'; +import { FastifyPluginAsync } from 'fastify'; + +import { + RemoveLiquidityRequestType, + RemoveLiquidityRequest, + RemoveLiquidityResponseType, + RemoveLiquidityResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Minswap } from '../minswap'; +import { formatTokenAmount } from '../minswap.utils'; + +export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { + fastify.post<{ + Body: RemoveLiquidityRequestType; + Reply: RemoveLiquidityResponseType; + }>( + '/remove-liquidity', + { + schema: { + description: 'Remove liquidity from a Minswap pool', + tags: ['/connector/minswap/amm'], + body: { + ...RemoveLiquidityRequest, + properties: { + ...RemoveLiquidityRequest.properties, + network: { type: 'string', default: 'preprod' }, + walletAddress: { type: 'string', examples: ['addr...'] }, + poolAddress: { type: 'string', examples: [''] }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['MIN'] }, + percentageToRemove: { type: 'number', examples: [100] }, + }, + }, + response: { 200: RemoveLiquidityResponse }, + }, + }, + async (request) => { + try { + const { + network, + poolAddress: requestedPoolAddress, + percentageToRemove, + walletAddress: requestedWalletAddress, + } = request.body; + + const networkToUse = network || 'preprod'; + + if (percentageToRemove <= 0 || percentageToRemove > 100) { + throw fastify.httpErrors.badRequest('Percentage to remove must be between 0 and 100'); + } + + const minswap = await Minswap.getInstance(networkToUse); + + let walletAddress = requestedWalletAddress; + if (!walletAddress) { + walletAddress = await minswap.cardano.getFirstWalletAddress(); + if (!walletAddress) { + throw fastify.httpErrors.badRequest('No wallet address provided and no default wallet found'); + } + logger.info(`Using first available wallet address: ${walletAddress}`); + } + + if (!requestedPoolAddress) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); + } + + const poolInfo = await minswap.getAmmPoolInfo(requestedPoolAddress); + + const baseTokenAddress = poolInfo.baseTokenAddress; + const quoteTokenAddress = poolInfo.quoteTokenAddress; + + const baseToken = await minswap.cardano.getTokenByAddress(baseTokenAddress); + const quoteToken = await minswap.cardano.getTokenByAddress(quoteTokenAddress); + + if (!baseToken || !quoteToken) { + throw fastify.httpErrors.badRequest(`Token not found: ${!baseToken ? 'base' : 'quote'}`); + } + + let poolAddress = requestedPoolAddress; + if (!poolAddress) { + poolAddress = await minswap.findDefaultPool(baseToken.symbol, quoteToken.symbol, 'amm'); + if (!poolAddress) { + throw fastify.httpErrors.notFound(`No AMM pool found for pair ${baseToken.symbol}-${quoteToken.symbol}`); + } + } + + // Fetch on-chain pool state + const { poolState, poolDatum } = await minswap.getPoolData(poolAddress); + + // Setup wallet + const wallet = await minswap.cardano.getWalletFromAddress(walletAddress); + minswap.cardano.lucidInstance.selectWalletFromPrivateKey(wallet); + const utxos = await minswap.cardano.lucidInstance.utxosAt(walletAddress); + + // Calculate withdrawal amounts + const totalLpInWallet = minswap.calculateAssetAmount(utxos, poolState.assetLP); + const withdrawLpAmount = (totalLpInWallet * BigInt(percentageToRemove)) / 100n; + + // Calculate the assets to be received upon withdrawal + const { amountAReceive, amountBReceive } = calculateWithdraw({ + withdrawalLPAmount: withdrawLpAmount, + reserveA: poolState.reserveA, + reserveB: poolState.reserveB, + totalLiquidity: poolDatum.totalLiquidity, + }); + + // Build withdrawal transaction + const lpAsset = Asset.fromString(poolState.assetLP); + const dex = new Dex(minswap.cardano.lucidInstance); + const txBuild = await dex.buildWithdrawTx({ + sender: walletAddress, + lpAsset: lpAsset, + lpAmount: withdrawLpAmount, + minimumAssetAReceived: amountAReceive, + minimumAssetBReceived: amountBReceive, + availableUtxos: utxos, + }); + + // Sign & submit + const signed = await txBuild.sign().complete(); + const txHash = await signed.submit(); + const fee = txBuild.fee; + + // Map withdrawal amounts based on actual asset positions + const baseTokenId = baseToken.symbol === 'ADA' ? 'lovelace' : baseToken.policyId + baseToken.assetName; + const quoteTokenId = quoteToken.symbol === 'ADA' ? 'lovelace' : quoteToken.policyId + quoteToken.assetName; + + let baseTokenAmountRemoved: number; + let quoteTokenAmountRemoved: number; + + if (baseTokenId === poolState.assetA) { + // Base token is assetA, quote token is assetB + baseTokenAmountRemoved = Number(formatTokenAmount(amountAReceive.toString(), baseToken.decimals)); + quoteTokenAmountRemoved = Number(formatTokenAmount(amountBReceive.toString(), quoteToken.decimals)); + } else if (baseTokenId === poolState.assetB) { + // Base token is assetB, quote token is assetA + baseTokenAmountRemoved = Number(formatTokenAmount(amountBReceive.toString(), baseToken.decimals)); + quoteTokenAmountRemoved = Number(formatTokenAmount(amountAReceive.toString(), quoteToken.decimals)); + } else { + throw new Error(`Base token ${baseToken.symbol} not found in pool`); + } + + return { + signature: txHash, + status: 1, + data: { + fee, + baseTokenAmountRemoved, + quoteTokenAmountRemoved, + }, + }; + } catch (e) { + logger.error(e); + if (e.statusCode) { + throw e; + } + throw fastify.httpErrors.internalServerError('Failed to remove liquidity'); + } + }, + ); +}; + +export default removeLiquidityRoute; diff --git a/src/connectors/minswap/minswap.config.ts b/src/connectors/minswap/minswap.config.ts new file mode 100644 index 0000000000..dfb400a481 --- /dev/null +++ b/src/connectors/minswap/minswap.config.ts @@ -0,0 +1,59 @@ +import { ConfigManagerV2 } from '../../services/config-manager-v2'; + +interface AvailableNetworks { + chain: string; + networks: Array; +} + +export namespace MinswapConfig { + // Supported networks for Minswap + export const chain = 'cardano'; + export const networks = ['mainnet', 'preprod']; + // Supported trading types + export const tradingTypes = ['amm'] as const; + + export interface PoolsConfig { + [pairKey: string]: string; + } + + export interface NetworkConfig { + // Pool configurations + amm: PoolsConfig; + } + + export interface NetworkPoolsConfig { + // Dictionary of predefined pool addresses and settings by network + [network: string]: NetworkConfig; + } + + export interface RootConfig { + // Global configuration + allowedSlippage: string; + + // Network-specific configurations + networks: NetworkPoolsConfig; + + // Available networks + availableNetworks: Array; + } + + export const config: RootConfig = { + // Global configuration + allowedSlippage: ConfigManagerV2.getInstance().get('minswap.allowedSlippage'), + + // Network-specific pools + networks: ConfigManagerV2.getInstance().get('minswap.networks'), + + availableNetworks: [ + { + chain: 'cardano', + networks: ['mainnet', 'preprod'], + }, + ], + }; + + // Helper methods to get pools for a specific network + export const getNetworkPools = (network: string, poolType: 'amm'): PoolsConfig => { + return config.networks[network]?.[poolType] || {}; + }; +} diff --git a/src/connectors/minswap/minswap.routes.ts b/src/connectors/minswap/minswap.routes.ts new file mode 100644 index 0000000000..2eb90099bf --- /dev/null +++ b/src/connectors/minswap/minswap.routes.ts @@ -0,0 +1,34 @@ +import sensible from '@fastify/sensible'; +import type { FastifyPluginAsync } from 'fastify'; + +import { addLiquidityRoute as ammAddLiquidityRoute } from './amm-routes/addLiquidity'; +import { executeSwapRoute as ammExecuteSwapRoute } from './amm-routes/executeSwap'; +import { ammPoolInfoRoute } from './amm-routes/poolInfo'; +import quoteLiquidityRoute from './amm-routes/quoteLiquidity'; +import { quoteSwapRoute as ammQuoteSwapRoute } from './amm-routes/quoteSwap'; +import { removeLiquidityRoute as ammRemoveLiquidityRoute } from './amm-routes/removeLiquidity'; + +// AMM routes including swap endpoints +const minswapAmmRoutes: FastifyPluginAsync = async (fastify) => { + await fastify.register(sensible); + + await fastify.register(async (instance) => { + instance.addHook('onRoute', (routeOptions) => { + if (routeOptions.schema && routeOptions.schema.tags) { + routeOptions.schema.tags = ['/connector/minswap/amm']; + } + }); + + await instance.register(ammPoolInfoRoute); + await instance.register(ammQuoteSwapRoute); + await instance.register(quoteLiquidityRoute); + await instance.register(ammExecuteSwapRoute); + await instance.register(ammAddLiquidityRoute); + await instance.register(ammRemoveLiquidityRoute); + }); +}; + +// Main export that combines all routes +export const minswapRoutes = { + amm: minswapAmmRoutes, +}; diff --git a/src/connectors/minswap/minswap.ts b/src/connectors/minswap/minswap.ts new file mode 100644 index 0000000000..0aa7653831 --- /dev/null +++ b/src/connectors/minswap/minswap.ts @@ -0,0 +1,227 @@ +import { Data, PrivateKey, TxComplete, UTxO } from '@aiquant/lucid-cardano'; +import { ADA, Asset, BlockfrostAdapter, NetworkId, PoolV1 } from '@aiquant/minswap-sdk'; +import { BlockFrostAPI } from '@blockfrost/blockfrost-js'; + +import { Cardano } from '../../chains/cardano/cardano'; +import { PoolInfo } from '../../schemas/amm-schema'; +import { percentRegexp, ConfigManagerV2 } from '../../services/config-manager-v2'; +import { logger } from '../../services/logger'; + +import { MinswapConfig } from './minswap.config'; +import { findPoolAddress, isFractionString } from './minswap.utils'; + +export class Minswap { + private static _instances: { [name: string]: Minswap }; + public cardano: Cardano; + public config: MinswapConfig.RootConfig; + private owner?: PrivateKey; + public blockfrostAdapter: BlockfrostAdapter; + // Network information + private networkName: string; + + private constructor(network: string) { + this.networkName = network; + this.config = MinswapConfig.config as MinswapConfig.RootConfig; + this.cardano = null; + } + + /** Gets singleton instance of Minswap */ + public static async getInstance(network: string): Promise { + if (!Minswap._instances) { + Minswap._instances = {}; + } + + if (!Minswap._instances[network]) { + const instance = new Minswap(network); + await instance.init(network); + Minswap._instances[network] = instance; + } + + return Minswap._instances[network]; + } + + /** Initializes Minswap instance */ + private async init(network: string) { + try { + this.cardano = await Cardano.getInstance(network); + + // Load first wallet if available + const walletAddress = await this.cardano.getFirstWalletAddress(); + if (walletAddress) { + this.owner = await this.cardano.getWalletFromAddress(walletAddress); + } + this.blockfrostAdapter = new BlockfrostAdapter({ + networkId: this.cardano.network === 'preprod' ? NetworkId.TESTNET : NetworkId.MAINNET, + blockFrost: new BlockFrostAPI({ + projectId: this.cardano.projectId, + }), + }); + + logger.info('Minswap initialized' + (walletAddress ? ` with wallet: ${walletAddress}` : 'with no wallet')); + } catch (error) { + logger.error('Minswap initialization failed:', error); + throw error; + } + } + + /** + * Gets the allowed slippage percentage from config + * @returns Slippage as a percentage (e.g., 1.0 for 1%) + */ + getSlippagePct(): number { + const allowedSlippage = MinswapConfig.config.allowedSlippage; + const nd = allowedSlippage.match(percentRegexp); + let slippage = 0.0; + if (nd) { + slippage = Number(nd[1]) / Number(nd[2]); + } else { + logger.error('Failed to parse slippage value:', allowedSlippage); + } + return slippage * 100; + } + + // private getPairKey(baseToken: string, quoteToken: string): string { + // return `${baseToken}-${quoteToken}`; + // } + + // async findDefaultPool(routeType: 'amm'): Promise { + // // Get the network-specific pools + // const network = this.cardano.network; + // const pools = MinswapConfig.getNetworkPools(network, routeType); + + // if (!pools) return null; + // // For simplicity, return the first pool in the list + // const firstPoolAddress = Object.values(pools)[0]; + // return firstPoolAddress || null; + // } + + /** + * Find a default pool for a token pair in either AMM or CLMM + */ + public async findDefaultPool(baseToken: string, quoteToken: string, poolType: 'amm'): Promise { + try { + logger.info(`Finding ${poolType} pool for ${baseToken}-${quoteToken} on ${this.networkName}`); + + // Resolve token symbols if addresses are provided + const baseTokenInfo = this.cardano.getTokenBySymbol(baseToken); + const quoteTokenInfo = this.cardano.getTokenBySymbol(quoteToken); + + if (!baseTokenInfo || !quoteTokenInfo) { + logger.warn(`Token not found: ${!baseTokenInfo ? baseToken : quoteToken}`); + return null; + } + + logger.info( + `Resolved tokens: ${baseTokenInfo.symbol} (${baseTokenInfo.address}), ${quoteTokenInfo.symbol} (${quoteTokenInfo.address})`, + ); + + // Use PoolService to find pool by token pair + const { PoolService } = await import('../../services/pool-service'); + const poolService = PoolService.getInstance(); + + const pool = await poolService.getPool( + 'minswap', + this.networkName, + poolType, + baseTokenInfo.symbol, + quoteTokenInfo.symbol, + ); + + if (!pool) { + logger.warn( + `No ${poolType} pool found for ${baseTokenInfo.symbol}-${quoteTokenInfo.symbol} on Uniswap network ${this.networkName}`, + ); + return null; + } + + logger.info(`Found ${poolType} pool at ${pool.address}`); + return pool.address; + } catch (error) { + logger.error(`Error finding default pool: ${error.message}`); + if (error.stack) { + logger.debug(`Stack trace: ${error.stack}`); + } + return null; + } + } + + async getAmmPoolInfo(poolAddress: string): Promise { + const pool = await this.blockfrostAdapter.getV1PoolById({ + id: poolAddress, + }); + if (!pool) { + throw new Error(`Not found PoolState of ID: ${poolAddress}`); + } + + const getQuantity = (unit) => { + const found = pool.value.find((v) => v.unit === unit); + return found ? Number(found.quantity) : 0; + }; + + const baseTokenUnit = pool.assetA; // e.g., 'lovelace' + const quoteTokenUnit = pool.assetB; // e.g., '29d...d494e' + + const baseTokenAmount = getQuantity(baseTokenUnit); + const quoteTokenAmount = getQuantity(quoteTokenUnit); + + // Convert to number for price calculation (if not zero) + const price = await this.blockfrostAdapter.getV1PoolPrice({ + pool: pool, + }); + + return { + address: poolAddress, + baseTokenAddress: pool.assetA === 'lovelace' ? 'adalovelace' : pool.assetA, + quoteTokenAddress: pool.assetB === 'lovelace' ? 'adalovelace' : pool.assetB, + feePct: 2, + price: price[0], + baseTokenAmount: baseTokenAmount, + quoteTokenAmount: quoteTokenAmount, + }; + } + + /** + * Get the allowed slippage as a decimal from string or config + * @param allowedSlippageStr Optional string representation of slippage value + * @returns A decimal number (e.g., 0.05 for 5%) + */ + public getAllowedSlippage(allowedSlippageStr?: string): number { + if (allowedSlippageStr != null && isFractionString(allowedSlippageStr)) { + const fractionSplit = allowedSlippageStr.split('/'); + return Number(fractionSplit[0]) / Number(fractionSplit[1]); + } + + // Use the global allowedSlippage setting + const allowedSlippage = this.config.allowedSlippage; + + const nd = allowedSlippage.match(percentRegexp); + if (nd) return Number(nd[1]) / Number(nd[2]); + + throw new Error('Encountered a malformed percent string in the config for allowed slippage.'); + } + + public calculateAssetAmount(utxos: UTxO[], asset: string): bigint { + return utxos.reduce((acc, utxo) => { + const assetValue = utxo.assets[asset]; + if (assetValue) { + return acc + BigInt(assetValue); // Ensure addition is performed with BigInt + } + return acc; + }, 0n); // Initialize the accumulator with BigInt zero + } + + async getPoolData(poolAddress: string) { + const poolState = await this.blockfrostAdapter.getV1PoolById({ + id: poolAddress, + }); + if (!poolState) { + throw new Error(`Not found PoolState of ID: ${poolAddress}`); + } + const rawPoolDatum = await this.blockfrostAdapter.getDatumByDatumHash(poolState.datumHash); + const poolDatum = PoolV1.Datum.fromPlutusData( + this.networkName === 'mainnet' ? NetworkId.MAINNET : NetworkId.TESTNET, + Data.from(rawPoolDatum), + ); + return { poolState, poolDatum }; + } +} diff --git a/src/connectors/minswap/minswap.utils.ts b/src/connectors/minswap/minswap.utils.ts new file mode 100644 index 0000000000..8139340dad --- /dev/null +++ b/src/connectors/minswap/minswap.utils.ts @@ -0,0 +1,65 @@ +import { logger } from '../../services/logger'; +import { MinswapConfig } from './minswap.config'; + +/** + * Find a pool address for a token pair in the configured pools + * + * @param baseToken Base token symbol + * @param quoteToken Quote token symbol + * @param poolType Type of pool ('amm' or 'clmm') + * @param network Network name (defaults to 'mainnet-beta') + * @returns Pool address or null if not found + */ +export const findPoolAddress = ( + baseToken: string, + quoteToken: string, + poolType: 'amm', + network: string = 'mainnet', +): string | null => { + // Get the network-specific pools + const pools = MinswapConfig.getNetworkPools(network, poolType); + if (!pools) return null; + + // Try standard order (BASE-QUOTE) + const standardKey = `${baseToken}-${quoteToken}`; + if (pools[standardKey]) return pools[standardKey]; + + // Try reverse order (QUOTE-BASE) + const reverseKey = `${quoteToken}-${baseToken}`; + if (pools[reverseKey]) return pools[reverseKey]; + + return null; +}; + +/** + * Format token amounts for display + * @param amount The raw amount as a string or number + * @param decimals The token decimals + * @returns The formatted token amount + */ +export const formatTokenAmount = ( + amount: string | number | bigint, + decimals: number, +): number => { + try { + if (typeof amount === 'string') { + return parseFloat(amount) / Math.pow(10, decimals); + } + if (typeof amount === 'bigint') { + return Number(amount) / Math.pow(10, decimals); + } + return amount / Math.pow(10, decimals); + } catch (error) { + logger.error(`Error formatting token amount: ${error}`); + return 0; + } +}; + +/** + * Check if a string is a valid fraction (in the form of 'a/b') + * @param value The string to check + * @returns True if the string is a valid fraction, false otherwise + */ +export function isFractionString(value: string): boolean { + return value.includes('/') && value.split('/').length === 2; +} diff --git a/src/connectors/sundaeswap/amm-routes/addLiquidity.ts b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts new file mode 100644 index 0000000000..a4c894310f --- /dev/null +++ b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts @@ -0,0 +1,200 @@ +import { Assets, TxComplete } from '@aiquant/lucid-cardano'; +import { EDatumType, IDepositConfigArgs, TSupportedNetworks } from '@aiquant/sundaeswap-core'; +import { DatumBuilderLucidV3, TxBuilderLucidV3 } from '@aiquant/sundaeswap-core/lucid'; +import { AssetAmount, IAssetAmountMetadata } from '@sundaeswap/asset'; +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync } from 'fastify'; + +import { CardanoToken } from '#src/tokens/types'; + +import { + AddLiquidityRequestType, + AddLiquidityRequest, + AddLiquidityResponseType, + AddLiquidityResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Sundaeswap } from '../sundaeswap'; +import { formatTokenAmount } from '../sundaeswap.utils'; + +import { getSundaeswapAmmLiquidityQuote } from './quoteLiquidity'; + +async function addLiquidity( + fastify: any, + network: string, + walletAddress: string, + poolAddress: string, + baseToken: CardanoToken, + quoteToken: CardanoToken, + baseTokenAmount: number, + quoteTokenAmount: number, + slippagePct?: number, +): Promise { + const networkToUse = network || 'mainnet'; + + // 1) Get quote for optimal amounts + const quote = await getSundaeswapAmmLiquidityQuote( + networkToUse, + poolAddress, + baseToken, + quoteToken, + baseTokenAmount, + quoteTokenAmount, + slippagePct, + ); + + // 2) Prepare Sundaeswap + const sundaeswap = await Sundaeswap.getInstance(networkToUse); + const { cardano } = sundaeswap; + + // 3) Ensure wallet key + const privateKey = await cardano.getWalletFromAddress(walletAddress); + if (!privateKey) { + throw fastify.httpErrors.badRequest('Wallet not found'); + } + cardano.lucidInstance.selectWalletFromPrivateKey(privateKey); + + // Map base/quote amounts to correct assetA/assetB based on pool structure + const baseTokenId = baseToken.symbol === 'ADA' ? 'ada.lovelace' : `${baseToken.policyId}.${baseToken.assetName}`; + + const quoteTokenId = quoteToken.symbol === 'ADA' ? 'ada.lovelace' : `${quoteToken.policyId}.${quoteToken.assetName}`; + + // Get asset IDs from pool data + const assetAId = quote.poolData.assetA.assetId.trim(); + const assetBId = quote.poolData.assetB.assetId.trim(); + + let assetAAmount: string; + let assetBAmount: string; + + if (baseTokenId === assetAId) { + // Base token is assetA, quote token is assetB + assetAAmount = quote.rawBaseTokenAmount; + assetBAmount = quote.rawQuoteTokenAmount; + } else if (baseTokenId === assetBId) { + // Base token is assetB, quote token is assetA + assetAAmount = quote.rawQuoteTokenAmount; // Quote amount goes to assetA + assetBAmount = quote.rawBaseTokenAmount; // Base amount goes to assetB + } else { + throw new Error(`Base token ${baseToken.symbol} not found in pool`); + } + + // Create asset amounts with correct mapping + const depositArgs: IDepositConfigArgs = { + suppliedAssets: [ + new AssetAmount(assetAAmount, quote.poolData.assetA), + new AssetAmount(assetBAmount, quote.poolData.assetB), + ] as [AssetAmount, AssetAmount], + pool: quote.poolData, + orderAddresses: { + DestinationAddress: { + address: walletAddress, + datum: { + type: EDatumType.NONE, + }, + }, + }, + }; + + const txBuilder = new TxBuilderLucidV3( + sundaeswap.cardano.lucidInstance, + new DatumBuilderLucidV3(network as TSupportedNetworks), + ); + + const result = await txBuilder.deposit({ ...depositArgs }); + const builtTx = await result.build(); + const { submit } = await builtTx.sign(); + const txHash = await submit(); + + return { + signature: txHash, + status: 1, + data: { + fee: builtTx.builtTx.fee, + baseTokenAmountAdded: quote.baseTokenAmount, + quoteTokenAmountAdded: quote.quoteTokenAmount, + }, + }; +} + +export const addLiquidityRoute: FastifyPluginAsync = async (fastify) => { + await fastify.register(require('@fastify/sensible')); + fastify.post<{ + Body: AddLiquidityRequestType; + Reply: AddLiquidityResponseType; + }>( + '/add-liquidity', + { + schema: { + description: 'Add liquidity to a Sundaeswap pool', + tags: ['/connector/sundaeswap/amm'], + body: { + ...AddLiquidityRequest, + properties: { + ...AddLiquidityRequest.properties, + network: { type: 'string', default: 'mainnet' }, + walletAddress: { type: 'string', examples: ['addr'] }, + poolAddress: { type: 'string', examples: [''] }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['SUNDAE'] }, + baseTokenAmount: { type: 'number', examples: [0.001] }, + quoteTokenAmount: { type: 'number', examples: [2.5] }, + slippagePct: { type: 'number', examples: [1] }, + }, + }, + response: { 200: AddLiquidityResponse }, + }, + }, + async (request) => { + try { + const { + network, + poolAddress: reqPool, + baseTokenAmount, + quoteTokenAmount, + slippagePct, + walletAddress: reqWallet, + } = request.body; + + if (!baseTokenAmount || !quoteTokenAmount) { + throw fastify.httpErrors.badRequest('Missing parameters'); + } + + const sundaeswap = await Sundaeswap.getInstance(network || 'mainnet'); + const walletAddr = reqWallet || (await sundaeswap.cardano.getFirstWalletAddress()); + if (!walletAddr) { + throw fastify.httpErrors.badRequest('No wallet address'); + } + + if (!reqPool) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); + } + + const poolInfo = await sundaeswap.getAmmPoolInfo(reqPool); + + const baseTokenAddress = poolInfo.baseTokenAddress; + const quoteTokenAddress = poolInfo.quoteTokenAddress; + + const baseToken = await sundaeswap.cardano.getTokenByAddress(baseTokenAddress); + const quoteToken = await sundaeswap.cardano.getTokenByAddress(quoteTokenAddress); + + return await addLiquidity( + fastify, + network || 'mainnet', + walletAddr, + reqPool, + baseToken, + quoteToken, + baseTokenAmount, + quoteTokenAmount, + slippagePct !== undefined ? slippagePct / 100 : undefined, + ); + } catch (e: any) { + logger.error(e); + if (e.statusCode) throw e; + throw fastify.httpErrors.internalServerError('Failed to add liquidity'); + } + }, + ); +}; + +export default addLiquidityRoute; diff --git a/src/connectors/sundaeswap/amm-routes/executeSwap.ts b/src/connectors/sundaeswap/amm-routes/executeSwap.ts new file mode 100644 index 0000000000..978b1c22e6 --- /dev/null +++ b/src/connectors/sundaeswap/amm-routes/executeSwap.ts @@ -0,0 +1,207 @@ +import { EDatumType, ESwapType, ISwapConfigArgs, TSupportedNetworks } from '@aiquant/sundaeswap-core'; +import { DatumBuilderLucidV3, TxBuilderLucidV3 } from '@aiquant/sundaeswap-core/lucid'; +import { AssetAmount, IAssetAmountMetadata } from '@sundaeswap/asset'; +import { FastifyPluginAsync } from 'fastify'; + +import { CardanoToken } from '#src/tokens/types'; + +import { + ExecuteSwapRequestType, + SwapExecuteResponseType, + SwapExecuteResponse, + ExecuteSwapRequest, +} from '../../../schemas/router-schema'; +import { logger } from '../../../services/logger'; +import { Sundaeswap } from '../sundaeswap'; +import { formatTokenAmount } from '../sundaeswap.utils'; + +export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { + await fastify.register(require('@fastify/sensible')); + + fastify.post<{ + Body: ExecuteSwapRequestType; + Reply: SwapExecuteResponseType; + }>( + '/execute-swap', + { + schema: { + description: 'Execute a swap on Sundaeswap AMM (Cardano)', + tags: ['/connector/sundaeswap/amm'], + body: { + ...ExecuteSwapRequest, + properties: { + ...ExecuteSwapRequest.properties, + network: { type: 'string', default: 'mainnet' }, + walletAddress: { type: 'string' }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['SUNDAE'] }, + amount: { type: 'number', examples: [100] }, // always BASE token amount + side: { type: 'string', enum: ['BUY', 'SELL'] }, + poolAddress: { type: 'string' }, + slippagePct: { type: 'number', examples: [1] }, + }, + }, + response: { 200: SwapExecuteResponse }, + }, + }, + async (request) => { + try { + const { network, walletAddress: reqAddr, baseToken, quoteToken, amount, side, slippagePct = 1 } = request.body; + + const net = (network || 'mainnet') as TSupportedNetworks; + const sundaeswap = await Sundaeswap.getInstance(net); + + // Determine wallet + const walletAddr = reqAddr || (await sundaeswap.cardano.getFirstWalletAddress()); + if (!walletAddr) { + throw fastify.httpErrors.badRequest('No wallet address provided'); + } + const wallet = await sundaeswap.cardano.getWalletFromAddress(walletAddr); + sundaeswap.cardano.lucidInstance.selectWalletFromPrivateKey(wallet); + + // Determine pool + const poolAddr = await sundaeswap.findDefaultPool(baseToken, quoteToken, 'amm'); + if (!poolAddr) { + throw fastify.httpErrors.notFound(`Pool not found for ${baseToken}-${quoteToken}`); + } + const poolData = await sundaeswap.getPoolData(poolAddr); + + // Get token objects + const baseTokenObj = sundaeswap.cardano.getTokenBySymbol(baseToken); + const quoteTokenObj = sundaeswap.cardano.getTokenBySymbol(quoteToken); + + if (!baseTokenObj || !quoteTokenObj) { + throw fastify.httpErrors.badRequest('Token not found'); + } + + // Match Uniswap logic exactly + const exactIn = side === 'SELL'; + const [inputTokenObj, outputTokenObj] = exactIn ? [baseTokenObj, quoteTokenObj] : [quoteTokenObj, baseTokenObj]; + + // Handle SundaeSwap's asset ID format + const inputAssetId = + inputTokenObj.symbol === 'ADA' ? 'ada.lovelace' : `${inputTokenObj.policyId}.${inputTokenObj.assetName}`; + + const outputAssetId = + outputTokenObj.symbol === 'ADA' ? 'ada.lovelace' : `${outputTokenObj.policyId}.${outputTokenObj.assetName}`; + + // Get pool assets and reserves + const assetA = poolData.assetA.assetId.trim(); + const assetB = poolData.assetB.assetId.trim(); + const reserveA = BigInt(poolData.liquidity.aReserve); + const reserveB = BigInt(poolData.liquidity.bReserve); + + // Map input/output tokens to pool reserves + let inputReserve: bigint; + let outputReserve: bigint; + + if (inputAssetId === assetA) { + inputReserve = reserveA; + outputReserve = reserveB; + } else if (inputAssetId === assetB) { + inputReserve = reserveB; + outputReserve = reserveA; + } else { + throw fastify.httpErrors.badRequest(`Input token ${inputAssetId} not found in pool`); + } + + // Validate output token is in pool + const outputInPool = outputAssetId === assetA || outputAssetId === assetB; + if (!outputInPool) { + throw fastify.httpErrors.badRequest(`Output token ${outputAssetId} not found in pool`); + } + + // Convert amount using BASE token decimals (like Uniswap) + const fee = poolData.currentFee; // e.g., 0.005 for 0.5% + let inputAmount: bigint; + let outputAmount: bigint; + + if (exactIn) { + // SELL: spending exact amount of baseToken + inputAmount = BigInt(Math.floor(amount * 10 ** baseTokenObj.decimals)); + + // Apply AMM formula: dy = (y * dx * (1 - fee)) / (x + dx * (1 - fee)) + const inputAfterFee = (inputAmount * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; + outputAmount = (outputReserve * inputAfterFee) / (inputReserve + inputAfterFee); + } else { + // BUY: wanting to receive exact amount of baseToken + outputAmount = BigInt(Math.floor(amount * 10 ** baseTokenObj.decimals)); + + // Check liquidity + if (outputAmount >= outputReserve) { + throw fastify.httpErrors.badRequest('Insufficient liquidity: requested amount exceeds available reserves'); + } + + // Apply AMM formula: dx = (x * dy) / ((y - dy) * (1 - fee)) + const numerator = inputReserve * outputAmount; + const denominator = ((outputReserve - outputAmount) * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; + inputAmount = numerator / denominator; + } + + // Prepare asset metadata for the input token with correct format + const asset: IAssetAmountMetadata = + inputTokenObj.symbol === 'ADA' + ? { + assetId: 'ada.lovelace', + decimals: 6, + } + : { + assetId: `${inputTokenObj.policyId}.${inputTokenObj.assetName}`, + decimals: inputTokenObj.decimals, + }; + + // Prepare suppliedAsset + const suppliedAsset: AssetAmount = new AssetAmount(inputAmount, asset); + + // Build swap transaction + const args: ISwapConfigArgs = { + swapType: { type: ESwapType.MARKET, slippage: slippagePct / 100 }, + pool: poolData, + orderAddresses: { + DestinationAddress: { + address: walletAddr, + datum: { type: EDatumType.NONE }, + }, + }, + suppliedAsset, + }; + + const txBuilder = new TxBuilderLucidV3(sundaeswap.cardano.lucidInstance, new DatumBuilderLucidV3(net)); + const swapResult = await txBuilder.swap({ ...args }); + + const builtTx = await swapResult.build(); + const { submit } = await builtTx.sign(); + + const txHash = await submit(); + + // Format response values + const inputAmountHuman = Number(inputAmount) / 10 ** inputTokenObj.decimals; + const outputAmountHuman = Number(outputAmount) / 10 ** outputTokenObj.decimals; + + // Balance changes + const baseTokenBalanceChange = side === 'BUY' ? outputAmountHuman : -inputAmountHuman; + const quoteTokenBalanceChange = side === 'BUY' ? -inputAmountHuman : outputAmountHuman; + + return { + signature: txHash, + status: 1, + data: { + tokenIn: side === 'SELL' ? baseToken : quoteToken, + tokenOut: side === 'SELL' ? quoteToken : baseToken, + amountIn: inputAmountHuman, + amountOut: outputAmountHuman, + fee: builtTx.builtTx.fee, + baseTokenBalanceChange, + quoteTokenBalanceChange, + }, + }; + } catch (err: any) { + logger.error('Swap failed:', err); + if (err.statusCode) throw err; + throw fastify.httpErrors.internalServerError(`Swap execution error: ${err.message}`); + } + }, + ); +}; + +export default executeSwapRoute; diff --git a/src/connectors/sundaeswap/amm-routes/poolInfo.ts b/src/connectors/sundaeswap/amm-routes/poolInfo.ts new file mode 100644 index 0000000000..8011a9c530 --- /dev/null +++ b/src/connectors/sundaeswap/amm-routes/poolInfo.ts @@ -0,0 +1,56 @@ +import { FastifyPluginAsync } from 'fastify'; + +import { GetPoolInfoRequestType, GetPoolInfoRequest, PoolInfo, PoolInfoSchema } from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Sundaeswap } from '../sundaeswap'; + +export const ammPoolInfoRoute: FastifyPluginAsync = async (fastify) => { + fastify.get<{ + Querystring: GetPoolInfoRequestType; + Reply: Record; + }>( + '/pool-info', + { + schema: { + description: 'Get AMM pool information from Sundaeswap', + tags: ['/connector/sundaeswap/amm'], + querystring: { + ...GetPoolInfoRequest, + properties: { + network: { type: 'string', examples: ['mainnet'] }, + poolAddress: { + type: 'string', + examples: ['2f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773'], + }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['SUNDAE'] }, + }, + }, + response: { + 200: PoolInfoSchema, + }, + }, + }, + async (request): Promise => { + try { + const { poolAddress } = request.query; + const network = request.query.network || 'mainnet'; + + const sundaeswap = await Sundaeswap.getInstance(network); + // console.log('sundaeswap ', sundaeswap); + + // Check if either poolAddress or both baseToken and quoteToken are provided + if (!poolAddress) { + throw fastify.httpErrors.badRequest('poolAddress is required'); + } + + const poolInfo = await sundaeswap.getAmmPoolInfo(poolAddress); + if (!poolInfo) throw fastify.httpErrors.notFound('Pool not found'); + return poolInfo; + } catch (e) { + logger.error(e); + throw fastify.httpErrors.internalServerError('Failed to fetch pool info'); + } + }, + ); +}; diff --git a/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts b/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts new file mode 100644 index 0000000000..56d21d6e0c --- /dev/null +++ b/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts @@ -0,0 +1,230 @@ +import { IPoolData } from '@aiquant/sundaeswap-core'; +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync } from 'fastify'; + +import { CardanoToken } from '#src/tokens/types'; + +import { + QuoteLiquidityRequestType, + QuoteLiquidityRequest, + QuoteLiquidityResponseType, + QuoteLiquidityResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Sundaeswap } from '../sundaeswap'; +import { formatTokenAmount } from '../sundaeswap.utils'; + +export async function getSundaeswapAmmLiquidityQuote( + network: string, + poolAddress?: string, + baseToken?: CardanoToken, + quoteToken?: CardanoToken, + baseTokenAmount?: number, + quoteTokenAmount?: number, + _slippagePct?: number, +): Promise<{ + baseLimited: boolean; + baseTokenAmount: number; + quoteTokenAmount: number; + baseTokenAmountMax: number; + quoteTokenAmountMax: number; + baseToken: CardanoToken; + quoteToken: CardanoToken; + poolAddress?: string; + rawBaseTokenAmount: string; + rawQuoteTokenAmount: string; + poolData: IPoolData; +}> { + const networkToUse = network || 'mainnet'; + + if (!baseToken || !quoteToken) { + throw new Error('Base token and quote token are required'); + } + if (baseTokenAmount === undefined && quoteTokenAmount === undefined) { + throw new Error('At least one token amount must be provided'); + } + + const sundaeswap = await Sundaeswap.getInstance(networkToUse); + + let poolAddressToUse = poolAddress; + let existingPool = true; + if (!poolAddressToUse) { + poolAddressToUse = await sundaeswap.findDefaultPool(baseToken.symbol, quoteToken.symbol, 'amm'); + if (!poolAddressToUse) { + existingPool = false; + logger.info(`No existing pool found for ${baseToken}-${quoteToken}, providing theoretical quote`); + } + } + + let baseTokenAmountOptimal = baseTokenAmount!; + let quoteTokenAmountOptimal = quoteTokenAmount!; + let baseLimited = false; + let poolState: IPoolData; + + if (existingPool) { + poolState = await sundaeswap.getPoolData(poolAddressToUse); + + if (!poolState) { + throw new Error(`Unable to load pool ${poolAddressToUse}`); + } + + // Handle SundaeSwap's specific asset ID format + const baseTokenId = + baseToken.symbol === 'ADA' + ? 'ada.lovelace' // SundaeSwap format for ADA + : `${baseToken.policyId}.${baseToken.assetName}`; // SundaeSwap format for other tokens + + const quoteTokenId = + quoteToken.symbol === 'ADA' + ? 'ada.lovelace' // SundaeSwap format for ADA + : `${quoteToken.policyId}.${quoteToken.assetName}`; // SundaeSwap format for other tokens + + // Get asset IDs from pool data + const assetAId = poolState.assetA.assetId.trim(); + const assetBId = poolState.assetB.assetId.trim(); + + let baseReserve: bigint; + let quoteReserve: bigint; + + if (baseTokenId === assetAId) { + // Base token is assetA, quote token is assetB + baseReserve = BigInt(poolState.liquidity.aReserve || 0); + quoteReserve = BigInt(poolState.liquidity.bReserve || 0); + } else if (baseTokenId === assetBId) { + // Base token is assetB, quote token is assetA + baseReserve = BigInt(poolState.liquidity.bReserve || 0); + quoteReserve = BigInt(poolState.liquidity.aReserve || 0); + } else { + throw new Error(`Base token ${baseToken.symbol} not found in pool`); + } + + // Convert user inputs into raw bigints + const baseRaw = baseTokenAmount ? BigInt(Math.floor(baseTokenAmount * 10 ** baseToken.decimals).toString()) : null; + const quoteRaw = quoteTokenAmount + ? BigInt(Math.floor(quoteTokenAmount * 10 ** quoteToken.decimals).toString()) + : null; + + // Compute the "optimal" opposite amount + if (baseRaw !== null && quoteRaw !== null) { + // both sides provided → pick the limiting one + const quoteOptimal = (baseRaw * quoteReserve) / baseReserve; + if (quoteOptimal <= quoteRaw) { + baseLimited = true; + quoteTokenAmountOptimal = Number(formatTokenAmount(quoteOptimal.toString(), quoteToken.decimals)); + } else { + baseLimited = false; + const baseOptimal = (quoteRaw * baseReserve) / quoteReserve; + baseTokenAmountOptimal = Number(formatTokenAmount(baseOptimal.toString(), baseToken.decimals)); + } + } else if (baseRaw !== null) { + // only base provided + const quoteOptimal = baseReserve === BigInt(0) ? BigInt(0) : (baseRaw * quoteReserve) / baseReserve; + quoteTokenAmountOptimal = Number(formatTokenAmount(quoteOptimal.toString(), quoteToken.decimals)); + baseLimited = true; + } else if (quoteRaw !== null) { + // only quote provided + const baseOptimal = quoteReserve === BigInt(0) ? BigInt(0) : (quoteRaw * baseReserve) / quoteReserve; + baseTokenAmountOptimal = Number(formatTokenAmount(baseOptimal.toString(), baseToken.decimals)); + baseLimited = false; + } + } else { + // new pool → must supply both + if (baseTokenAmount == null || quoteTokenAmount == null) { + throw new Error('For a new pool, you must supply both baseTokenAmount and quoteTokenAmount'); + } + baseLimited = false; // arbitrary; both get used + } + + // Convert back to raw amounts + const rawBaseTokenAmount = Math.floor(baseTokenAmountOptimal * 10 ** baseToken.decimals).toString(); + const rawQuoteTokenAmount = Math.floor(quoteTokenAmountOptimal * 10 ** quoteToken.decimals).toString(); + + return { + baseLimited, + baseTokenAmount: baseTokenAmountOptimal, + quoteTokenAmount: quoteTokenAmountOptimal, + baseTokenAmountMax: baseTokenAmount ?? baseTokenAmountOptimal, + quoteTokenAmountMax: quoteTokenAmount ?? quoteTokenAmountOptimal, + baseToken, + quoteToken, + poolAddress: poolAddressToUse, + rawBaseTokenAmount, + rawQuoteTokenAmount, + poolData: poolState, + }; +} + +export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { + await fastify.register(require('@fastify/sensible')); + fastify.get<{ + Querystring: QuoteLiquidityRequestType; + Reply: QuoteLiquidityResponseType; + }>( + '/quote-liquidity', + { + schema: { + description: 'Get liquidity quote for Sundaeswap', + tags: ['/connector/sundaeswap/amm'], + querystring: { + ...QuoteLiquidityRequest, + properties: { + ...QuoteLiquidityRequest.properties, + network: { type: 'string', default: 'mainnet' }, + poolAddress: { type: 'string', examples: [''] }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['SUNDAE'] }, + baseTokenAmount: { type: 'number', examples: [0.029314] }, + quoteTokenAmount: { type: 'number', examples: [1] }, + slippagePct: { type: 'number', examples: [1] }, + }, + }, + response: { 200: QuoteLiquidityResponse }, + }, + }, + async (request) => { + try { + const { network, poolAddress, baseTokenAmount, quoteTokenAmount, slippagePct } = request.query; + + const sundaeswap = await Sundaeswap.getInstance(network); + + if (!poolAddress) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); + } + + const poolInfo = await sundaeswap.getAmmPoolInfo(poolAddress); + + const baseTokenAddress = poolInfo.baseTokenAddress; + const quoteTokenAddress = poolInfo.quoteTokenAddress; + + const baseToken = await sundaeswap.cardano.getTokenByAddress(baseTokenAddress); + const quoteToken = await sundaeswap.cardano.getTokenByAddress(quoteTokenAddress); + + const quote = await getSundaeswapAmmLiquidityQuote( + network, + poolAddress, + baseToken, + quoteToken, + baseTokenAmount, + quoteTokenAmount, + slippagePct, + ); + + return { + baseLimited: quote.baseLimited, + baseTokenAmount: quote.baseTokenAmount, + quoteTokenAmount: quote.quoteTokenAmount, + baseTokenAmountMax: quote.baseTokenAmountMax, + quoteTokenAmountMax: quote.quoteTokenAmountMax, + }; + } catch (e) { + logger.error(e); + if (e.statusCode) { + throw e; + } + throw fastify.httpErrors.internalServerError('Failed to get liquidity quote'); + } + }, + ); +}; + +export default quoteLiquidityRoute; diff --git a/src/connectors/sundaeswap/amm-routes/quoteSwap.ts b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts new file mode 100644 index 0000000000..acc2b89220 --- /dev/null +++ b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts @@ -0,0 +1,356 @@ +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync, FastifyInstance } from 'fastify'; + +import { CardanoToken } from '#src/tokens/types'; + +import { + QuoteSwapRequestType, + QuoteSwapResponseType, + QuoteSwapRequest, + QuoteSwapResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Sundaeswap } from '../sundaeswap'; +import { formatTokenAmount } from '../sundaeswap.utils'; + +export async function quoteAmmSwap( + sundaeswap: Sundaeswap, + poolIdent: string, + baseToken: CardanoToken, + quoteToken: CardanoToken, + amount: number, // now always refers to BASE token units + side: 'BUY' | 'SELL', + slippagePct: number = 1, +): Promise { + // BUY: you want to RECEIVE `amount` of baseToken, paying quoteToken + // SELL: you want to SPEND `amount` of baseToken, receiving quoteToken + + const poolData = await sundaeswap.getPoolData(poolIdent); + + // Get pool assets and reserves + const assetA = poolData.assetA.assetId.trim(); + const assetB = poolData.assetB.assetId.trim(); + const reserveA = BigInt(poolData.liquidity.aReserve); + const reserveB = BigInt(poolData.liquidity.bReserve); + + const exactIn = side === 'SELL'; + const [inputToken, outputToken] = exactIn ? [baseToken, quoteToken] : [quoteToken, baseToken]; + + // Map input/output tokens to pool reserves + const inputAssetId = inputToken.address || `${inputToken.policyId}.${inputToken.assetName}`; + const outputAssetId = outputToken.address || `${outputToken.policyId}.${outputToken.assetName}`; + + let inputReserve: bigint; + let outputReserve: bigint; + + if (inputAssetId.trim() === assetA) { + inputReserve = reserveA; + outputReserve = reserveB; + } else if (inputAssetId.trim() === assetB) { + inputReserve = reserveB; + outputReserve = reserveA; + } else { + throw new Error(`Input token ${inputAssetId} not found in pool`); + } + + // Validate output token is in the pool + const outputInPool = outputAssetId.trim() === assetA || outputAssetId.trim() === assetB; + if (!outputInPool) { + throw new Error(`Output token ${outputAssetId} not found in pool`); + } + + // Convert amount using BASE token decimals + const fee = poolData.currentFee; // e.g., 0.005 for 0.5% + let inputAmount: bigint; + let outputAmount: bigint; + + if (exactIn) { + // SELL: spending exact amount of baseToken + inputAmount = BigInt(Math.floor(amount * 10 ** baseToken.decimals)); + + // Apply AMM formula: dy = (y * dx * (1 - fee)) / (x + dx * (1 - fee)) + const inputAfterFee = (inputAmount * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; + outputAmount = (outputReserve * inputAfterFee) / (inputReserve + inputAfterFee); + } else { + // BUY: wanting to receive exact amount of baseToken + outputAmount = BigInt(Math.floor(amount * 10 ** baseToken.decimals)); + + // Check liquidity + if (outputAmount >= outputReserve) { + throw new Error('Insufficient liquidity: requested amount exceeds available reserves'); + } + + // Apply AMM formula: dx = (x * dy) / ((y - dy) * (1 - fee)) + const numerator = inputReserve * outputAmount; + const denominator = ((outputReserve - outputAmount) * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; + inputAmount = numerator / denominator; + } + + // Calculate slippage protection + const slippageTolerance = slippagePct / 100; + const slippageMultiplier = BigInt(Math.floor((1 - slippageTolerance) * 10000)); + const slippageDenominator = 10000n; + + const minAmountOut = exactIn ? (outputAmount * slippageMultiplier) / slippageDenominator : outputAmount; + const maxAmountIn = exactIn + ? inputAmount + : (inputAmount * (slippageDenominator + BigInt(Math.floor(slippageTolerance * 10000)))) / slippageDenominator; + + // Calculate price impact + const midPrice = + Number(inputReserve) / 10 ** inputToken.decimals / (Number(outputReserve) / 10 ** outputToken.decimals); + const executionPrice = + Number(inputAmount) / 10 ** inputToken.decimals / (Number(outputAmount) / 10 ** outputToken.decimals); + const priceImpact = Math.abs((executionPrice - midPrice) / midPrice); + + // Convert amounts to human-readable format + const estimatedIn = formatTokenAmount(inputAmount, inputToken.decimals); + const estimatedOut = formatTokenAmount(outputAmount, outputToken.decimals); + const minOutHuman = formatTokenAmount(minAmountOut, outputToken.decimals); + const maxInHuman = formatTokenAmount(maxAmountIn, inputToken.decimals); + + return { + poolIdent, + estimatedAmountIn: estimatedIn, + estimatedAmountOut: estimatedOut, + minAmountOut: minOutHuman, + maxAmountIn: maxInHuman, + priceImpact, + inputToken, + outputToken, + rawAmountIn: inputAmount.toString(), + rawAmountOut: outputAmount.toString(), + rawMinAmountOut: minAmountOut.toString(), + rawMaxAmountIn: maxAmountIn.toString(), + slippagePct, + pathAddresses: [inputToken.address, outputToken.address], + }; +} + +// FIXED: Balance changes and response formatting +async function formatSwapQuote( + fastify: FastifyInstance, + network: string, + poolIdent: string, + baseToken: string, + quoteToken: string, + amount: number, + side: 'BUY' | 'SELL', + slippagePct: number = 1, +): Promise { + logger.info( + `formatSwapQuote: poolIdent=${poolIdent}, baseToken=${baseToken}, quoteToken=${quoteToken}, amount=${amount}, side=${side}, slippagePct=${slippagePct}, network=${network}`, + ); + + try { + const { quote, sundaeswap, cardano, baseTokenObj, quoteTokenObj } = await getSundaeswapAmmQuote( + fastify, + network, + poolIdent, + baseToken, + quoteToken, + amount, + side, + slippagePct, + ); + + logger.info( + `Quote result: estimatedAmountIn=${quote.estimatedAmountIn}, estimatedAmountOut=${quote.estimatedAmountOut}, slippagePct=${quote.slippagePct}`, + ); + + // Balance changes (match Uniswap logic) + const baseTokenBalanceChange = side === 'BUY' ? quote.estimatedAmountOut : -quote.estimatedAmountIn; + const quoteTokenBalanceChange = side === 'BUY' ? -quote.estimatedAmountIn : quote.estimatedAmountOut; + + logger.info( + `Balance changes: baseTokenBalanceChange=${baseTokenBalanceChange}, quoteTokenBalanceChange=${quoteTokenBalanceChange}`, + ); + + // Calculate price + const price = + side === 'SELL' + ? quote.estimatedAmountOut / quote.estimatedAmountIn + : quote.estimatedAmountIn / quote.estimatedAmountOut; + + return { + poolAddress: poolIdent, + // Use correct token addresses like Uniswap + tokenIn: quote.inputToken.address, + tokenOut: quote.outputToken.address, + amountIn: quote.estimatedAmountIn, + amountOut: quote.estimatedAmountOut, + price: price, + minAmountOut: quote.minAmountOut, + maxAmountIn: quote.maxAmountIn, + slippagePct: quote.slippagePct, + priceImpactPct: quote.priceImpact, + }; + } catch (error) { + logger.error(`Error formatting swap quote: ${error.message}`); + if (error.stack) { + logger.debug(`Stack trace: ${error.stack}`); + } + throw error; + } +} + +export async function getSundaeswapAmmQuote( + _fastify: FastifyInstance, + network: string, + poolIdent: string, + baseToken: string, + quoteToken: string, + amount: number, + side: 'BUY' | 'SELL', + slippagePct: number = 1, +): Promise<{ + quote: any; + sundaeswap: any; + cardano: any; + baseTokenObj: any; + quoteTokenObj: any; +}> { + // Get instances + const sundaeswap = await Sundaeswap.getInstance(network); + + // Resolve tokens + const baseTokenObj = sundaeswap.cardano.getTokenBySymbol(baseToken); + const quoteTokenObj = sundaeswap.cardano.getTokenBySymbol(quoteToken); + + if (!baseTokenObj) { + logger.error(`Base token not found: ${baseToken}`); + throw new Error(`Base token not found: ${baseToken}`); + } + + if (!quoteTokenObj) { + logger.error(`Quote token not found: ${quoteToken}`); + throw new Error(`Quote token not found: ${quoteToken}`); + } + + logger.info(`Base token: ${baseTokenObj.symbol}, address=${baseTokenObj.address}, decimals=${baseTokenObj.decimals}`); + logger.info( + `Quote token: ${quoteTokenObj.symbol}, address=${quoteTokenObj.address}, decimals=${quoteTokenObj.decimals}`, + ); + + // Get the quote with slippage percentage + const quote = await quoteAmmSwap( + sundaeswap, + poolIdent, + baseTokenObj, + quoteTokenObj, + amount, + side as 'BUY' | 'SELL', + slippagePct, + ); + + if (!quote) { + throw new Error('Failed to get swap quote'); + } + + return { + quote, + sundaeswap, + cardano: sundaeswap.cardano, + baseTokenObj, + quoteTokenObj, + }; +} + +export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { + // Import the httpErrors plugin to ensure it's available + await fastify.register(require('@fastify/sensible')); + + fastify.get<{ + Querystring: QuoteSwapRequestType; + Reply: QuoteSwapResponseType; + }>( + '/quote-swap', + { + schema: { + description: 'Get swap quote for Sundaeswap AMM', + tags: ['/connector/sundaeswap/amm'], + querystring: { + ...QuoteSwapRequest, + properties: { + ...QuoteSwapRequest.properties, + network: { type: 'string', default: 'mainnet' }, + baseToken: { type: 'string', examples: ['SUNDAE'] }, + quoteToken: { type: 'string', examples: ['ADA'] }, + amount: { type: 'number', examples: [1000] }, + side: { type: 'string', enum: ['BUY', 'SELL'], examples: ['BUY'] }, + slippagePct: { type: 'number', examples: [1] }, + }, + }, + response: { + 200: { + properties: { + ...QuoteSwapResponse.properties, + }, + }, + }, + }, + }, + async (request) => { + try { + const { + network, + poolAddress: requestedpoolIdent, + baseToken, + quoteToken, + amount, + side, + slippagePct, + } = request.query; + + const networkToUse = network || 'mainnet'; + const slippageToUse = slippagePct || 1; // Default to 1% if not provided + + const sundaeswap = await Sundaeswap.getInstance(networkToUse); + let poolIdent = requestedpoolIdent; + + if (!poolIdent) { + // Look up the pool from configuration pools dictionary + poolIdent = await sundaeswap.findDefaultPool(baseToken, quoteToken, 'amm'); + + if (!poolIdent) { + throw fastify.httpErrors.notFound(`No AMM pool found for pair ${baseToken}-${quoteToken}`); + } + } + + return await formatSwapQuote( + fastify, + networkToUse, + poolIdent, + baseToken, + quoteToken, + amount, + side as 'BUY' | 'SELL', + slippageToUse, + ); + } catch (e) { + logger.error(`Error in quote-swap route: ${e.message}`); + + // If it's already a Fastify HTTP error, re-throw it + if (e.statusCode) { + throw e; + } + + // Check for specific error types + if (e.message?.includes('Insufficient liquidity')) { + throw fastify.httpErrors.badRequest(e.message); + } + if (e.message?.includes('Pool not found') || e.message?.includes('No AMM pool found')) { + throw fastify.httpErrors.notFound(e.message); + } + if (e.message?.includes('token not found')) { + throw fastify.httpErrors.badRequest(e.message); + } + + // Default to internal server error with the actual error message + throw fastify.httpErrors.internalServerError(`Error getting swap quote: ${e.message || 'Unknown error'}`); + } + }, + ); +}; + +export default quoteSwapRoute; diff --git a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts new file mode 100644 index 0000000000..4d06499471 --- /dev/null +++ b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts @@ -0,0 +1,195 @@ +import { EDatumType, IWithdrawConfigArgs, TSupportedNetworks } from '@aiquant/sundaeswap-core'; +import { DatumBuilderLucidV3, TxBuilderLucidV3 } from '@aiquant/sundaeswap-core/lucid'; +import { AssetAmount } from '@sundaeswap/asset'; +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync } from 'fastify'; + +import { + RemoveLiquidityRequestType, + RemoveLiquidityRequest, + RemoveLiquidityResponseType, + RemoveLiquidityResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Sundaeswap } from '../sundaeswap'; + +export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { + fastify.post<{ + Body: RemoveLiquidityRequestType; + Reply: RemoveLiquidityResponseType; + }>( + '/remove-liquidity', + { + schema: { + description: 'Remove liquidity from a Sundaeswap pool', + tags: ['/connector/sundaeswap/amm'], + body: { + ...RemoveLiquidityRequest, + properties: { + ...RemoveLiquidityRequest.properties, + network: { type: 'string', default: 'mainnet' }, + walletAddress: { type: 'string', examples: [''] }, + poolAddress: { type: 'string', examples: [''] }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['SUNDAE'] }, + percentageToRemove: { type: 'number', examples: [100] }, + }, + }, + response: { 200: RemoveLiquidityResponse }, + }, + }, + async (request) => { + try { + const { + network, + poolAddress: requestedPoolAddress, + percentageToRemove, + walletAddress: requestedWalletAddress, + } = request.body; + + const networkToUse = network || 'mainnet'; + + if (!percentageToRemove) { + throw fastify.httpErrors.badRequest('Missing required parameters'); + } + + if (percentageToRemove <= 0 || percentageToRemove > 100) { + throw fastify.httpErrors.badRequest('Percentage to remove must be between 0 and 100'); + } + + const sundaeswap = await Sundaeswap.getInstance(networkToUse); + + let walletAddress = requestedWalletAddress; + if (!walletAddress) { + walletAddress = await sundaeswap.cardano.getFirstWalletAddress(); + if (!walletAddress) { + throw fastify.httpErrors.badRequest('No wallet address provided and no default wallet found'); + } + logger.info(`Using first available wallet address: ${walletAddress}`); + } + + if (!requestedPoolAddress) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); + } + + const poolInfo = await sundaeswap.getAmmPoolInfo(requestedPoolAddress); + + const baseTokenAddress = poolInfo.baseTokenAddress; + const quoteTokenAddress = poolInfo.quoteTokenAddress; + + const baseToken = await sundaeswap.cardano.getTokenByAddress(baseTokenAddress); + const quoteToken = await sundaeswap.cardano.getTokenByAddress(quoteTokenAddress); + + if (!baseToken || !quoteToken) { + throw fastify.httpErrors.badRequest(`Token not found: ${!baseToken ? 'base' : 'quote'}`); + } + + let poolAddress = requestedPoolAddress; + if (!poolAddress) { + poolAddress = await sundaeswap.findDefaultPool(baseToken.symbol, quoteToken.symbol, 'amm'); + if (!poolAddress) { + throw fastify.httpErrors.notFound(`No AMM pool found for pair ${baseToken.symbol}-${quoteToken.symbol}`); + } + } + + const poolData = await sundaeswap.getPoolData(poolAddress); + const wallet = await sundaeswap.cardano.getWalletFromAddress(walletAddress); + sundaeswap.cardano.lucidInstance.selectWalletFromPrivateKey(wallet); + const utxos = await sundaeswap.cardano.lucidInstance.utxosAt(walletAddress); + + // Calculate withdrawal amounts + const totalLpInWallet = sundaeswap.calculateAssetAmount(utxos, poolData.assetLP); + const withdrawalAmount = BigInt((BigInt(totalLpInWallet) * BigInt(percentageToRemove)) / BigInt(100)); + + // Define the LP Token to withdraw + const lpTokenAmount = new AssetAmount(withdrawalAmount, poolData.assetLP); + + // Build withdraw arguments + const withdrawArgs: IWithdrawConfigArgs = { + suppliedLPAsset: lpTokenAmount, + pool: poolData, + orderAddresses: { + DestinationAddress: { + address: walletAddress, + datum: { + type: EDatumType.NONE, + }, + }, + }, + }; + + // Initialize transaction builder + const txBuilder = new TxBuilderLucidV3( + sundaeswap.cardano.lucidInstance, + new DatumBuilderLucidV3(network as TSupportedNetworks), + ); + + // Execute withdrawal transaction + const result = await txBuilder.withdraw({ ...withdrawArgs }); + + // Build the transaction + const builtTx = await result.build(); + const { submit, cbor } = await builtTx.sign(); + const txHash = await submit(); + + // Calculate withdrawal amounts with correct asset mapping + const totalLpSupply = poolData.liquidity.lpTotal; + const lpTokensToWithdraw = withdrawalAmount; + + // Calculate the proportion of the pool being withdrawn + const withdrawalProportion = Number(lpTokensToWithdraw) / Number(totalLpSupply); + + // Map base/quote tokens to correct reserves based on pool structure + const baseTokenId = + baseToken.symbol === 'ADA' ? 'ada.lovelace' : `${baseToken.policyId}.${baseToken.assetName}`; + + const quoteTokenId = + quoteToken.symbol === 'ADA' ? 'ada.lovelace' : `${quoteToken.policyId}.${quoteToken.assetName}`; + + // Get asset IDs from pool data + const assetAId = poolData.assetA.assetId.trim(); + const assetBId = poolData.assetB.assetId.trim(); + + let baseTokenReserve: bigint; + let quoteTokenReserve: bigint; + + if (baseTokenId === assetAId) { + // Base token is assetA, quote token is assetB + baseTokenReserve = poolData.liquidity.aReserve; + quoteTokenReserve = poolData.liquidity.bReserve; + } else if (baseTokenId === assetBId) { + // Base token is assetB, quote token is assetA + baseTokenReserve = poolData.liquidity.bReserve; + quoteTokenReserve = poolData.liquidity.aReserve; + } else { + throw new Error(`Base token ${baseToken.symbol} not found in pool`); + } + + // Calculate correct withdrawal amounts with proper decimals + const baseTokenAmountRaw = Number(baseTokenReserve) * withdrawalProportion; + const quoteTokenAmountRaw = Number(quoteTokenReserve) * withdrawalProportion; + + const baseTokenAmountRemoved = baseTokenAmountRaw / Math.pow(10, baseToken.decimals); + const quoteTokenAmountRemoved = quoteTokenAmountRaw / Math.pow(10, quoteToken.decimals); + + return { + signature: txHash, + status: 1, + data: { + fee: builtTx.builtTx.fee, + baseTokenAmountRemoved, + quoteTokenAmountRemoved, + }, + }; + } catch (e) { + logger.error(e); + if (e.statusCode) { + throw e; + } + throw fastify.httpErrors.internalServerError('Failed to remove liquidity'); + } + }, + ); +}; + +export default removeLiquidityRoute; diff --git a/src/connectors/sundaeswap/sundaeswap.config.ts b/src/connectors/sundaeswap/sundaeswap.config.ts new file mode 100644 index 0000000000..81f1561290 --- /dev/null +++ b/src/connectors/sundaeswap/sundaeswap.config.ts @@ -0,0 +1,59 @@ +import { ConfigManagerV2 } from '../../services/config-manager-v2'; + +interface AvailableNetworks { + chain: string; + networks: Array; +} + +export namespace SundaeswapConfig { + // Supported networks for Sundaeswap + export const chain = 'cardano'; + export const networks = ['mainnet', 'preview']; + // Supported trading types + export const tradingTypes = ['amm'] as const; + + export interface PoolsConfig { + [pairKey: string]: string; + } + + export interface NetworkConfig { + // Pool configurations + amm: PoolsConfig; + } + + export interface NetworkPoolsConfig { + // Dictionary of predefined pool addresses and settings by network + [network: string]: NetworkConfig; + } + + export interface RootConfig { + // Global configuration + allowedSlippage: string; + + // Network-specific configurations + networks: NetworkPoolsConfig; + + // Available networks + availableNetworks: Array; + } + + export const config: RootConfig = { + // Global configuration + allowedSlippage: ConfigManagerV2.getInstance().get('sundaeswap.allowedSlippage'), + + // Network-specific pools + networks: ConfigManagerV2.getInstance().get('sundaeswap.networks'), + + availableNetworks: [ + { + chain: 'cardano', + networks: ['mainnet', 'preview'], + }, + ], + }; + + // Helper methods to get pools for a specific network + export const getNetworkPools = (network: string, poolType: 'amm'): PoolsConfig => { + return config.networks[network]?.[poolType] || {}; + }; +} diff --git a/src/connectors/sundaeswap/sundaeswap.routes.ts b/src/connectors/sundaeswap/sundaeswap.routes.ts new file mode 100644 index 0000000000..22bf0e5be0 --- /dev/null +++ b/src/connectors/sundaeswap/sundaeswap.routes.ts @@ -0,0 +1,34 @@ +import sensible from '@fastify/sensible'; +import type { FastifyPluginAsync } from 'fastify'; + +import { addLiquidityRoute as ammAddLiquidityRoute } from './amm-routes/addLiquidity'; +import { executeSwapRoute as ammExecuteSwapRoute } from './amm-routes/executeSwap'; +import { ammPoolInfoRoute } from './amm-routes/poolInfo'; +import quoteLiquidityRoute from './amm-routes/quoteLiquidity'; +import { quoteSwapRoute as ammQuoteSwapRoute } from './amm-routes/quoteSwap'; +import { removeLiquidityRoute as ammRemoveLiquidityRoute } from './amm-routes/removeLiquidity'; + +// AMM routes including swap endpoints +const sundaeswapAmmRoutes: FastifyPluginAsync = async (fastify) => { + await fastify.register(sensible); + + await fastify.register(async (instance) => { + instance.addHook('onRoute', (routeOptions) => { + if (routeOptions.schema && routeOptions.schema.tags) { + routeOptions.schema.tags = ['/connector/sundaeswap/amm']; + } + }); + + await instance.register(ammPoolInfoRoute); + await instance.register(ammQuoteSwapRoute); + await instance.register(quoteLiquidityRoute); + await instance.register(ammExecuteSwapRoute); + await instance.register(ammAddLiquidityRoute); + await instance.register(ammRemoveLiquidityRoute); + }); +}; + +// Main export that combines all routes +export const sundaeswapRoutes = { + amm: sundaeswapAmmRoutes, +}; diff --git a/src/connectors/sundaeswap/sundaeswap.ts b/src/connectors/sundaeswap/sundaeswap.ts new file mode 100644 index 0000000000..8d4e1b0a7e --- /dev/null +++ b/src/connectors/sundaeswap/sundaeswap.ts @@ -0,0 +1,160 @@ +// Monkey-patch Math.pow to support BigInt when both arguments are BigInts. +const originalMathPow = Math.pow; +Math.pow = function (base, exponent) { + if (typeof base === 'bigint' && typeof exponent === 'bigint') { + return base ** exponent; // Use BigInt exponentiation operator. + } + return originalMathPow(base, exponent); +}; + +import { PrivateKey, UTxO } from '@aiquant/lucid-cardano'; +import { IPoolDataAsset, QueryProviderSundaeSwap, TSupportedNetworks } from '@aiquant/sundaeswap-core'; + +import { Cardano } from '../../chains/cardano/cardano'; +import { PoolInfo } from '../../schemas/amm-schema'; +import { percentRegexp, ConfigManagerV2 } from '../../services/config-manager-v2'; +import { logger } from '../../services/logger'; + +import { SundaeswapConfig } from './sundaeswap.config'; +import { isFractionString } from './sundaeswap.utils'; + +export class Sundaeswap { + private static _instances: { [name: string]: Sundaeswap }; + public cardano: Cardano; + public config: SundaeswapConfig.RootConfig; + private owner?: PrivateKey; + // Network information + private networkName: string; + + private constructor(network: string) { + this.networkName = network; + this.config = SundaeswapConfig.config as SundaeswapConfig.RootConfig; + this.cardano = null; + } + + /** Gets singleton instance of Sundaeswap */ + public static async getInstance(network: string): Promise { + if (!Sundaeswap._instances) { + Sundaeswap._instances = {}; + } + + if (!Sundaeswap._instances[network]) { + const instance = new Sundaeswap(network); + await instance.init(network); + Sundaeswap._instances[network] = instance; + } + + return Sundaeswap._instances[network]; + } + + /** Initializes Sundaeswap instance */ + private async init(network: string) { + try { + this.cardano = await Cardano.getInstance(network); + + // Load first wallet if available + const walletAddress = await this.cardano.getFirstWalletAddress(); + if (walletAddress) { + this.owner = await this.cardano.getWalletFromAddress(walletAddress); + } + + logger.info('Sundaeswap initialized' + (walletAddress ? ` with wallet: ${walletAddress}` : 'with no wallet')); + } catch (error) { + logger.error('Sundaeswap initialization failed:', error); + throw error; + } + } + + /** + * Gets the allowed slippage percentage from config + * @returns Slippage as a percentage (e.g., 1.0 for 1%) + */ + getSlippagePct(): number { + const allowedSlippage = SundaeswapConfig.config.allowedSlippage; + const nd = allowedSlippage.match(percentRegexp); + let slippage = 0.0; + if (nd) { + slippage = Number(nd[1]) / Number(nd[2]); + } else { + logger.error('Failed to parse slippage value:', allowedSlippage); + } + return slippage * 100; + } + + private getPairKey(baseToken: string, quoteToken: string): string { + return `${baseToken}-${quoteToken}`; + } + + async findDefaultPool(baseToken: string, quoteToken: string, routeType: 'amm'): Promise { + // Get the network-specific pools + const network = this.cardano.network; + const pools = SundaeswapConfig.getNetworkPools(network, routeType); + + if (!pools) return null; + + const pairKey = this.getPairKey(baseToken, quoteToken); + const reversePairKey = this.getPairKey(quoteToken, baseToken); + + return pools[pairKey] || pools[reversePairKey] || null; + } + + async getAmmPoolInfo(ident: string): Promise { + const queryProvider = new QueryProviderSundaeSwap(this.networkName as TSupportedNetworks); + const raw = await queryProvider.findPoolData({ ident }); + + const aReserveSmallest = raw.liquidity.aReserve / BigInt(10 ** raw.assetA.decimals); + const bReserveSmallest = raw.liquidity.bReserve / BigInt(10 ** raw.assetB.decimals); + + const info: PoolInfo = { + address: raw.ident, + baseTokenAddress: raw.assetA.assetId, + quoteTokenAddress: raw.assetB.assetId, + feePct: raw.currentFee * 100, + price: raw.liquidity.aReserve > 0n ? Number(aReserveSmallest) / Number(bReserveSmallest) : 0, + baseTokenAmount: Number(raw.liquidity.aReserve), // ← explicit cast + quoteTokenAmount: Number(raw.liquidity.bReserve), // ← explicit cast + }; + + return info; + } + + /** + * Get the allowed slippage as a decimal from string or config + * @param allowedSlippageStr Optional string representation of slippage value + * @returns A decimal number (e.g., 0.05 for 5%) + */ + public getAllowedSlippage(allowedSlippageStr?: string): number { + if (allowedSlippageStr != null && isFractionString(allowedSlippageStr)) { + const fractionSplit = allowedSlippageStr.split('/'); + return Number(fractionSplit[0]) / Number(fractionSplit[1]); + } + + // Use the global allowedSlippage setting + const allowedSlippage = this.config.allowedSlippage; + + const nd = allowedSlippage.match(percentRegexp); + if (nd) return Number(nd[1]) / Number(nd[2]); + + throw new Error('Encountered a malformed percent string in the config for allowed slippage.'); + } + + public calculateAssetAmount(utxos: UTxO[], asset: IPoolDataAsset): bigint { + return utxos.reduce((acc, utxo) => { + const [policyId, assetName] = asset.assetId.split('.'); + const assetValue = utxo.assets[policyId + assetName]; + if (assetValue) { + return acc + BigInt(assetValue); // Ensure addition is performed with BigInt + } + return acc; + }, 0n); // Initialize the accumulator with BigInt zero + } + + async getPoolData(poolIdent: string) { + const queryProvider = new QueryProviderSundaeSwap(this.networkName as TSupportedNetworks); + + // 2) Fetch the raw pool data + const raw = await queryProvider.findPoolData({ ident: poolIdent }); + + return raw; + } +} diff --git a/src/connectors/sundaeswap/sundaeswap.utils.ts b/src/connectors/sundaeswap/sundaeswap.utils.ts new file mode 100644 index 0000000000..59d713765e --- /dev/null +++ b/src/connectors/sundaeswap/sundaeswap.utils.ts @@ -0,0 +1,65 @@ +import { logger } from '../../services/logger'; +import { SundaeswapConfig } from './sundaeswap.config'; + +/** + * Find a pool Ident for a token pair in the configured pools + * + * @param baseToken Base token symbol + * @param quoteToken Quote token symbol + * @param poolType Type of pool ('amm' or 'clmm') + * @param network Network name (defaults to 'mainnet-beta') + * @returns Pool address or null if not found + */ +export const findPoolIdent = ( + baseToken: string, + quoteToken: string, + poolType: 'amm', + network: string = 'mainnet', +): string | null => { + // Get the network-specific pools + const pools = SundaeswapConfig.getNetworkPools(network, poolType); + if (!pools) return null; + + // Try standard order (BASE-QUOTE) + const standardKey = `${baseToken}-${quoteToken}`; + if (pools[standardKey]) return pools[standardKey]; + + // Try reverse order (QUOTE-BASE) + const reverseKey = `${quoteToken}-${baseToken}`; + if (pools[reverseKey]) return pools[reverseKey]; + + return null; +}; + +/** + * Format token amounts for display + * @param amount The raw amount as a string or number + * @param decimals The token decimals + * @returns The formatted token amount + */ +export const formatTokenAmount = ( + amount: string | number | bigint, + decimals: number, +): number => { + try { + if (typeof amount === 'string') { + return parseFloat(amount) / Math.pow(10, decimals); + } + if (typeof amount === 'bigint') { + return Number(amount) / Math.pow(10, decimals); + } + return amount / Math.pow(10, decimals); + } catch (error) { + logger.error(`Error formatting token amount: ${error}`); + return 0; + } +}; + +/** + * Check if a string is a valid fraction (in the form of 'a/b') + * @param value The string to check + * @returns True if the string is a valid fraction, false otherwise + */ +export function isFractionString(value: string): boolean { + return value.includes('/') && value.split('/').length === 2; +} diff --git a/src/pools/routes/getPool.ts b/src/pools/routes/getPool.ts index 955879e669..78ef629f91 100644 --- a/src/pools/routes/getPool.ts +++ b/src/pools/routes/getPool.ts @@ -23,20 +23,20 @@ export const getPoolRoute: FastifyPluginAsync = async (fastify) => { properties: { tradingPair: { type: 'string', - description: 'Trading pair (e.g., ETH-USDC, SOL-USDC)', - examples: ['ETH-USDC', 'SOL-USDC'], + description: 'Trading pair (e.g., ETH-USDC, SOL-USDC, ADA-MIN)', + examples: ['ETH-USDC', 'SOL-USDC', 'ADA-MIN'], }, }, required: ['tradingPair'], }, querystring: Type.Object({ connector: Type.String({ - description: 'Connector (raydium, meteora, uniswap)', - examples: ['raydium', 'meteora', 'uniswap'], + description: 'Connector (raydium, meteora, uniswap, minswap)', + examples: ['raydium', 'meteora', 'uniswap', 'minswap'], }), network: Type.String({ - description: 'Network name (mainnet, mainnet-beta, etc)', - examples: ['mainnet', 'mainnet-beta'], + description: 'Network name (mainnet, mainnet-beta, preprod, etc)', + examples: ['mainnet', 'mainnet-beta', 'preprod'], }), type: Type.Union([Type.Literal('amm'), Type.Literal('clmm')], { description: 'Pool type', diff --git a/src/pools/routes/removePool.ts b/src/pools/routes/removePool.ts index af324563f7..8c14b82413 100644 --- a/src/pools/routes/removePool.ts +++ b/src/pools/routes/removePool.ts @@ -30,15 +30,16 @@ export const removePoolRoute: FastifyPluginAsync = async (fastify) => { }, querystring: Type.Object({ connector: Type.String({ - description: 'Connector (raydium, meteora, uniswap)', - examples: ['raydium', 'meteora', 'uniswap'], + description: 'Connector (raydium, meteora, uniswap, minswap)', + examples: ['raydium', 'meteora', 'uniswap', 'minswap'], }), network: Type.String({ - description: 'Network name (mainnet, mainnet-beta, etc)', - examples: ['mainnet', 'mainnet-beta'], + description: 'Network name (mainnet, mainnet-beta, preprod, etc)', + examples: ['mainnet', 'mainnet-beta', 'preprod'], }), type: Type.Union([Type.Literal('amm'), Type.Literal('clmm')], { description: 'Pool type', + examples: ['amm', 'clmm'], }), }), response: { diff --git a/src/pools/schemas.ts b/src/pools/schemas.ts index fc71cd3a12..e57111d12f 100644 --- a/src/pools/schemas.ts +++ b/src/pools/schemas.ts @@ -3,13 +3,13 @@ import { Type } from '@sinclair/typebox'; // Pool list request export const PoolListRequestSchema = Type.Object({ connector: Type.String({ - description: 'Connector (raydium, meteora, uniswap)', - examples: ['raydium', 'meteora', 'uniswap'], + description: 'Connector (raydium, meteora, uniswap, minswap)', + examples: ['raydium', 'meteora', 'uniswap', 'minswap'], }), network: Type.Optional( Type.String({ description: 'Optional: filter by network (mainnet, mainnet-beta, etc)', - examples: ['mainnet', 'mainnet-beta', 'base'], + examples: ['mainnet', 'mainnet-beta', 'base', 'preprod'], }), ), type: Type.Optional( @@ -38,23 +38,23 @@ export const PoolListResponseSchema = Type.Array( // Add pool request export const PoolAddRequestSchema = Type.Object({ connector: Type.String({ - description: 'Connector (raydium, meteora, uniswap)', - examples: ['raydium', 'meteora', 'uniswap'], + description: 'Connector (raydium, meteora, uniswap, minswap)', + examples: ['raydium', 'meteora', 'uniswap', 'minswap'], }), type: Type.Union([Type.Literal('amm'), Type.Literal('clmm')], { description: 'Pool type', }), network: Type.String({ description: 'Network name (mainnet, mainnet-beta, etc)', - examples: ['mainnet', 'mainnet-beta'], + examples: ['mainnet', 'mainnet-beta', 'preprod'], }), baseSymbol: Type.String({ description: 'Base token symbol', - examples: ['ETH', 'SOL'], + examples: ['ETH', 'SOL', 'ADA'], }), quoteSymbol: Type.String({ description: 'Quote token symbol', - examples: ['USDC', 'USDT'], + examples: ['USDC', 'USDT', 'MIN'], }), address: Type.String({ description: 'Pool contract address', diff --git a/src/pools/types.ts b/src/pools/types.ts index 48e102affa..b806d3b94d 100644 --- a/src/pools/types.ts +++ b/src/pools/types.ts @@ -19,6 +19,8 @@ export enum SupportedConnector { PANCAKESWAP = 'pancakeswap', ZEROX = '0x', JUPITER = 'jupiter', + MINSWAP = 'minswap', + SUNDAESWAP = 'sundaeswap', } export function isSupportedConnector(connector: string): connector is SupportedConnector { diff --git a/src/services/connection-manager.ts b/src/services/connection-manager.ts index 400fe795c7..1afc7281dc 100644 --- a/src/services/connection-manager.ts +++ b/src/services/connection-manager.ts @@ -1,3 +1,4 @@ +import { Cardano } from '../chains/cardano/cardano'; import { Ethereum } from '../chains/ethereum/ethereum'; import { Solana } from '../chains/solana/solana'; @@ -5,7 +6,7 @@ export interface Chain { // TODO: Add shared chain properties (e.g., network, chainId, etc.) } -export type ChainInstance = Ethereum | Solana; +export type ChainInstance = Ethereum | Solana | Cardano; export class UnsupportedChainException extends Error { constructor(message?: string) { @@ -32,7 +33,7 @@ export async function getInitializedChain<_T>(chain: string, network: string): P */ export function getSupportedChains(): string[] { // These should match the chains in getChainInstance - return ['ethereum', 'solana']; + return ['ethereum', 'solana', 'cardano']; } export async function getChainInstance(chain: string, network: string): Promise { @@ -43,6 +44,9 @@ export async function getChainInstance(chain: string, network: string): Promise< connection = await Ethereum.getInstance(network); } else if (chainLower === 'solana') { connection = await Solana.getInstance(network); + } else if (chainLower === 'cardano') { + // initialize Cardano + connection = await Cardano.getInstance(network); } else { connection = undefined; } diff --git a/src/services/pool-service.ts b/src/services/pool-service.ts index ff0087fc99..029dd02ea6 100644 --- a/src/services/pool-service.ts +++ b/src/services/pool-service.ts @@ -98,6 +98,8 @@ export class PoolService { return SupportedChain.ETHEREUM; case 'solana': return SupportedChain.SOLANA; + case 'cardano': + return SupportedChain.CARDANO; default: throw new Error(`Unsupported chain '${connectorInfo.chain}' for connector: ${connector}`); } @@ -134,6 +136,7 @@ export class PoolService { if (!fs.existsSync(poolListPath)) { // Initialize from template if available const initialPools = await this.initializePoolList(connector); + if (initialPools.length > 0) { await this.savePoolList(connector, initialPools); return initialPools; @@ -281,6 +284,18 @@ export class PoolService { if (!ethers.utils.isAddress(pool.address)) { throw new Error('Invalid Ethereum pool address'); } + } else if (chain === SupportedChain.CARDANO) { + // Basic validation for all pool addresses + const address = pool.address; + if (!address || typeof address !== 'string') { + throw new Error('Pool address is required and must be a string'); + } + + // Pool addresses are hexadecimal script hashes + const hexRegex = /^[0-9a-fA-F]+$/; + if (!hexRegex.test(address)) { + throw new Error('Pool address must be a valid hexadecimal string'); + } } } diff --git a/src/services/token-service.ts b/src/services/token-service.ts index 9c349fb86b..b14962a0de 100644 --- a/src/services/token-service.ts +++ b/src/services/token-service.ts @@ -228,6 +228,56 @@ export class TokenService { } break; + case SupportedChain.CARDANO: + try { + // Validate Cardano address format + const address = token.address; + // Special case for ADA (lovelace) - represented as empty string or "lovelace" + if ( + address === '' || + address.toLowerCase() === 'lovelace' || + address.toLowerCase() === 'ada' || + address.toLowerCase() === 'ada.lovelace' + ) { + break; // Valid ADA token + } + + // Check for required dot notation format: policyId.assetName + if (!address.includes('.')) { + throw new Error('Invalid format. Expected policyId.assetName with dot separator'); + } + + const parts = address.split('.'); + if (parts.length !== 2) { + throw new Error('Invalid format. Expected exactly one dot separator (policyId.assetName)'); + } + + const [policyId, assetName] = parts; + + // Validate policy ID (must be exactly 56 hex characters) + const policyIdRegex = /^[0-9a-fA-F]{56}$/; + if (!policyIdRegex.test(policyId)) { + throw new Error('Invalid policy ID. Must be exactly 56 hex characters (28 bytes)'); + } + + // Validate asset name (hex characters, even length, max 64 characters) + const assetNameRegex = /^[0-9a-fA-F]*$/; + if (!assetNameRegex.test(assetName)) { + throw new Error('Asset name must contain only hexadecimal characters'); + } + + if (assetName.length > 64) { + throw new Error('Asset name too long. Maximum 64 hex characters (32 bytes)'); + } + + if (assetName.length % 2 !== 0) { + throw new Error('Asset name must have even number of hex characters (complete bytes)'); + } + } catch (error) { + throw new Error(`Invalid Cardano Token address: ${error.message}`); + } + break; + default: throw new Error(`Unsupported chain for validation: ${chain}`); } diff --git a/src/templates/chains/cardano.yml b/src/templates/chains/cardano.yml new file mode 100644 index 0000000000..727aae04f6 --- /dev/null +++ b/src/templates/chains/cardano.yml @@ -0,0 +1,2 @@ +defaultNetwork: mainnet +defaultWallet: '' \ No newline at end of file diff --git a/src/templates/chains/cardano/mainnet.yml b/src/templates/chains/cardano/mainnet.yml new file mode 100644 index 0000000000..622105d42c --- /dev/null +++ b/src/templates/chains/cardano/mainnet.yml @@ -0,0 +1,4 @@ +chainID: 1 +nativeCurrencySymbol: 'ADA' +apiurl: 'https://cardano-mainnet.blockfrost.io/api/v0' +projectId: 'your_api_key' \ No newline at end of file diff --git a/src/templates/chains/cardano/preprod.yml b/src/templates/chains/cardano/preprod.yml new file mode 100644 index 0000000000..b6c2ce415c --- /dev/null +++ b/src/templates/chains/cardano/preprod.yml @@ -0,0 +1,4 @@ +chainID: 0 +nativeCurrencySymbol: 'ADA' +apiurl: 'https://cardano-preprod.blockfrost.io/api/v0' +projectId: 'your_api_key' \ No newline at end of file diff --git a/src/templates/chains/cardano/preview.yml b/src/templates/chains/cardano/preview.yml new file mode 100644 index 0000000000..cb52ded4fd --- /dev/null +++ b/src/templates/chains/cardano/preview.yml @@ -0,0 +1,4 @@ +chainID: 0 +nativeCurrencySymbol: 'ADA' +apiurl: 'https://cardano-preview.blockfrost.io/api/v0' +projectId: 'your_api_key' \ No newline at end of file diff --git a/src/templates/connectors/minswap.yml b/src/templates/connectors/minswap.yml new file mode 100644 index 0000000000..5b297f6010 --- /dev/null +++ b/src/templates/connectors/minswap.yml @@ -0,0 +1,20 @@ +# Global settings for Minswap +# how much the execution price is allowed to move unfavorably +allowedSlippage: '1/100' + +# Network-specific pool configurations +networks: + # Cardano mainnet pools + mainnet: + # AMM pools for Cardano mainnet + amm: + # Format: base-quote: pool_address + ADA-MIN: '6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2' + + # Cardano preprod pools + preprod: + # AMM pools for Cardano preprod + amm: + # Format: base-quote: pool_address + ADA-MIN: '3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d' + ADA-USDM: '3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d' \ No newline at end of file diff --git a/src/templates/connectors/sundaeswap.yml b/src/templates/connectors/sundaeswap.yml new file mode 100644 index 0000000000..9927720322 --- /dev/null +++ b/src/templates/connectors/sundaeswap.yml @@ -0,0 +1,22 @@ +# Global settings for Minswap +# how much the execution price is allowed to move unfavorably +allowedSlippage: '1/100' + +# Network-specific pool configurations +networks: + # Cardano mainnet pools + mainnet: + # AMM pools for Cardano mainnet + amm: + # Format: base-quote: pool_address + ADA-SUNDAE: '2f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773' + + # Cardano preview pools + preview: + # AMM pools for Cardano preprod + amm: + # Format: base-quote: pool_address + ADA-SBERRY: '2baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3' + + + diff --git a/src/templates/namespace/cardano-chain-schema.json b/src/templates/namespace/cardano-chain-schema.json new file mode 100644 index 0000000000..f54e2e6d3a --- /dev/null +++ b/src/templates/namespace/cardano-chain-schema.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "defaultNetwork": { + "type": "string", + "description": "Default network for Ethereum operations" + }, + "defaultWallet": { + "type": "string", + "description": "Default wallet address for examples and testing" + } + }, + "required": ["defaultNetwork", "defaultWallet"], + "additionalProperties": false +} diff --git a/src/templates/namespace/cardano-network-schema.json b/src/templates/namespace/cardano-network-schema.json new file mode 100644 index 0000000000..afd6c81fc6 --- /dev/null +++ b/src/templates/namespace/cardano-network-schema.json @@ -0,0 +1,15 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "chainID": { "type": "integer" }, + "nativeCurrencySymbol": { "type": "string" }, + "apiurl": { "type": "string" }, + "projectId": { + "type": "string", + "description": "Blockfrost Project ID for Cardano operations" + } + }, + "required": ["chainID", "apiurl", "nativeCurrencySymbol", "projectId"], + "additionalProperties": false +} diff --git a/src/templates/namespace/minswap-schema.json b/src/templates/namespace/minswap-schema.json new file mode 100644 index 0000000000..477ddc589d --- /dev/null +++ b/src/templates/namespace/minswap-schema.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "allowedSlippage": { "type": "string" }, + "networks": { + "type": "object", + "patternProperties": { + "^\\w+(-\\w+)?$": { + "type": "object", + "properties": { + "amm": { + "type": "object", + "patternProperties": { + "^[A-Za-z0-9.-]+-[A-Za-z0-9.-]+$": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": ["amm"], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "required": ["allowedSlippage", "networks"] +} diff --git a/src/templates/namespace/sundaeswap-schema.json b/src/templates/namespace/sundaeswap-schema.json new file mode 100644 index 0000000000..477ddc589d --- /dev/null +++ b/src/templates/namespace/sundaeswap-schema.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "allowedSlippage": { "type": "string" }, + "networks": { + "type": "object", + "patternProperties": { + "^\\w+(-\\w+)?$": { + "type": "object", + "properties": { + "amm": { + "type": "object", + "patternProperties": { + "^[A-Za-z0-9.-]+-[A-Za-z0-9.-]+$": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": ["amm"], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "required": ["allowedSlippage", "networks"] +} diff --git a/src/templates/pools/minswap.json b/src/templates/pools/minswap.json new file mode 100644 index 0000000000..ff93e1bf72 --- /dev/null +++ b/src/templates/pools/minswap.json @@ -0,0 +1,23 @@ +[ + { + "type": "amm", + "network": "mainnet", + "baseSymbol": "ADA", + "quoteSymbol": "MIN", + "address": "6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2" + }, + { + "type": "amm", + "network": "preprod", + "baseSymbol": "ADA", + "quoteSymbol": "MIN", + "address": "3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d" + }, + { + "type": "amm", + "network": "preprod", + "baseSymbol": "ADA", + "quoteSymbol": "USDM", + "address": "3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d" + } +] diff --git a/src/templates/pools/sundaeswap.json b/src/templates/pools/sundaeswap.json new file mode 100644 index 0000000000..239fa64449 --- /dev/null +++ b/src/templates/pools/sundaeswap.json @@ -0,0 +1,16 @@ +[ + { + "type": "amm", + "network": "mainnet", + "baseSymbol": "ADA", + "quoteSymbol": "SUNDAE", + "address": "2f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773" + }, + { + "type": "amm", + "network": "preview", + "baseSymbol": "ADA", + "quoteSymbol": "SBERRY", + "address": "2baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3" + } +] diff --git a/src/templates/root.yml b/src/templates/root.yml index 338fa6dafc..5510f711e3 100644 --- a/src/templates/root.yml +++ b/src/templates/root.yml @@ -9,9 +9,6 @@ configurations: configurationPath: chains/ethereum.yml schemaPath: ethereum-chain-schema.json - $namespace solana: - configurationPath: chains/solana.yml - schemaPath: solana-chain-schema.json # Ethereum networks $namespace ethereum-mainnet: @@ -51,6 +48,10 @@ configurations: schemaPath: ethereum-network-schema.json # Solana networks + $namespace solana: + configurationPath: chains/solana.yml + schemaPath: solana-chain-schema.json + $namespace solana-mainnet-beta: configurationPath: chains/solana/mainnet-beta.yml schemaPath: solana-network-schema.json @@ -64,6 +65,7 @@ configurations: configurationPath: connectors/uniswap.yml schemaPath: uniswap-schema.json + $namespace jupiter: configurationPath: connectors/jupiter.yml schemaPath: jupiter-schema.json @@ -92,3 +94,28 @@ configurations: $namespace infura: configurationPath: rpc/infura.yml schemaPath: infura-schema.json + + # Cardano networks + $namespace cardano: + configurationPath: chains/cardano.yml + schemaPath: cardano-chain-schema.json + + $namespace cardano-mainnet: + configurationPath: chains/cardano/mainnet.yml + schemaPath: cardano-network-schema.json + + $namespace cardano-preprod: + configurationPath: chains/cardano/preprod.yml + schemaPath: cardano-network-schema.json + + $namespace cardano-preview: + configurationPath: chains/cardano/preview.yml + schemaPath: cardano-network-schema.json + + $namespace minswap: + configurationPath: connectors/minswap.yml + schemaPath: minswap-schema.json + + $namespace sundaeswap: + configurationPath: connectors/sundaeswap.yml + schemaPath: sundaeswap-schema.json \ No newline at end of file diff --git a/src/templates/tokens/cardano/mainnet.json b/src/templates/tokens/cardano/mainnet.json new file mode 100644 index 0000000000..ec837f7871 --- /dev/null +++ b/src/templates/tokens/cardano/mainnet.json @@ -0,0 +1,42 @@ +[ + { + "policyId": "29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6", + "assetName": "4d494e", + "decimals": 6, + "name": "Minswap Token", + "symbol": "MIN", + "address": "29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6.4d494e" + }, + { + "policyId": "9a9693a9a37912a5097918f97918d15240c92ab729a0b7c4aa144d77", + "assetName": "53554e444145", + "decimals": 6, + "name": "SUNDAE Token", + "symbol": "SUNDAE", + "address": "9a9693a9a37912a5097918f97918d15240c92ab729a0b7c4aa144d77.53554e444145" + }, + { + "policyId": "", + "assetName": "", + "decimals": 6, + "name": "Cardano Native Token", + "symbol": "ADA", + "address": "ada.lovelace" + }, + { + "policyId": "e0302560ced2fdcbfcb2602697df970cd0d6a38f94b32703f51c312b", + "assetName": "0014df102f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773", + "decimals": 0, + "name": "SundaeSwap LP Token", + "symbol": "LP-SUNDAE", + "address": "e0302560ced2fdcbfcb2602697df970cd0d6a38f94b32703f51c312b.0014df102f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773" + }, + { + "policyId": "f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c", + "assetName": "82e2b1fd27a7712a1a9cf750dfbea1a5778611b20e06dd6a611df7a643f8cb75", + "decimals": 0, + "name": "Minswap LP Token", + "symbol": "LP-MIN", + "address": "addr1z84q0denmyep98ph3tmzwsmw0j7zau9ljmsqx6a4rvaau66j2c79gy9l76sdg0xwhd7r0c0kna0tycz4y5s6mlenh8pq777e2a.0014df102f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773" + } +] diff --git a/src/templates/tokens/cardano/preprod.json b/src/templates/tokens/cardano/preprod.json new file mode 100644 index 0000000000..374f439e64 --- /dev/null +++ b/src/templates/tokens/cardano/preprod.json @@ -0,0 +1,34 @@ +[ + { + "policyId": "e16c2dc8ae937e8d3790c7fd7168d7b994621ba14ca11415f39fed72", + "assetName": "4d494e", + "decimals": 0, + "name": "Minswap Token", + "symbol": "MIN", + "address": "e16c2dc8ae937e8d3790c7fd7168d7b994621ba14ca11415f39fed72.4d494e" + }, + { + "policyId": "", + "assetName": "", + "decimals": 6, + "name": "Cardano Native Token", + "symbol": "ADA", + "address": "ada.lovelace" + }, + { + "policyId": "e4214b7cce62ac6fbba385d164df48e157eae5863521b4b67ca71d86", + "assetName": "3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d", + "decimals": 0, + "name": "Minswap Liquidity pool token", + "symbol": "LP", + "address": "e4214b7cce62ac6fbba385d164df48e157eae5863521b4b67ca71d86.3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d" + }, + { + "policyId": "d4fece6b39f7cd78a3f036b2ae6508c13524b863922da80f68dd9ab7", + "assetName": "5553444d", + "decimals": 6, + "name": "USDM", + "symbol": "USDM", + "address": "d4fece6b39f7cd78a3f036b2ae6508c13524b863922da80f68dd9ab7.5553444d" + } +] diff --git a/src/templates/tokens/cardano/preview.json b/src/templates/tokens/cardano/preview.json new file mode 100644 index 0000000000..4299ea6605 --- /dev/null +++ b/src/templates/tokens/cardano/preview.json @@ -0,0 +1,26 @@ +[ + { + "policyId": "99b071ce8580d6a3a11b4902145adb8bfd0d2a03935af8cf66403e15", + "assetName": "534245525259", + "decimals": 0, + "name": "SBERRY Token", + "symbol": "SBERRY", + "address": "99b071ce8580d6a3a11b4902145adb8bfd0d2a03935af8cf66403e15.534245525259" + }, + { + "policyId": "", + "assetName": "", + "decimals": 6, + "name": "Cardano Native Token", + "symbol": "ADA", + "address": "ada.lovelace" + }, + { + "policyId": "44a1eb2d9f58add4eb1932bd0048e6a1947e85e3fe4f32956a110414", + "assetName": "0014df102baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3", + "decimals": 0, + "name": "Sundaeswap Liquidity pool token", + "symbol": "LP", + "address": "44a1eb2d9f58add4eb1932bd0048e6a1947e85e3fe4f32956a110414.0014df102baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3" + } +] diff --git a/src/tokens/schemas.ts b/src/tokens/schemas.ts index 6e468a9c71..b116c312b9 100644 --- a/src/tokens/schemas.ts +++ b/src/tokens/schemas.ts @@ -28,20 +28,20 @@ export type Token = typeof TokenSchema.static; export const TokenListQuerySchema = Type.Object({ chain: Type.Optional( Type.String({ - description: 'Blockchain network (e.g., ethereum, solana)', - examples: ['ethereum', 'solana'], + description: 'Blockchain network (e.g., ethereum, solana, cardano)', + examples: ['ethereum', 'solana', 'cardano'], }), ), network: Type.Optional( Type.String({ description: 'Network name (e.g., mainnet, mainnet-beta)', - examples: ['mainnet', 'mainnet-beta', 'devnet'], + examples: ['mainnet', 'mainnet-beta', 'devnet', 'preprod'], }), ), search: Type.Optional( Type.String({ description: 'Search term for filtering tokens by symbol or name', - examples: ['USDC', 'USD'], + examples: ['USDC', 'USD', 'ADA'], }), ), }); @@ -51,12 +51,12 @@ export type TokenListQuery = typeof TokenListQuerySchema.static; // Query parameters for viewing a specific token export const TokenViewQuerySchema = Type.Object({ chain: Type.String({ - description: 'Blockchain network (e.g., ethereum, solana)', - examples: ['ethereum', 'solana'], + description: 'Blockchain network (e.g., ethereum, solana, cardano)', + examples: ['ethereum', 'solana', 'cardano'], }), network: Type.String({ description: 'Network name (e.g., mainnet, mainnet-beta)', - examples: ['mainnet', 'mainnet-beta', 'devnet'], + examples: ['mainnet', 'mainnet-beta', 'devnet', 'preprod'], }), }); @@ -65,12 +65,12 @@ export type TokenViewQuery = typeof TokenViewQuerySchema.static; // Request body for adding a token export const TokenAddRequestSchema = Type.Object({ chain: Type.String({ - description: 'Blockchain network (e.g., ethereum, solana)', - examples: ['ethereum', 'solana'], + description: 'Blockchain network (e.g., ethereum, solana, cardano)', + examples: ['ethereum', 'solana', 'cardano'], }), network: Type.String({ description: 'Network name (e.g., mainnet, mainnet-beta)', - examples: ['mainnet', 'mainnet-beta', 'devnet'], + examples: ['mainnet', 'mainnet-beta', 'devnet', 'preprod'], }), token: TokenSchema, }); @@ -80,12 +80,12 @@ export type TokenAddRequest = typeof TokenAddRequestSchema.static; // Query parameters for removing a token export const TokenRemoveQuerySchema = Type.Object({ chain: Type.String({ - description: 'Blockchain network (e.g., ethereum, solana)', - examples: ['ethereum', 'solana'], + description: 'Blockchain network (e.g., ethereum, solana, cardano)', + examples: ['ethereum', 'solana', 'cardano'], }), network: Type.String({ description: 'Network name (e.g., mainnet, mainnet-beta)', - examples: ['mainnet', 'mainnet-beta', 'devnet'], + examples: ['mainnet', 'mainnet-beta', 'devnet', 'preprod'], }), }); diff --git a/src/tokens/types.ts b/src/tokens/types.ts index d87571274f..ac71e989b7 100644 --- a/src/tokens/types.ts +++ b/src/tokens/types.ts @@ -17,6 +17,12 @@ export interface SolanaToken extends Token { // Solana-specific fields can be added here if needed } +export interface CardanoToken extends Token { + // Cardano-specific fields can be added here if needed + policyId: string; + assetName: string; +} + // Token list format export interface TokenList { tokens: Token[]; @@ -29,6 +35,7 @@ export type TokenFileFormat = Token[]; export enum SupportedChain { ETHEREUM = 'ethereum', SOLANA = 'solana', + CARDANO = 'cardano', } // Chain validation diff --git a/src/wallet/routes/removeWallet.ts b/src/wallet/routes/removeWallet.ts index 64fc4299cd..b2f4e174f9 100644 --- a/src/wallet/routes/removeWallet.ts +++ b/src/wallet/routes/removeWallet.ts @@ -2,6 +2,8 @@ import sensible from '@fastify/sensible'; import { Type } from '@sinclair/typebox'; import { FastifyPluginAsync } from 'fastify'; +import { Cardano } from '#src/chains/cardano/cardano'; + import { Ethereum } from '../../chains/ethereum/ethereum'; import { Solana } from '../../chains/solana/solana'; import { logger } from '../../services/logger'; @@ -42,6 +44,8 @@ export const removeWalletRoute: FastifyPluginAsync = async (fastify) => { validatedAddress = Ethereum.validateAddress(address); } else if (chain.toLowerCase() === 'solana') { validatedAddress = Solana.validateAddress(address); + } else if (chain.toLowerCase() === 'cardano') { + validatedAddress = Cardano.validateAddress(address); } else { throw new Error(`Unsupported chain: ${chain}`); } diff --git a/src/wallet/routes/setDefault.ts b/src/wallet/routes/setDefault.ts index b7e6a07986..6dfff2eb68 100644 --- a/src/wallet/routes/setDefault.ts +++ b/src/wallet/routes/setDefault.ts @@ -1,5 +1,7 @@ import { FastifyPluginAsync } from 'fastify'; +import { Cardano } from '#src/chains/cardano/cardano'; + import { Ethereum } from '../../chains/ethereum/ethereum'; import { Solana } from '../../chains/solana/solana'; import { updateDefaultWallet } from '../../config/utils'; @@ -54,6 +56,8 @@ export const setDefaultRoute: FastifyPluginAsync = async (fastify) => { validatedAddress = Ethereum.validateAddress(address); } else if (chain.toLowerCase() === 'solana') { validatedAddress = Solana.validateAddress(address); + } else if (chain.toLowerCase() === 'cardano') { + validatedAddress = Cardano.validateAddress(address); } else { throw new Error(`Unsupported chain: ${chain}`); } diff --git a/src/wallet/schemas.ts b/src/wallet/schemas.ts index 944d07270c..5ac072b7f7 100644 --- a/src/wallet/schemas.ts +++ b/src/wallet/schemas.ts @@ -6,21 +6,10 @@ export const WalletAddressSchema = Type.String({ }); export const AddWalletRequestSchema = Type.Object({ - chain: Type.String({ - description: 'Blockchain to add wallet to', - enum: ['ethereum', 'solana'], - examples: ['solana', 'ethereum'], - }), - privateKey: Type.String({ - description: 'Private key for the wallet', - examples: [''], - }), - setDefault: Type.Optional( - Type.Boolean({ - description: 'Set this wallet as the default for the chain', - default: false, - }), - ), + chain: Type.String(), + privateKey: Type.String(), + network: Type.Optional(Type.String()), + setDefault: Type.Optional(Type.Boolean()), }); export const AddWalletResponseSchema = Type.Object({ @@ -51,8 +40,8 @@ export const GetWalletResponseSchema = Type.Object({ export const RemoveWalletRequestSchema = Type.Object({ chain: Type.String({ description: 'Blockchain to remove wallet from', - enum: ['ethereum', 'solana'], - examples: ['solana', 'ethereum'], + enum: ['ethereum', 'solana', 'cardano'], + examples: ['solana', 'ethereum', 'cardano'], }), address: Type.String({ description: 'Wallet address to remove', @@ -138,8 +127,8 @@ export const ListHardwareWalletsResponseSchema = Type.Object({ export const SetDefaultWalletRequestSchema = Type.Object({ chain: Type.String({ description: 'Blockchain to set default wallet for', - enum: ['ethereum', 'solana'], - examples: ['solana', 'ethereum'], + enum: ['ethereum', 'solana', 'cardano'], + examples: ['solana', 'ethereum', 'cardano'], }), address: Type.String({ description: 'Wallet address to set as default', diff --git a/src/wallet/utils.ts b/src/wallet/utils.ts index 63089ded5b..74cb870e67 100644 --- a/src/wallet/utils.ts +++ b/src/wallet/utils.ts @@ -1,6 +1,7 @@ import { FastifyInstance } from 'fastify'; import fse from 'fs-extra'; +import { Cardano } from '../chains/cardano/cardano'; import { Ethereum } from '../chains/ethereum/ethereum'; import { Solana } from '../chains/solana/solana'; import { updateDefaultWallet } from '../config/utils'; @@ -43,7 +44,7 @@ export function validateChainName(chain: string): boolean { } catch (error) { // Fallback to hardcoded list if there's an error logger.warn(`Failed to get supported chains: ${error.message}. Using fallback list.`); - return ['ethereum', 'solana'].includes(chain.toLowerCase()); + return ['ethereum', 'solana', 'cardano'].includes(chain.toLowerCase()); } } @@ -90,9 +91,16 @@ export async function addWallet(fastify: FastifyInstance, req: AddWalletRequest) // Default to mainnet-beta for Solana or mainnet for other chains const network = req.chain === 'solana' ? 'mainnet-beta' : 'mainnet'; + const cardanoNetwork = req.network ? req.network : 'mainnet'; try { - connection = await getInitializedChain(req.chain, network); + if (req.chain.toLowerCase() === 'cardano') { + connection = await getInitializedChain(req.chain, cardanoNetwork); + // console.log('working upto here!', connection); + } else { + // For Ethereum and Solana, use the default network + connection = await getInitializedChain(req.chain, network); + } } catch (e) { if (e instanceof UnsupportedChainException) { throw fastify.httpErrors.badRequest(`Unrecognized chain name: ${req.chain}`); @@ -111,6 +119,12 @@ export async function addWallet(fastify: FastifyInstance, req: AddWalletRequest) // Further validate Solana address address = Solana.validateAddress(address); encryptedPrivateKey = await connection.encrypt(req.privateKey, passphrase); + } else if (connection instanceof Cardano) { + const cardanoWallet = await connection.getWalletFromPrivateKey(req.privateKey); + address = cardanoWallet.address; + // Further validate Cardano address + address = Cardano.validateAddress(address); + encryptedPrivateKey = await connection.encrypt(req.privateKey, passphrase); } if (address === undefined || encryptedPrivateKey === undefined) { @@ -155,6 +169,8 @@ export async function removeWallet(fastify: FastifyInstance, req: RemoveWalletRe validatedAddress = Ethereum.validateAddress(req.address); } else if (req.chain.toLowerCase() === 'solana') { validatedAddress = Solana.validateAddress(req.address); + } else if (req.chain.toLowerCase() === 'cardano') { + validatedAddress = Cardano.validateAddress(req.address); } else { // This should not happen due to validateChainName check, but just in case throw new Error(`Unsupported chain: ${req.chain}`); @@ -246,7 +262,7 @@ export async function getWallets( await mkdirIfDoesNotExist(walletPath); // Get only valid chain directories - const validChains = ['ethereum', 'solana']; + const validChains = ['ethereum', 'solana', 'cardano']; const allDirs = await getDirectories(walletPath); const chains = allDirs.filter((dir) => validChains.includes(dir.toLowerCase())); @@ -268,6 +284,9 @@ export async function getWallets( } else if (chain.toLowerCase() === 'solana') { // Basic Solana address length check return address.length >= 32 && address.length <= 44; + } else if (chain.toLowerCase() === 'cardano') { + // Basic Cardano address validation (starts with addr or addr_test) + return /^(addr|addr_test)[0-9a-zA-Z]{1,}$/i.test(address); } return false; } catch { diff --git a/test/chains/cardano/cardano.test.js b/test/chains/cardano/cardano.test.js new file mode 100644 index 0000000000..861fbe8252 --- /dev/null +++ b/test/chains/cardano/cardano.test.js @@ -0,0 +1,184 @@ +// test/chains/cardano/cardano.test.js + +const fs = require('fs'); +const path = require('path'); + +const { test, describe, expect, beforeEach } = require('@jest/globals'); +const axios = require('axios'); + +// Constants for this test file +const CHAIN = 'cardano'; +const NETWORK = 'preprod'; // for balance‐endpoint only +const TEST_WALLET = + 'addr_test1vrvqa7ytgmptew2qy3ec0lqdk9n94vcgwu4wy07kqp2he0srll8mg'; + +// Mock API calls +jest.mock('axios'); + +// Helper to load mock responses +function loadMockResponse(name) { + return JSON.parse( + fs.readFileSync(path.join(__dirname, 'mocks', `${name}.json`), 'utf8'), + ); +} + +// Validate balance response shape +function validateBalanceResponse(resp) { + return ( + resp && + typeof resp.network === 'string' && + typeof resp.wallet === 'string' && + Array.isArray(resp.balances) && + resp.balances.every( + (b) => + ['symbol', 'address', 'name', 'balance'].every( + (k) => typeof b[k] === 'string', + ) && typeof b.decimals === 'number', + ) + ); +} + +describe('Cardano Chain Tests (Preprod Network)', () => { + beforeEach(() => { + axios.get = jest.fn(); + axios.post = jest.fn(); + }); + + describe('Balance Endpoint', () => { + test('returns and validates wallet balances', async () => { + const mockResponse = loadMockResponse('balance'); + + axios.get.mockResolvedValueOnce({ + status: 200, + data: mockResponse, + }); + + const response = await axios.get( + `http://localhost:15888/chains/${CHAIN}/balances`, + { + params: { + network: NETWORK, + wallet: TEST_WALLET, + tokens: ['ADA', 'MIN', 'LP'], + }, + }, + ); + + expect(response.status).toBe(200); + expect(validateBalanceResponse(response.data)).toBe(true); + + // must match the fixture exactly + expect(response.data.network).toBe(mockResponse.network); + expect(response.data.wallet).toBe(mockResponse.wallet); + expect(response.data.balances).toHaveLength(mockResponse.balances.length); + + expect(axios.get).toHaveBeenCalledWith( + `http://localhost:15888/chains/${CHAIN}/balances`, + expect.objectContaining({ + params: { + network: NETWORK, + wallet: TEST_WALLET, + tokens: ['ADA', 'MIN', 'LP'], + }, + }), + ); + }); + + test('handles error response for invalid wallet', async () => { + axios.get.mockRejectedValueOnce({ + response: { + status: 400, + data: { error: 'Invalid wallet address', code: 400 }, + }, + }); + + await expect( + axios.get(`http://localhost:15888/chains/${CHAIN}/balances`, { + params: { network: NETWORK, wallet: 'invalid', tokens: ['ADA'] }, + }), + ).rejects.toMatchObject({ + response: { + status: 400, + data: { error: 'Invalid wallet address' }, + }, + }); + }); + }); + + describe('Tokens Endpoint', () => { + test('returns and validates token list', async () => { + const mockResponse = loadMockResponse('tokens'); + + axios.get.mockResolvedValueOnce({ status: 200, data: mockResponse }); + + const response = await axios.get( + `http://localhost:15888/chains/${CHAIN}/tokens`, + { params: { network: mockResponse.network } }, + ); + + expect(response.status).toBe(200); + expect(Array.isArray(response.data.tokens)).toBe(true); + response.data.tokens.forEach((t) => { + expect(typeof t.symbol).toBe('string'); + expect(typeof t.address).toBe('string'); + expect(typeof t.decimals).toBe('number'); + expect(typeof t.name).toBe('string'); + }); + + // derive network from the fixture + if ('network' in mockResponse) { + expect(response.data.network).toBe(mockResponse.network); + } + expect(response.data.tokens.length).toBeGreaterThan(0); + + expect(axios.get).toHaveBeenCalledWith( + `http://localhost:15888/chains/${CHAIN}/tokens`, + expect.objectContaining({ + params: { network: mockResponse.network }, + }), + ); + }); + }); + + describe('Status Endpoint', () => { + test('returns and validates chain status', async () => { + const mockResponse = loadMockResponse('status'); + + axios.get.mockResolvedValueOnce({ status: 200, data: mockResponse }); + + const response = await axios.get( + `http://localhost:15888/chains/${CHAIN}/status`, + { params: { network: mockResponse.network } }, + ); + + expect(response.status).toBe(200); + + if ('network' in mockResponse) { + expect(response.data.network).toBe(mockResponse.network); + } + + if ('chain' in mockResponse) { + expect(response.data.chain).toBe(mockResponse.chain); + } + + if ('latestBlock' in mockResponse) { + expect(typeof response.data.latestBlock).toBe('number'); + } + + if ('rpcUrl' in mockResponse) { + expect(typeof response.data.rpcUrl).toBe('string'); + } + + if ('nativeCurrency' in mockResponse) { + expect(response.data.nativeCurrency).toBe('ADA'); + } + + expect(axios.get).toHaveBeenCalledWith( + `http://localhost:15888/chains/${CHAIN}/status`, + expect.objectContaining({ + params: { network: mockResponse.network }, + }), + ); + }); + }); +}); diff --git a/test/chains/cardano/mocks/balance.json b/test/chains/cardano/mocks/balance.json new file mode 100644 index 0000000000..1d4d20b658 --- /dev/null +++ b/test/chains/cardano/mocks/balance.json @@ -0,0 +1,20 @@ +{ + "network": "preprod", + "wallet": "addr_test1vrvqa7ytgmptew2qy3ec0lqdk9n94vcgwu4wy07kqp2he0srll8mg", + "balances": [ + { + "symbol": "ADA", + "address": "ada.lovelace", + "decimals": 6, + "name": "ADA", + "balance": "25" + }, + { + "symbol": "MIN", + "address": "e16c2dc8ae937e8d3790c7fd7168d7b994621ba14ca11415f39fed72.4d494e", + "decimals": 0, + "name": "MIN Token", + "balance": "1500" + } + ] +} diff --git a/test/chains/cardano/mocks/status.json b/test/chains/cardano/mocks/status.json new file mode 100644 index 0000000000..0318d6f156 --- /dev/null +++ b/test/chains/cardano/mocks/status.json @@ -0,0 +1,7 @@ +{ + "chain": "cardano", + "network": "preprod", + "rpcUrl": "https://cardano-preprod.blockfrost.io/api/v0", + "currentBlockNumber": 12080947, + "nativeCurrency": "ADA" +} diff --git a/test/chains/cardano/mocks/tokens.json b/test/chains/cardano/mocks/tokens.json new file mode 100644 index 0000000000..a14f80c472 --- /dev/null +++ b/test/chains/cardano/mocks/tokens.json @@ -0,0 +1,22 @@ +{ + "tokens": [ + { + "symbol": "ADA", + "address": "ada.lovelace", + "decimals": 6, + "name": "Cardano Native Token" + }, + { + "symbol": "MIN", + "address": "e16c2dc8ae937e8d3790c7fd7168d7b994621ba14ca11415f39fed72.4d494e", + "decimals": 0, + "name": "Minswap Token" + }, + { + "symbol": "LP", + "address": "e4214b7cce62ac6fbba385d164df48e157eae5863521b4b67ca71d86.3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d", + "decimals": 0, + "name": "Minswap Liquidity pool token" + } + ] +} diff --git a/test/chains/cardano/wallet.test.ts b/test/chains/cardano/wallet.test.ts new file mode 100644 index 0000000000..ac404bf33d --- /dev/null +++ b/test/chains/cardano/wallet.test.ts @@ -0,0 +1,352 @@ +// Prevent src/index.ts from running the real server/startup side-effects during tests +jest.mock('../../../src/index', () => ({})); + +// Mock fs-extra to prevent actual file writes +jest.mock('fs-extra'); + +import * as fse from 'fs-extra'; + +import { gatewayApp } from '../../../src/app'; +import { Cardano } from '../../../src/chains/cardano/cardano'; +import { ConfigManagerCertPassphrase } from '../../../src/services/config-manager-cert-passphrase'; +import { GetWalletResponse } from '../../../src/wallet/schemas'; +import { patch, unpatch } from '../../services/patch'; + +const mockFse = fse as jest.Mocked; + +let cardano: Cardano; + +// --- Test wallet data --- +const testAddress = 'addr_test1vrvqa7ytgmptew2qy3ec0lqdk9n94vcgwu4wy07kqp2he0srll8mg'; +const testPrivateKey = 'ed25519_sk1n24dk27xar2skjef5a5xvpk0uy0sqw62tt7hlv7wcpd4xp4fhy5sdask94'; // noqa: mock + +// Mock the encoded private key response +const encodedPrivateKey = { + address: 'addr_test1vrvqa7ytgmptew2qy3ec0lqdk9n94vcgwu4wy07kqp2he0srll8mg', + id: '7bb58a6c-06d3-4ede-af06-5f4a5cb87f0b', + version: 3, + Crypto: { + cipher: 'aes-128-ctr', + cipherparams: { iv: 'test-iv-12345' }, + ciphertext: 'mock-encrypted-key', // noqa: mock + kdf: 'scrypt', + kdfparams: { + salt: 'mock-salt', // noqa: mock + n: 131072, + dklen: 32, + p: 1, + r: 8, + }, + mac: 'mock-mac', // noqa: mock + }, +}; + +// Track wallet operations in memory to avoid file system pollution +const mockWallets: { [key: string]: Set } = { + cardano: new Set(), +}; + +// Create a fully mocked Cardano instance so no real network / API calls happen +const mockCardanoInstance = { + // method used by tests and by app routes + getWalletFromPrivateKey: (_pk: string) => ({ address: testAddress }), + encrypt: (_pk: string, _opts?: any) => JSON.stringify(encodedPrivateKey), + // ensure any lifecycle methods are present + close: async () => undefined, +} as unknown as Cardano; + +beforeAll(async () => { + // Prevent reading passphrase from real config + patch(ConfigManagerCertPassphrase, 'readPassphrase', () => 'a'); + + // Mock the static getInstance so the real Cardano initialization (and any network calls) + // is never performed — it will return the in-memory mock instead. + patch(Cardano, 'getInstance', async (_network?: string) => { + return mockCardanoInstance; + }); + + // Obtain the mocked instance + cardano = await Cardano.getInstance('preprod'); + + // Start the app (fastify inject will be used, no external HTTP calls) + await gatewayApp.ready(); +}); + +beforeEach(() => { + patch(ConfigManagerCertPassphrase, 'readPassphrase', () => 'a'); + + // Clear mock wallets + mockWallets.cardano.clear(); + + // Ensure per-test overrides can change behavior of the mocked instance + patch(cardano, 'getWalletFromPrivateKey', () => { + return { address: testAddress }; + }); + + patch(cardano, 'encrypt', () => { + return JSON.stringify(encodedPrivateKey); + }); + + // Setup fs-extra mocks + (mockFse.writeFile as jest.Mock).mockImplementation(async (path: any) => { + const pathStr = path.toString(); + const pathParts = pathStr.split('/'); + const chain = pathParts[pathParts.length - 2]; + const address = pathParts[pathParts.length - 1].replace('.json', ''); + + if (chain && address) { + mockWallets[chain].add(address); + } + return undefined; + }); + + (mockFse.readdir as jest.Mock).mockImplementation(async (dirPath: any, options?: any) => { + const pathStr = dirPath.toString(); + + // If asking for directories in wallet path + if (pathStr.endsWith('/wallets') && options?.withFileTypes) { + return Object.keys(mockWallets).map((chain) => ({ + name: chain, + isDirectory: () => true, + isFile: () => false, + })); + } + + // If asking for files in a chain directory + const chain = pathStr.split('/').pop(); + if (chain && mockWallets[chain]) { + if (options?.withFileTypes) { + return Array.from(mockWallets[chain]).map((addr) => ({ + name: `${addr}.json`, + isDirectory: () => false, + isFile: () => true, + })); + } + return Array.from(mockWallets[chain]).map((addr) => `${addr}.json`); + } + + return []; + }); + + (mockFse.readFile as jest.Mock).mockResolvedValue(Buffer.from(JSON.stringify(encodedPrivateKey))); + (mockFse.pathExists as jest.Mock).mockResolvedValue(true); + (mockFse.ensureDir as jest.Mock).mockResolvedValue(undefined); + + (mockFse.remove as jest.Mock).mockImplementation(async (filePath: any) => { + const pathStr = filePath.toString(); + const pathParts = pathStr.split('/'); + const chain = pathParts[pathParts.length - 2]; + const address = pathParts[pathParts.length - 1].replace('.json', ''); + + if (chain && mockWallets[chain]) { + mockWallets[chain].delete(address); + } + return undefined; + }); +}); + +afterAll(async () => { + // close the mocked cardano instance and the app + await cardano.close(); + await gatewayApp.close(); +}); + +afterEach(() => { + unpatch(); + jest.clearAllMocks(); +}); + +describe('Cardano Wallet Operations', () => { + describe('POST /wallet/add', () => { + it('should add an Cardano wallet successfully', async () => { + const response = await gatewayApp.inject({ + method: 'POST', + url: '/wallet/add', + payload: { + privateKey: testPrivateKey, + chain: 'cardano', + network: 'preprod', + }, + }); + + expect(response.statusCode).toBe(200); + expect(response.headers['content-type']).toMatch(/json/); + + const result = JSON.parse(response.payload); + expect(result).toMatchObject({ + address: testAddress, + }); + }); + + it('should fail with invalid private key', async () => { + // Override the mock to simulate invalid key + patch(cardano, 'getWalletFromPrivateKey', () => { + throw new Error('Invalid private key'); + }); + + const response = await gatewayApp.inject({ + method: 'POST', + url: '/wallet/add', + payload: { + privateKey: 'invalid-key', + chain: 'cardano', + network: 'preprod', + }, + }); + + expect(response.statusCode).toBe(500); + }); + + it('should fail with missing parameters', async () => { + const response = await gatewayApp.inject({ + method: 'POST', + url: '/wallet/add', + payload: { + chain: 'cardano', + // missing privateKey + }, + }); + + expect(response.statusCode).toBe(400); + }); + }); + + describe('GET /wallet', () => { + it('should fetch wallets for Cardano', async () => { + // First add a wallet + mockWallets.cardano.add(testAddress); + + const response = await gatewayApp.inject({ + method: 'GET', + url: '/wallet', + }); + + expect(response.statusCode).toBe(200); + expect(response.headers['content-type']).toMatch(/json/); + + const wallets: GetWalletResponse[] = JSON.parse(response.payload); + const cardanoWallet = wallets.find((w) => w.chain === 'cardano'); + + expect(cardanoWallet).toBeDefined(); + expect(cardanoWallet?.walletAddresses).toContain(testAddress); + }); + + it('should return empty array when no wallets exist', async () => { + // Clear wallets + mockWallets.cardano.clear(); + + const response = await gatewayApp.inject({ + method: 'GET', + url: '/wallet', + }); + + expect(response.statusCode).toBe(200); + + const wallets: GetWalletResponse[] = JSON.parse(response.payload); + const cardanoWallet = wallets.find((w) => w.chain === 'cardano'); + + expect(cardanoWallet?.walletAddresses).toHaveLength(0); + }); + }); + + describe('DELETE /wallet/remove', () => { + it('should remove an Cardano wallet successfully', async () => { + // First add the wallet to mock storage + mockWallets.cardano.add(testAddress); + + const response = await gatewayApp.inject({ + method: 'DELETE', + url: '/wallet/remove', + payload: { + address: testAddress, + chain: 'cardano', + }, + }); + + expect(response.statusCode).toBe(200); + expect(response.headers['content-type']).toMatch(/json/); + + expect(response.payload).toBe('null'); + expect(mockWallets.cardano.has(testAddress)).toBe(false); + }); + + it('should fail when removing non-existent wallet', async () => { + (mockFse.pathExists as jest.Mock).mockResolvedValue(false); + + const response = await gatewayApp.inject({ + method: 'DELETE', + url: '/wallet/remove', + payload: { + address: 'addr_test1vrvqa7ytgmptew2qy3ec0lqdk9n94vcgwu4wy07kqp2he0srll8mg', + chain: 'cardano', + }, + }); + + // The endpoint doesn't check if wallet exists, just removes the file + expect(response.statusCode).toBe(200); + }); + + it('should fail with invalid address format', async () => { + const response = await gatewayApp.inject({ + method: 'DELETE', + url: '/wallet/remove', + payload: { + address: 'invalid-address', + chain: 'cardano', + }, + }); + + // Address validation happens and throws 500 on invalid format + expect(response.statusCode).toBe(500); + }); + }); + + describe('Wallet Operations Integration', () => { + it('should handle full wallet lifecycle: add, fetch, and remove', async () => { + // 1. Add wallet + const addResponse = await gatewayApp.inject({ + method: 'POST', + url: '/wallet/add', + payload: { + privateKey: testPrivateKey, + chain: 'cardano', + network: 'preprod', + }, + }); + expect(addResponse.statusCode).toBe(200); + + // 2. Fetch wallets + const getResponse = await gatewayApp.inject({ + method: 'GET', + url: '/wallet', + }); + expect(getResponse.statusCode).toBe(200); + + const wallets: GetWalletResponse[] = JSON.parse(getResponse.payload); + const cardanoWallet = wallets.find((w) => w.chain === 'cardano'); + expect(cardanoWallet?.walletAddresses).toContain(testAddress); + + // 3. Remove wallet + const removeResponse = await gatewayApp.inject({ + method: 'DELETE', + url: '/wallet/remove', + payload: { + address: testAddress, + chain: 'cardano', + }, + }); + expect(removeResponse.statusCode).toBe(200); + + // 4. Verify wallet is removed + const finalGetResponse = await gatewayApp.inject({ + method: 'GET', + url: '/wallet', + }); + expect(finalGetResponse.statusCode).toBe(200); + + const finalWallets: GetWalletResponse[] = JSON.parse(finalGetResponse.payload); + const finalCardanoWallet = finalWallets.find((w) => w.chain === 'cardano'); + expect(finalCardanoWallet?.walletAddresses).not.toContain(testAddress); + }); + }); +}); diff --git a/test/connectors/minswap/amm.test.js b/test/connectors/minswap/amm.test.js new file mode 100644 index 0000000000..8616c1b09e --- /dev/null +++ b/test/connectors/minswap/amm.test.js @@ -0,0 +1,545 @@ +const fs = require('fs'); +const path = require('path'); + +const { test, describe, expect, beforeEach } = require('@jest/globals'); +const axios = require('axios'); + +// Constants for this test file +const CONNECTOR = 'minswap'; +const PROTOCOL = 'amm'; +const CHAIN = 'cardano'; +const NETWORK = 'preprod'; +const BASE_TOKEN = 'ADA'; +const QUOTE_TOKEN = 'MIN'; +const TEST_POOL = + '3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d'; +const TEST_WALLET = + 'addr_test1vrvqa7ytgmptew2qy3ec0lqdk9n94vcgwu4wy07kqp2he0srll8mg'; + +// Mock API calls (axios.get and axios.post) +jest.mock('axios'); + +// Mock implementation for axios +axios.get = jest.fn(); +axios.post = jest.fn(); + +// Helper to load mock responses +function loadMockResponse(filename) { + // Use mocks from the same directory + const filePath = path.join( + __dirname, + 'mocks', + `${PROTOCOL}-${filename}.json`, + ); + return JSON.parse(fs.readFileSync(filePath, 'utf8')); +} + +// Function to validate pool info response structure +function validatePoolInfo(response) { + return ( + response && + typeof response.address === 'string' && + typeof response.baseTokenAddress === 'string' && + typeof response.quoteTokenAddress === 'string' && + typeof response.feePct === 'number' && + typeof response.price === 'number' && + typeof response.baseTokenAmount === 'number' && + typeof response.quoteTokenAmount === 'number' && + response.poolType === 'amm' && + response.lpMint && + typeof response.lpMint.address === 'string' && + typeof response.lpMint.decimals === 'number' + ); +} + +// Function to validate swap quote response structure +function validateSwapQuote(response) { + return ( + response && + typeof response.poolAddress === 'string' && + typeof response.estimatedAmountIn === 'number' && + typeof response.estimatedAmountOut === 'number' && + typeof response.minAmountOut === 'number' && + typeof response.maxAmountIn === 'number' && + typeof response.baseTokenBalanceChange === 'number' && + typeof response.quoteTokenBalanceChange === 'number' && + typeof response.price === 'number' + ); +} + +// Tests +describe('Minswap AMM Tests (Preprod Network)', () => { + beforeEach(() => { + // Reset axios mocks before each test + axios.get.mockClear(); + axios.post.mockClear(); + }); + + describe('Pool Info Endpoint', () => { + test('returns and validates pool info', async () => { + // Load mock response + const mockResponse = loadMockResponse('pool-info'); + + // Setup mock axios + axios.get.mockResolvedValueOnce({ + status: 200, + data: mockResponse, + }); + + // Make the request + const response = await axios.get( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/pool-info`, + { + params: { + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + }, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(validatePoolInfo(response.data)).toBe(true); + + // Check expected mock values + expect(response.data.address).toBe(TEST_POOL); + expect(response.data.poolType).toBe('amm'); + + // Verify axios was called with correct parameters + expect(axios.get).toHaveBeenCalledWith( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/pool-info`, + expect.objectContaining({ + params: expect.objectContaining({ + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + }), + }), + ); + }); + + test('handles error for non-existent pool', async () => { + // Setup mock axios with error response + axios.get.mockRejectedValueOnce({ + response: { + status: 404, + data: { + error: 'Pool not found', + code: 404, + }, + }, + }); + + // Make the request and expect it to be rejected + await expect( + axios.get( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/pool-info`, + { + params: { + network: NETWORK, + baseToken: 'UNKNOWN', + quoteToken: QUOTE_TOKEN, + }, + }, + ), + ).rejects.toMatchObject({ + response: { + status: 404, + data: { + error: 'Pool not found', + }, + }, + }); + }); + }); + + describe('Quote Swap Endpoint', () => { + test('returns and validates swap quote for SELL', async () => { + // Load mock response + const mockResponse = loadMockResponse('quote-swap-sell'); + + // Setup mock axios + axios.get.mockResolvedValueOnce({ + status: 200, + data: mockResponse, + }); + + // Make the request + const response = await axios.get( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/quote-swap`, + { + params: { + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + side: 'SELL', + amount: 1.0, + }, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(validateSwapQuote(response.data)).toBe(true); + + // Check expected mock values + expect(response.data.poolAddress).toBe(TEST_POOL); + expect(response.data.baseTokenBalanceChange).toBeLessThan(0); // SELL means negative base token change + expect(response.data.quoteTokenBalanceChange).toBeGreaterThan(0); // SELL means positive quote token change + + // Verify axios was called with correct parameters + expect(axios.get).toHaveBeenCalledWith( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/quote-swap`, + expect.objectContaining({ + params: expect.objectContaining({ + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + side: 'SELL', + amount: 1.0, + }), + }), + ); + }); + + test('returns and validates swap quote for BUY', async () => { + // Modify the mock response for BUY direction + const mockBuyResponse = loadMockResponse('quote-swap'); + + // Setup mock axios + axios.get.mockResolvedValueOnce({ + status: 200, + data: mockBuyResponse, + }); + + // Make the request + const response = await axios.get( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/quote-swap`, + { + params: { + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + side: 'BUY', + amount: 1.0, + }, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(validateSwapQuote(response.data)).toBe(true); + + // Check expected mock values + expect(response.data.poolAddress).toBe(TEST_POOL); + expect(response.data.baseTokenBalanceChange).toBeGreaterThan(0); // BUY means positive base token change + expect(response.data.quoteTokenBalanceChange).toBeLessThan(0); // BUY means negative quote token change + }); + }); + + describe('Execute Swap Endpoint', () => { + test('returns successful swap execution', async () => { + // Mock a quote-swap response to use as input for execute-swap + const quoteResponse = loadMockResponse('quote-swap'); + + // Mock a successful execution response + const executeResponse = { + signature: + '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', + totalInputSwapped: quoteResponse.estimatedAmountIn, + totalOutputSwapped: quoteResponse.estimatedAmountOut, + fee: 0.003, + baseTokenBalanceChange: quoteResponse.baseTokenBalanceChange, + quoteTokenBalanceChange: quoteResponse.quoteTokenBalanceChange, + }; + + // Setup mock axios for the execute-swap request + axios.post.mockResolvedValueOnce({ + status: 200, + data: executeResponse, + }); + + // Make the request + const response = await axios.post( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/execute-swap`, + { + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + side: 'SELL', + amount: 1.0, + wallet: TEST_WALLET, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(response.data.signature).toBeDefined(); + expect(response.data.totalInputSwapped).toBe( + quoteResponse.estimatedAmountIn, + ); + expect(response.data.totalOutputSwapped).toBe( + quoteResponse.estimatedAmountOut, + ); + }); + + test('handles transaction simulation error', async () => { + // Setup mock axios with error response + axios.post.mockRejectedValueOnce({ + response: { + status: 500, + data: { + error: 'InternalServerError', + message: 'Transaction simulation failed', + code: 500, + }, + }, + }); + + // Make the request and expect it to be rejected + await expect( + axios.post( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/execute-swap`, + { + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + side: 'SELL', + amount: 1000000.0, + wallet: TEST_WALLET, + }, + ), + ).rejects.toMatchObject({ + response: { + status: 500, + data: { + error: 'InternalServerError', + }, + }, + }); + }); + }); + + describe('Quote Liquidity Endpoint', () => { + test('returns and validates liquidity quote', async () => { + const mockResponse = { + poolAddress: TEST_POOL, + baseTokenLiquidity: 1.0, + quoteTokenLiquidity: 2340.5, + lpTokenAmount: 54.32, + shareOfPool: 0.0001, + }; + + // Setup mock axios + axios.get.mockResolvedValueOnce({ + status: 200, + data: mockResponse, + }); + + // Make the request + const response = await axios.get( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/quote-liquidity`, + { + params: { + network: NETWORK, + poolAddress: TEST_POOL, + baseTokenAmount: 1.0, + quoteTokenAmount: 2340.5, + }, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(response.data.poolAddress).toBe(TEST_POOL); + expect(response.data.lpTokenAmount).toBeGreaterThan(0); + expect(response.data.shareOfPool).toBeGreaterThan(0); + }); + + test('handles imbalanced liquidity error', async () => { + // Setup mock axios with error response + axios.get.mockRejectedValueOnce({ + response: { + status: 400, + data: { + error: 'BadRequest', + message: 'Token amounts do not match pool ratio', + code: 400, + }, + }, + }); + + // Make the request and expect it to be rejected + await expect( + axios.get( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/quote-liquidity`, + { + params: { + network: NETWORK, + poolAddress: TEST_POOL, + baseTokenAmount: 1.0, + quoteTokenAmount: 100.0, // Wrong ratio + }, + }, + ), + ).rejects.toMatchObject({ + response: { + status: 400, + data: { + error: 'BadRequest', + message: expect.stringContaining('ratio'), + }, + }, + }); + }); + }); + + describe('Add Liquidity Endpoint', () => { + test('returns successful liquidity addition', async () => { + const mockResponse = { + signature: + '0xabcd1234567890abcdef1234567890abcdef1234567890abcdef1234567890ab', + baseTokenAmount: 1.0, + quoteTokenAmount: 2340.5, + lpTokenAmount: 54.32, + poolAddress: TEST_POOL, + fee: 0.003, + }; + + // Setup mock axios + axios.post.mockResolvedValueOnce({ + status: 200, + data: mockResponse, + }); + + // Make the request + const response = await axios.post( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/add-liquidity`, + { + network: NETWORK, + poolAddress: TEST_POOL, + baseTokenAmount: 1.0, + quoteTokenAmount: 2340.5, + wallet: TEST_WALLET, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(response.data.signature).toBeDefined(); + expect(response.data.lpTokenAmount).toBeGreaterThan(0); + expect(response.data.baseTokenAmount).toBe(1.0); + expect(response.data.quoteTokenAmount).toBe(2340.5); + }); + + test('handles insufficient balance error', async () => { + // Setup mock axios with error response + axios.post.mockRejectedValueOnce({ + response: { + status: 400, + data: { + error: 'BadRequest', + message: 'Insufficient balance for ADA', + code: 400, + }, + }, + }); + + // Make the request and expect it to be rejected + await expect( + axios.post( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/add-liquidity`, + { + network: NETWORK, + poolAddress: TEST_POOL, + baseTokenAmount: 10000.0, // Large amount + quoteTokenAmount: 23405000.0, + wallet: TEST_WALLET, + }, + ), + ).rejects.toMatchObject({ + response: { + status: 400, + data: { + error: 'BadRequest', + message: expect.stringContaining('Insufficient balance'), + }, + }, + }); + }); + }); + + describe('Remove Liquidity Endpoint', () => { + test('returns successful liquidity removal', async () => { + const mockResponse = { + signature: + '0xdef4567890abcdef1234567890abcdef1234567890abcdef1234567890abcd12', + baseTokenAmount: 0.95, + quoteTokenAmount: 2223.475, + lpTokenAmount: 54.32, + poolAddress: TEST_POOL, + fee: 0.003, + }; + + // Setup mock axios + axios.post.mockResolvedValueOnce({ + status: 200, + data: mockResponse, + }); + + // Make the request + const response = await axios.post( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/remove-liquidity`, + { + network: NETWORK, + poolAddress: TEST_POOL, + lpTokenAmount: 54.32, + wallet: TEST_WALLET, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(response.data.signature).toBeDefined(); + expect(response.data.baseTokenAmount).toBeGreaterThan(0); + expect(response.data.quoteTokenAmount).toBeGreaterThan(0); + expect(response.data.lpTokenAmount).toBe(54.32); + }); + + test('handles insufficient LP token balance error', async () => { + // Setup mock axios with error response + axios.post.mockRejectedValueOnce({ + response: { + status: 400, + data: { + error: 'BadRequest', + message: 'Insufficient LP token balance', + code: 400, + }, + }, + }); + + // Make the request and expect it to be rejected + await expect( + axios.post( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/remove-liquidity`, + { + network: NETWORK, + poolAddress: TEST_POOL, + lpTokenAmount: 10000.0, // Large amount + wallet: TEST_WALLET, + }, + ), + ).rejects.toMatchObject({ + response: { + status: 400, + data: { + error: 'BadRequest', + message: expect.stringContaining('Insufficient LP token balance'), + }, + }, + }); + }); + }); +}); diff --git a/test/connectors/minswap/mocks/amm-pool-info-invalid.json b/test/connectors/minswap/mocks/amm-pool-info-invalid.json new file mode 100644 index 0000000000..efea079c7a --- /dev/null +++ b/test/connectors/minswap/mocks/amm-pool-info-invalid.json @@ -0,0 +1,5 @@ +{ + "statusCode": 500, + "error": "Internal Server Error", + "message": "An unexpected error occurred" +} \ No newline at end of file diff --git a/test/connectors/minswap/mocks/amm-pool-info.json b/test/connectors/minswap/mocks/amm-pool-info.json new file mode 100644 index 0000000000..391f594f24 --- /dev/null +++ b/test/connectors/minswap/mocks/amm-pool-info.json @@ -0,0 +1,14 @@ +{ + "address": "3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d", + "baseTokenAddress": "lovelace", + "quoteTokenAddress": "e16c2dc8ae937e8d3790c7fd7168d7b994621ba14ca11415f39fed724d494e", + "feePct": 2, + "price": 1.40074170245e-9, + "baseTokenAmount": 8078336461, + "quoteTokenAmount": 5767184946983, + "lpMint": { + "address": "e4214b7cce62ac6fbba385d164df48e157eae5863521b4b67ca71d863bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d", + "decimals": 0 + }, + "poolType": "amm" +} diff --git a/test/connectors/minswap/mocks/amm-quote-liquidity-imbalanced.json b/test/connectors/minswap/mocks/amm-quote-liquidity-imbalanced.json new file mode 100644 index 0000000000..2572d620c2 --- /dev/null +++ b/test/connectors/minswap/mocks/amm-quote-liquidity-imbalanced.json @@ -0,0 +1,5 @@ +{ + "statusCode": 500, + "error": "InternalServerError", + "message": "Failed to get liquidity quote" +} \ No newline at end of file diff --git a/test/connectors/minswap/mocks/amm-quote-swap-invalid-token.json b/test/connectors/minswap/mocks/amm-quote-swap-invalid-token.json new file mode 100644 index 0000000000..3f82724284 --- /dev/null +++ b/test/connectors/minswap/mocks/amm-quote-swap-invalid-token.json @@ -0,0 +1,5 @@ +{ + "statusCode": 400, + "error": "BadRequestError", + "message": "Base token not found: INVALID" +} \ No newline at end of file diff --git a/test/connectors/minswap/mocks/amm-quote-swap-sell.json b/test/connectors/minswap/mocks/amm-quote-swap-sell.json new file mode 100644 index 0000000000..ea4da04a78 --- /dev/null +++ b/test/connectors/minswap/mocks/amm-quote-swap-sell.json @@ -0,0 +1,13 @@ +{ + "poolAddress": "3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d", + "estimatedAmountIn": 10000, + "estimatedAmountOut": 0.000013, + "minAmountOut": 0.000012, + "maxAmountIn": 10000, + "baseTokenBalanceChange": -10000, + "quoteTokenBalanceChange": 0.000013, + "price": 1.2999999999999999e-9, + "gasPrice": 0, + "gasLimit": 0, + "gasCost": 0 +} diff --git a/test/connectors/minswap/mocks/amm-quote-swap.json b/test/connectors/minswap/mocks/amm-quote-swap.json new file mode 100644 index 0000000000..6aef02cd97 --- /dev/null +++ b/test/connectors/minswap/mocks/amm-quote-swap.json @@ -0,0 +1,13 @@ +{ + "poolAddress": "3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d", + "estimatedAmountIn": 14.07397, + "estimatedAmountOut": 10000000000, + "minAmountOut": 10000000000, + "maxAmountIn": 14.214709, + "baseTokenBalanceChange": 10000000000, + "quoteTokenBalanceChange": -14.07397, + "price": 1.407397e-9, + "gasPrice": 0, + "gasLimit": 0, + "gasCost": 0 +} diff --git a/test/connectors/minswap/mocks/execute-swap.json b/test/connectors/minswap/mocks/execute-swap.json new file mode 100644 index 0000000000..3527bf289c --- /dev/null +++ b/test/connectors/minswap/mocks/execute-swap.json @@ -0,0 +1,8 @@ +{ + "signature": "42b6c00a78b2ace7e3512a7c3a289c804baf8005f77a77a2254ace5740b33658", + "totalInputSwapped": 10000000, + "totalOutputSwapped": 10000000, + "fee": 192781, + "baseTokenBalanceChange": -10000000, + "quoteTokenBalanceChange": 10000000 +} diff --git a/test/connectors/minswap/mocks/quote-swap.json b/test/connectors/minswap/mocks/quote-swap.json new file mode 100644 index 0000000000..3fa95931c7 --- /dev/null +++ b/test/connectors/minswap/mocks/quote-swap.json @@ -0,0 +1,12 @@ +{ + "estimatedAmountIn": 1.0, + "estimatedAmountOut": 1800.0, + "minAmountOut": 1782.0, + "maxAmountIn": 1.0, + "price": 1800.0, + "baseTokenBalanceChange": -1.0, + "quoteTokenBalanceChange": 1800.0, + "gasPrice": 5.0, + "gasLimit": 250000, + "gasCost": 0.00125 +} \ No newline at end of file diff --git a/test/connectors/sundaeswap/amm.test.js b/test/connectors/sundaeswap/amm.test.js new file mode 100644 index 0000000000..5a87e807d2 --- /dev/null +++ b/test/connectors/sundaeswap/amm.test.js @@ -0,0 +1,541 @@ +const fs = require('fs'); +const path = require('path'); + +const { test, describe, expect, beforeEach } = require('@jest/globals'); +const axios = require('axios'); + +// Constants for this test file +const CONNECTOR = 'sundaeswap'; +const PROTOCOL = 'amm'; +const CHAIN = 'cardano'; +const NETWORK = 'preview'; +const BASE_TOKEN = 'ADA'; +const QUOTE_TOKEN = 'SBERRY'; +const TEST_POOL = '2baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3'; +const TEST_WALLET = + 'addr_test1vz5x8hgp7tunnvm33m9mp4pwdxr3vrd5k03r4dq4yuh3znsyp3sum'; + +// Mock API calls (axios.get and axios.post) +jest.mock('axios'); + +// Mock implementation for axios +axios.get = jest.fn(); +axios.post = jest.fn(); + +// Helper to load mock responses +function loadMockResponse(filename) { + // Use mocks from the same directory + const filePath = path.join( + __dirname, + 'mocks', + `${PROTOCOL}-${filename}.json`, + ); + return JSON.parse(fs.readFileSync(filePath, 'utf8')); +} + +// Function to validate pool info response structure +function validatePoolInfo(response) { + return ( + response && + typeof response.address === 'string' && + typeof response.baseTokenAddress === 'string' && + typeof response.quoteTokenAddress === 'string' && + typeof response.feePct === 'number' && + typeof response.price === 'number' && + typeof response.baseTokenAmount === 'number' && + typeof response.quoteTokenAmount === 'number' && + response.poolType === 'amm' && + response.lpMint && + typeof response.lpMint.address === 'string' && + typeof response.lpMint.decimals === 'number' + ); +} + +// Function to validate swap quote response structure +function validateSwapQuote(response) { + return ( + response && + typeof response.estimatedAmountIn === 'number' && + typeof response.estimatedAmountOut === 'number' && + typeof response.minAmountOut === 'number' && + typeof response.maxAmountIn === 'number' && + typeof response.baseTokenBalanceChange === 'number' && + typeof response.quoteTokenBalanceChange === 'number' && + typeof response.price === 'number' + ); +} + +// Tests +describe('Sundaeswap AMM Tests (Preview Network)', () => { + beforeEach(() => { + // Reset axios mocks before each test + axios.get.mockClear(); + axios.post.mockClear(); + }); + + describe('Pool Info Endpoint', () => { + test('returns and validates pool info', async () => { + // Load mock response + const mockResponse = loadMockResponse('pool-info'); + + // Setup mock axios + axios.get.mockResolvedValueOnce({ + status: 200, + data: mockResponse, + }); + + // Make the request + const response = await axios.get( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/pool-info`, + { + params: { + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + }, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(validatePoolInfo(response.data)).toBe(true); + + // Check expected mock values + expect(response.data.address).toBe(TEST_POOL); + expect(response.data.poolType).toBe('amm'); + + // Verify axios was called with correct parameters + expect(axios.get).toHaveBeenCalledWith( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/pool-info`, + expect.objectContaining({ + params: expect.objectContaining({ + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + }), + }), + ); + }); + + test('handles error for non-existent pool', async () => { + // Setup mock axios with error response + axios.get.mockRejectedValueOnce({ + response: { + status: 404, + data: { + error: 'Pool not found', + code: 404, + }, + }, + }); + + // Make the request and expect it to be rejected + await expect( + axios.get( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/pool-info`, + { + params: { + network: NETWORK, + baseToken: 'UNKNOWN', + quoteToken: QUOTE_TOKEN, + }, + }, + ), + ).rejects.toMatchObject({ + response: { + status: 404, + data: { + error: 'Pool not found', + }, + }, + }); + }); + }); + + describe('Quote Swap Endpoint', () => { + test('returns and validates swap quote for SELL', async () => { + // Load mock response + const mockResponse = loadMockResponse('quote-swap-sell'); + + // Setup mock axios + axios.get.mockResolvedValueOnce({ + status: 200, + data: mockResponse, + }); + + // Make the request + const response = await axios.get( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/quote-swap`, + { + params: { + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + side: 'SELL', + amount: 1.0, + }, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(validateSwapQuote(response.data)).toBe(true); + + // Check expected mock values + expect(response.data.baseTokenBalanceChange).toBeLessThan(0); // SELL means negative base token change + expect(response.data.quoteTokenBalanceChange).toBeGreaterThan(0); // SELL means positive quote token change + + // Verify axios was called with correct parameters + expect(axios.get).toHaveBeenCalledWith( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/quote-swap`, + expect.objectContaining({ + params: expect.objectContaining({ + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + side: 'SELL', + amount: 1.0, + }), + }), + ); + }); + + test('returns and validates swap quote for BUY', async () => { + // Modify the mock response for BUY direction + const mockBuyResponse = loadMockResponse('quote-swap'); + + // Setup mock axios + axios.get.mockResolvedValueOnce({ + status: 200, + data: mockBuyResponse, + }); + + // Make the request + const response = await axios.get( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/quote-swap`, + { + params: { + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + side: 'BUY', + amount: 1.0, + }, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(validateSwapQuote(response.data)).toBe(true); + + // Check expected mock values + expect(response.data.baseTokenBalanceChange).toBeGreaterThan(0); // BUY means positive base token change + expect(response.data.quoteTokenBalanceChange).toBeLessThan(0); // BUY means negative quote token change + }); + }); + + describe('Execute Swap Endpoint', () => { + test('returns successful swap execution', async () => { + // Mock a quote-swap response to use as input for execute-swap + const quoteResponse = loadMockResponse('quote-swap'); + + // Mock a successful execution response + const executeResponse = { + signature: + '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', + totalInputSwapped: quoteResponse.estimatedAmountIn, + totalOutputSwapped: quoteResponse.estimatedAmountOut, + fee: 0.003, + baseTokenBalanceChange: quoteResponse.baseTokenBalanceChange, + quoteTokenBalanceChange: quoteResponse.quoteTokenBalanceChange, + }; + + // Setup mock axios for the execute-swap request + axios.post.mockResolvedValueOnce({ + status: 200, + data: executeResponse, + }); + + // Make the request + const response = await axios.post( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/execute-swap`, + { + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + side: 'SELL', + amount: 1.0, + wallet: TEST_WALLET, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(response.data.signature).toBeDefined(); + expect(response.data.totalInputSwapped).toBe( + quoteResponse.estimatedAmountIn, + ); + expect(response.data.totalOutputSwapped).toBe( + quoteResponse.estimatedAmountOut, + ); + }); + + test('handles transaction simulation error', async () => { + // Setup mock axios with error response + axios.post.mockRejectedValueOnce({ + response: { + status: 500, + data: { + error: 'InternalServerError', + message: 'Transaction simulation failed', + code: 500, + }, + }, + }); + + // Make the request and expect it to be rejected + await expect( + axios.post( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/execute-swap`, + { + network: NETWORK, + baseToken: BASE_TOKEN, + quoteToken: QUOTE_TOKEN, + side: 'SELL', + amount: 1000000.0, + wallet: TEST_WALLET, + }, + ), + ).rejects.toMatchObject({ + response: { + status: 500, + data: { + error: 'InternalServerError', + }, + }, + }); + }); + }); + + describe('Quote Liquidity Endpoint', () => { + test('returns and validates liquidity quote', async () => { + const mockResponse = { + poolAddress: TEST_POOL, + baseTokenLiquidity: 1.0, + quoteTokenLiquidity: 2340.5, + lpTokenAmount: 54.32, + shareOfPool: 0.0001, + }; + + // Setup mock axios + axios.get.mockResolvedValueOnce({ + status: 200, + data: mockResponse, + }); + + // Make the request + const response = await axios.get( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/quote-liquidity`, + { + params: { + network: NETWORK, + poolAddress: TEST_POOL, + baseTokenAmount: 1.0, + quoteTokenAmount: 2340.5, + }, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(response.data.poolAddress).toBe(TEST_POOL); + expect(response.data.lpTokenAmount).toBeGreaterThan(0); + expect(response.data.shareOfPool).toBeGreaterThan(0); + }); + + test('handles imbalanced liquidity error', async () => { + // Setup mock axios with error response + axios.get.mockRejectedValueOnce({ + response: { + status: 400, + data: { + error: 'BadRequest', + message: 'Token amounts do not match pool ratio', + code: 400, + }, + }, + }); + + // Make the request and expect it to be rejected + await expect( + axios.get( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/quote-liquidity`, + { + params: { + network: NETWORK, + poolAddress: TEST_POOL, + baseTokenAmount: 1.0, + quoteTokenAmount: 100.0, // Wrong ratio + }, + }, + ), + ).rejects.toMatchObject({ + response: { + status: 400, + data: { + error: 'BadRequest', + message: expect.stringContaining('ratio'), + }, + }, + }); + }); + }); + + describe('Add Liquidity Endpoint', () => { + test('returns successful liquidity addition', async () => { + const mockResponse = { + signature: + '0xabcd1234567890abcdef1234567890abcdef1234567890abcdef1234567890ab', + baseTokenAmount: 1.0, + quoteTokenAmount: 2340.5, + lpTokenAmount: 54.32, + poolAddress: TEST_POOL, + fee: 0.003, + }; + + // Setup mock axios + axios.post.mockResolvedValueOnce({ + status: 200, + data: mockResponse, + }); + + // Make the request + const response = await axios.post( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/add-liquidity`, + { + network: NETWORK, + poolAddress: TEST_POOL, + baseTokenAmount: 1.0, + quoteTokenAmount: 2340.5, + wallet: TEST_WALLET, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(response.data.signature).toBeDefined(); + expect(response.data.lpTokenAmount).toBeGreaterThan(0); + expect(response.data.baseTokenAmount).toBe(1.0); + expect(response.data.quoteTokenAmount).toBe(2340.5); + }); + + test('handles insufficient balance error', async () => { + // Setup mock axios with error response + axios.post.mockRejectedValueOnce({ + response: { + status: 400, + data: { + error: 'BadRequest', + message: 'Insufficient balance for ADA', + code: 400, + }, + }, + }); + + // Make the request and expect it to be rejected + await expect( + axios.post( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/add-liquidity`, + { + network: NETWORK, + poolAddress: TEST_POOL, + baseTokenAmount: 10000.0, // Large amount + quoteTokenAmount: 23405000.0, + wallet: TEST_WALLET, + }, + ), + ).rejects.toMatchObject({ + response: { + status: 400, + data: { + error: 'BadRequest', + message: expect.stringContaining('Insufficient balance'), + }, + }, + }); + }); + }); + + describe('Remove Liquidity Endpoint', () => { + test('returns successful liquidity removal', async () => { + const mockResponse = { + signature: + '0xdef4567890abcdef1234567890abcdef1234567890abcdef1234567890abcd12', + baseTokenAmount: 0.95, + quoteTokenAmount: 2223.475, + lpTokenAmount: 54.32, + poolAddress: TEST_POOL, + fee: 0.003, + }; + + // Setup mock axios + axios.post.mockResolvedValueOnce({ + status: 200, + data: mockResponse, + }); + + // Make the request + const response = await axios.post( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/remove-liquidity`, + { + network: NETWORK, + poolAddress: TEST_POOL, + lpTokenAmount: 54.32, + wallet: TEST_WALLET, + }, + ); + + // Validate the response + expect(response.status).toBe(200); + expect(response.data.signature).toBeDefined(); + expect(response.data.baseTokenAmount).toBeGreaterThan(0); + expect(response.data.quoteTokenAmount).toBeGreaterThan(0); + expect(response.data.lpTokenAmount).toBe(54.32); + }); + + test('handles insufficient LP token balance error', async () => { + // Setup mock axios with error response + axios.post.mockRejectedValueOnce({ + response: { + status: 400, + data: { + error: 'BadRequest', + message: 'Insufficient LP token balance', + code: 400, + }, + }, + }); + + // Make the request and expect it to be rejected + await expect( + axios.post( + `http://localhost:15888/connectors/${CONNECTOR}/${PROTOCOL}/remove-liquidity`, + { + network: NETWORK, + poolAddress: TEST_POOL, + lpTokenAmount: 10000.0, // Large amount + wallet: TEST_WALLET, + }, + ), + ).rejects.toMatchObject({ + response: { + status: 400, + data: { + error: 'BadRequest', + message: expect.stringContaining('Insufficient LP token balance'), + }, + }, + }); + }); + }); +}); diff --git a/test/connectors/sundaeswap/mocks/amm-pool-info-invalid.json b/test/connectors/sundaeswap/mocks/amm-pool-info-invalid.json new file mode 100644 index 0000000000..efea079c7a --- /dev/null +++ b/test/connectors/sundaeswap/mocks/amm-pool-info-invalid.json @@ -0,0 +1,5 @@ +{ + "statusCode": 500, + "error": "Internal Server Error", + "message": "An unexpected error occurred" +} \ No newline at end of file diff --git a/test/connectors/sundaeswap/mocks/amm-pool-info.json b/test/connectors/sundaeswap/mocks/amm-pool-info.json new file mode 100644 index 0000000000..b1eba3c32a --- /dev/null +++ b/test/connectors/sundaeswap/mocks/amm-pool-info.json @@ -0,0 +1,14 @@ +{ + "address": "2baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3", + "baseTokenAddress": "ada.lovelace", + "quoteTokenAddress": "99b071ce8580d6a3a11b4902145adb8bfd0d2a03935af8cf66403e15.534245525259", + "feePct": 0.5, + "price": 96.28482095218703, + "baseTokenAmount": 880467013, + "quoteTokenAmount": 9144401, + "lpMint": { + "address": "44a1eb2d9f58add4eb1932bd0048e6a1947e85e3fe4f32956a110414.0014df102baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3", + "decimals": 0 + }, + "poolType": "amm" +} diff --git a/test/connectors/sundaeswap/mocks/amm-quote-liquidity-imbalanced.json b/test/connectors/sundaeswap/mocks/amm-quote-liquidity-imbalanced.json new file mode 100644 index 0000000000..2572d620c2 --- /dev/null +++ b/test/connectors/sundaeswap/mocks/amm-quote-liquidity-imbalanced.json @@ -0,0 +1,5 @@ +{ + "statusCode": 500, + "error": "InternalServerError", + "message": "Failed to get liquidity quote" +} \ No newline at end of file diff --git a/test/connectors/sundaeswap/mocks/amm-quote-swap-invalid-token.json b/test/connectors/sundaeswap/mocks/amm-quote-swap-invalid-token.json new file mode 100644 index 0000000000..3f82724284 --- /dev/null +++ b/test/connectors/sundaeswap/mocks/amm-quote-swap-invalid-token.json @@ -0,0 +1,5 @@ +{ + "statusCode": 400, + "error": "BadRequestError", + "message": "Base token not found: INVALID" +} \ No newline at end of file diff --git a/test/connectors/sundaeswap/mocks/amm-quote-swap-sell.json b/test/connectors/sundaeswap/mocks/amm-quote-swap-sell.json new file mode 100644 index 0000000000..ec317a0731 --- /dev/null +++ b/test/connectors/sundaeswap/mocks/amm-quote-swap-sell.json @@ -0,0 +1,12 @@ +{ + "estimatedAmountIn": 10000, + "estimatedAmountOut": 0.956992, + "minAmountOut": 0.947422, + "maxAmountIn": 10000, + "baseTokenBalanceChange": -10000, + "quoteTokenBalanceChange": 0.956992, + "price": 0.0000956992, + "gasPrice": 0, + "gasLimit": 0, + "gasCost": 0 +} diff --git a/test/connectors/sundaeswap/mocks/amm-quote-swap.json b/test/connectors/sundaeswap/mocks/amm-quote-swap.json new file mode 100644 index 0000000000..2384dd2811 --- /dev/null +++ b/test/connectors/sundaeswap/mocks/amm-quote-swap.json @@ -0,0 +1,12 @@ +{ + "estimatedAmountIn": 0.968746, + "estimatedAmountOut": 10000, + "minAmountOut": 10000, + "maxAmountIn": 0.978433, + "baseTokenBalanceChange": 10000, + "quoteTokenBalanceChange": -0.968746, + "price": 0.0000968746, + "gasPrice": 0, + "gasLimit": 0, + "gasCost": 0 +} diff --git a/test/connectors/sundaeswap/mocks/execute-swap.json b/test/connectors/sundaeswap/mocks/execute-swap.json new file mode 100644 index 0000000000..3e07d37d89 --- /dev/null +++ b/test/connectors/sundaeswap/mocks/execute-swap.json @@ -0,0 +1,8 @@ +{ + "signature": "5db28c84b78d59fbc522030e6619076c6bc2fc841cb8715a92e134d112c5573b", + "totalInputSwapped": 0.968746, + "totalOutputSwapped": 10000, + "fee": 186181, + "baseTokenBalanceChange": 10000, + "quoteTokenBalanceChange": -0.968746 +} diff --git a/test/connectors/sundaeswap/mocks/quote-swap.json b/test/connectors/sundaeswap/mocks/quote-swap.json new file mode 100644 index 0000000000..3fa95931c7 --- /dev/null +++ b/test/connectors/sundaeswap/mocks/quote-swap.json @@ -0,0 +1,12 @@ +{ + "estimatedAmountIn": 1.0, + "estimatedAmountOut": 1800.0, + "minAmountOut": 1782.0, + "maxAmountIn": 1.0, + "price": 1800.0, + "baseTokenBalanceChange": -1.0, + "quoteTokenBalanceChange": 1800.0, + "gasPrice": 5.0, + "gasLimit": 250000, + "gasCost": 0.00125 +} \ No newline at end of file