From 7c7c6ec9ee97398b719a1aa15864b3792f8f18ea Mon Sep 17 00:00:00 2001 From: Aiquant1 Date: Tue, 24 Jun 2025 17:55:07 +0530 Subject: [PATCH 01/12] Added cardano blockchain and it's route implementation --- package.json | 1 + pnpm-lock.yaml | 3895 +++++++++-------- src/app.ts | 8 + src/chains/cardano/cardano.config.ts | 67 + src/chains/cardano/cardano.routes.ts | 24 + src/chains/cardano/cardano.ts | 488 +++ src/chains/cardano/cardano.utils.ts | 66 + src/chains/cardano/routes/balances.ts | 222 + src/chains/cardano/routes/poll.ts | 108 + src/chains/cardano/routes/status.ts | 97 + src/chains/cardano/routes/tokens.ts | 81 + src/services/connection-manager.ts | 7 +- src/templates/connectors/cardano.yml | 55 + .../namespace/cardano_mainnet_tokens.json | 40 + .../namespace/cardano_preprod_tokens.json | 32 + .../namespace/cardano_preview_tokens.json | 32 + src/templates/root.yml | 4 + src/wallet/schemas.ts | 18 +- src/wallet/utils.ts | 24 +- .../test1/namespace/cardano-schema.json | 117 + 20 files changed, 3576 insertions(+), 1810 deletions(-) create mode 100644 src/chains/cardano/cardano.config.ts create mode 100644 src/chains/cardano/cardano.routes.ts create mode 100644 src/chains/cardano/cardano.ts create mode 100644 src/chains/cardano/cardano.utils.ts create mode 100644 src/chains/cardano/routes/balances.ts create mode 100644 src/chains/cardano/routes/poll.ts create mode 100644 src/chains/cardano/routes/status.ts create mode 100644 src/chains/cardano/routes/tokens.ts create mode 100644 src/templates/connectors/cardano.yml create mode 100644 src/templates/namespace/cardano_mainnet_tokens.json create mode 100644 src/templates/namespace/cardano_preprod_tokens.json create mode 100644 src/templates/namespace/cardano_preview_tokens.json create mode 100644 test/services/data/config-manager-v2/test1/namespace/cardano-schema.json diff --git a/package.json b/package.json index 47bfac3025..57e86a136d 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "prepare": "pnpm husky" }, "dependencies": { + "@aiquant/minswap-sdk": "^0.0.0", "@coral-xyz/anchor": "^0.29.0", "@ethersproject/abstract-provider": "5.7.0", "@ethersproject/address": "5.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad8e29402d..c89b1c2f70 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,6 +19,9 @@ importers: .: dependencies: + '@aiquant/minswap-sdk': + specifier: ^0.0.0 + version: 0.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@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) @@ -57,16 +60,16 @@ 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) @@ -75,22 +78,22 @@ importers: 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)) '@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)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(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)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(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)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.8.3)(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.8.3)(zod@3.25.76))(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.7(bufferutil@4.0.9)(typescript@5.8.3)(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.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@pancakeswap/v3-core': specifier: ^1.0.2 version: 1.0.2 @@ -99,10 +102,10 @@ 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)(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': 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.8.3)(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) @@ -126,7 +129,7 @@ importers: version: 1.3.1(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.25.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/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 +138,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)(encoding@0.1.13)(hardhat@2.25.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/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.25.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/v2-sdk': specifier: ^4.15.2 version: 4.15.2 @@ -150,10 +153,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.25.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': 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.25.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)) ajv: specifier: ^8.17.1 version: 8.17.1 @@ -162,7 +165,7 @@ importers: version: 3.1.0 axios: specifier: ^1.8.4 - version: 1.9.0(debug@4.4.0) + version: 1.10.0(debug@4.3.4) bigint-buffer: specifier: 1.1.5 version: 1.1.5 @@ -177,13 +180,13 @@ importers: version: 1.11.13 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 +198,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 +216,7 @@ importers: version: 11.3.0 pnpm: specifier: ^10.10.0 - version: 10.10.0 + version: 10.13.1 snake-case: specifier: ^4.0.0 version: 4.0.0 @@ -228,7 +231,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.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) winston: specifier: ^3.17.0 version: 3.17.0 @@ -237,7 +240,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 +253,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 @@ -301,22 +304,22 @@ importers: version: 9.1.0(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.8.3))(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.1(eslint-config-prettier@9.1.0(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) @@ -340,16 +343,16 @@ 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.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(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.8.3)))(typescript@5.8.3) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@15.14.9)(typescript@5.8.3) @@ -358,7 +361,7 @@ importers: 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 @@ -368,8 +371,15 @@ importers: packages: - '@adraffy/ens-normalize@1.11.0': - resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} + + '@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==} '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} @@ -398,123 +408,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.844.0': + resolution: {integrity: sha512-Yhp8+U4KFVQqL6phZ5yrHF5PdCvKWbYtLSS+egAfAW+N5w78amhbZcctervj59uqOZHMGDWXuDBklN+7eVfasg==} 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.844.0': + resolution: {integrity: sha512-FktodSx+pfUfIqMjoNwZ6t1xqq/G3cfT7I4JJ0HKHoIIZdoCHQB52x0OzKDtHDJAnEQPInasdPS8PorZBZtHmg==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.806.0': - resolution: {integrity: sha512-HJRINPncdjPK0iL3f6cBpqCMaxVwq2oDbRCzOx04tsLZ0tNgRACBfT3d/zNVRvMt6fnOVKXoN1LAtQaw50pjEA==} + '@aws-sdk/core@3.844.0': + resolution: {integrity: sha512-pfpI54bG5Xf2NkqrDBC2REStXlDXNCw/whORhkEs+Tp5exU872D5QKguzjPA6hH+8Pvbq1qgt5zXMbduISTHJw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.806.0': - resolution: {integrity: sha512-nbPwmZn0kt6Q1XI2FaJWP6AhF9tro4cO5HlmZQx8NU+B0H1y9WMo659Q5zLLY46BXgoQVIJEsPSZpcZk27O4aw==} + '@aws-sdk/credential-provider-env@3.844.0': + resolution: {integrity: sha512-WB94Ox86MqcZ4CnRjKgopzaSuZH4hMP0GqdOxG4s1it1lRWOIPOHOC1dPiM0Zbj1uqITIhbXUQVXyP/uaJeNkw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.806.0': - resolution: {integrity: sha512-e/gB2iJQQ4ZpecOVpEFhEvjGwuTqNCzhVaVsFYVc49FPfR1seuN7qBGYe1MO7mouGDQFInzJgcNup0DnYUrLiw==} + '@aws-sdk/credential-provider-http@3.844.0': + resolution: {integrity: sha512-e+efVqfkhpM8zxYeiLNgTUlX+tmtXzVm3bw1A02U9Z9cWBHyQNb8pi90M7QniLoqRURY1B0C2JqkOE61gd4KNg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.806.0': - resolution: {integrity: sha512-FogfbuYSEZgFxbNy0QcsBZHHe5mSv5HV3+JyB5n0kCyjOISCVCZD7gwxKdXjt8O1hXq5k5SOdQvydGULlB6rew==} + '@aws-sdk/credential-provider-ini@3.844.0': + resolution: {integrity: sha512-jc5ArGz2HfAx5QPXD+Ep36+QWyCKzl2TG6Vtl87/vljfLhVD0gEHv8fRsqWEp3Rc6hVfKnCjLW5ayR2HYcow9w==} 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.844.0': + resolution: {integrity: sha512-pUqB0StTNyW0R03XjTA3wrQZcie/7FJKSXlYHue921ZXuhLOZpzyDkLNfdRsZTcEoYYWVPSmyS+Eu/g5yVsBNA==} 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.844.0': + resolution: {integrity: sha512-VCI8XvIDt2WBfk5Gi/wXKPcWTS3OkAbovB66oKcNQalllH8ESDg4SfLNhchdnN8A5sDGj6tIBJ19nk+dQ6GaqQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.806.0': - resolution: {integrity: sha512-hT9OBwCxWMPBydNhXm2gdNNzx5AJNheS9RglwDDvXWzQ9qDuRztjuMBilMSUMb0HF9K4IqQjYzGqczMuktz4qQ==} + '@aws-sdk/credential-provider-sso@3.844.0': + resolution: {integrity: sha512-UNp/uWufGlb5nWa4dpc6uQnDOB/9ysJJFG95ACowNVL9XWfi1LJO7teKrqNkVhq0CzSJS1tCt3FvX4UfM+aN1g==} 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.844.0': + resolution: {integrity: sha512-iDmX4pPmatjttIScdspZRagaFnCjpHZIEEwTyKdXxUaU0iAOSXF8ecrCEvutETvImPOC86xdrq+MPacJOnMzUA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.806.0': - resolution: {integrity: sha512-ACjuyKJw9OZl8z8HzPEaqn1o7ElVW94mowyoZvyUIDouwAPGqPGJbJ5V35qx1oDTFSAJX+N3O3AO6RyFc8nUhw==} + '@aws-sdk/middleware-bucket-endpoint@3.840.0': + resolution: {integrity: sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-expect-continue@3.804.0': - resolution: {integrity: sha512-YW1hySBolALMII6C8y7Z0CRG2UX1dGJjLEBNFeefhO/xP7ZuE1dvnmfJGaEuBMnvc3wkRS63VZ3aqX6sevM1CA==} + '@aws-sdk/middleware-expect-continue@3.840.0': + resolution: {integrity: sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw==} 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.844.0': + resolution: {integrity: sha512-LCImZd1hpM0cegfdpgZyK6x4on4Ky+c9XCFURfE4wil1J9HXf6OP4KsfHQwt1yIkMEbFqvd/ab2I5fmp7S7aFA==} 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.840.0': + resolution: {integrity: sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==} 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.840.0': + resolution: {integrity: sha512-KVLD0u0YMF3aQkVF8bdyHAGWSUY6N1Du89htTLgqCcIhSxxAJ9qifrosVZ9jkAzqRW99hcufyt2LylcVU2yoKQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.804.0': - resolution: {integrity: sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==} + '@aws-sdk/middleware-logger@3.840.0': + resolution: {integrity: sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.804.0': - resolution: {integrity: sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==} + '@aws-sdk/middleware-recursion-detection@3.840.0': + resolution: {integrity: sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==} 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.844.0': + resolution: {integrity: sha512-vOD5reqZszXBWMbZFN3EUar203o2i8gcoTdrymY4GMsAPDsh0k8yd3VJRNPuxT/017tP6G+rQepOGzna4umung==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-ssec@3.804.0': - resolution: {integrity: sha512-Tk8jK0gOIUBvEPTz/wwSlP1V70zVQ3QYqsLPAjQRMO6zfOK9ax31dln3MgKvFDJxBydS2tS3wsn53v+brxDxTA==} + '@aws-sdk/middleware-ssec@3.840.0': + resolution: {integrity: sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.806.0': - resolution: {integrity: sha512-XoIromVffgXnc+/mjlR2EVzQVIei3bPVtafIZNsHuEmUvIWJXiWsa2eJpt3BUqa0HF9YPknK7ommNEhqRb8ucg==} + '@aws-sdk/middleware-user-agent@3.844.0': + resolution: {integrity: sha512-SIbDNUL6ZYXPj5Tk0qEz05sW9kNS1Gl3/wNWEmH+AuUACipkyIeKKWzD6z5433MllETh73vtka/JQF3g7AuZww==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.806.0': - resolution: {integrity: sha512-ua2gzpfQ9MF8Rny+tOAivowOWWvqEusez2rdcQK8jdBjA1ANd/0xzToSZjZh0ziN8Kl8jOhNnHbQJ0v6dT6+hg==} + '@aws-sdk/nested-clients@3.844.0': + resolution: {integrity: sha512-p2XILWc7AcevUSpBg2VtQrk79eWQC4q2JsCSY7HxKpFLZB4mMOfmiTyYkR1gEA6AttK/wpCOtfz+hi1/+z2V1A==} 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.840.0': + resolution: {integrity: sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==} 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.844.0': + resolution: {integrity: sha512-QC8nocQcZ3Bj7vTnuL47iNhcuUjMC46E2L85mU+sPQo3LN2qBVGSOTF+xSWGvmSFDpkN4ZXUMVeA0cJoJFEDFA==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.806.0': - resolution: {integrity: sha512-I6SxcsvV7yinJZmPgGullFHS0tsTKa7K3jEc5dmyCz8X+kZPfsWNffZmtmnCvWXPqMXWBvK6hVaxwomx79yeHA==} + '@aws-sdk/token-providers@3.844.0': + resolution: {integrity: sha512-Kh728FEny0fil+LeH8U1offPJCTd/EDh8liBAvLtViLHt2WoX2xC8rk98D38Q5p79aIUhHb3Pf4n9IZfTu/Kog==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.804.0': - resolution: {integrity: sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==} + '@aws-sdk/types@3.840.0': + resolution: {integrity: sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==} engines: {node: '>=18.0.0'} '@aws-sdk/util-arn-parser@3.804.0': resolution: {integrity: sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.806.0': - resolution: {integrity: sha512-3YRRgZ+qFuWDdm5uAbxKsr65UAil4KkrFKua9f4m7Be3v24ETiFOOqhanFUIk9/WOtvzF7oFEiDjYKDGlwV2xg==} + '@aws-sdk/util-endpoints@3.844.0': + resolution: {integrity: sha512-1DHh0WTUmxlysz3EereHKtKoxVUG9UC5BsfAw6Bm4/6qDlJiqtY3oa2vebkYN23yltKdfsCK65cwnBRU59mWVg==} engines: {node: '>=18.0.0'} '@aws-sdk/util-locate-window@3.804.0': resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} 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.840.0': + resolution: {integrity: sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==} - '@aws-sdk/util-user-agent-node@3.806.0': - resolution: {integrity: sha512-Az2e4/gmPZ4BpB7QRj7U76I+fctXhNcxlcgsaHnMhvt+R30nvzM2EhsyBUvsWl8+r9bnLeYt9BpvEZeq2ANDzA==} + '@aws-sdk/util-user-agent-node@3.844.0': + resolution: {integrity: sha512-0eTpURp9Gxbyyeqr78ogARZMSWS5KUMZuN+XMHxNpQLmn2S+J3g+MAyoklCcwhKXlbdQq2aMULEiy0mqIWytuw==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -522,36 +532,40 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.804.0': - resolution: {integrity: sha512-JbGWp36IG9dgxtvC6+YXwt5WDZYfuamWFtVfK6fQpnmL96dx+GUPOXPKRWdw67WLKf2comHY28iX2d3z35I53Q==} + '@aws-sdk/xml-builder@3.821.0': + resolution: {integrity: sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==} 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.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} engines: {node: '>=6.9.0'} - '@babel/core@7.27.1': - resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} 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.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} 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.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -572,12 +586,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.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.2': - resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} engines: {node: '>=6.0.0'} hasBin: true @@ -672,25 +686,33 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} 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.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.1': - resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + '@babel/types@7.28.0': + resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} 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,161 +749,173 @@ 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] @@ -1111,6 +1145,14 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@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 +1247,66 @@ 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.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} '@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.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} '@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 +1357,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 +1374,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} @@ -1379,36 +1415,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 +1495,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 +1534,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 +1557,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 +1571,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 +1586,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.3.15': + resolution: {integrity: sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w==} + + '@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.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@randlabs/communication-bridge@1.0.1': @@ -1581,8 +1628,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,14 +1692,18 @@ 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.0.4': + resolution: {integrity: sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==} engines: {node: '>=18.0.0'} '@smithy/chunked-blob-reader-native@4.0.0': @@ -1663,56 +1714,56 @@ packages: resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.1.1': - resolution: {integrity: sha512-FZUtpiDnPZQmuIl4lfbdO+u3foNLmRCKct/2w2nRwgB99Yvaq4SHcfxyzMfxkyBrBmgnF1kdXzhHNXN7ycDvWg==} + '@smithy/config-resolver@4.1.4': + resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} - '@smithy/core@3.3.1': - resolution: {integrity: sha512-W7AppgQD3fP1aBmo8wWo0id5zeR2/aYRy067vZsDVaa6v/mdhkg6DxXwEVuSPjZl+ZnvWAQbUMCd5ckw38+tHQ==} + '@smithy/core@3.7.0': + resolution: {integrity: sha512-7ov8hu/4j0uPZv8b27oeOFtIBtlFmM3ibrPv/Omx1uUdoXvcpJ00U+H/OWWC/keAguLlcqwtyL2/jTlSnApgNQ==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.0.3': - resolution: {integrity: sha512-UdNvGjZnunS9+45gHYtVXDynoWH1X0tYY0pS368k1zUZum6Mm4ivU4Se0WhFJf8jNocD+p94khzTtrx4ha3OOQ==} + '@smithy/credential-provider-imds@4.0.6': + resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.0.2': - resolution: {integrity: sha512-p+f2kLSK7ZrXVfskU/f5dzksKTewZk8pJLPvER3aFHPt76C2MxD9vNatSfLzzQSQB4FNO96RK4PSXfhD1TTeMQ==} + '@smithy/eventstream-codec@4.0.4': + resolution: {integrity: sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.0.2': - resolution: {integrity: sha512-CepZCDs2xgVUtH7ZZ7oDdZFH8e6Y2zOv8iiX6RhndH69nlojCALSKK+OXwZUgOtUZEUaZ5e1hULVCHYbCn7pug==} + '@smithy/eventstream-serde-browser@4.0.4': + resolution: {integrity: sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==} 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.1.2': + resolution: {integrity: sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.0.2': - resolution: {integrity: sha512-C5bJ/C6x9ENPMx2cFOirspnF9ZsBVnBMtP6BdPl/qYSuUawdGQ34Lq0dMcf42QTjUZgWGbUIZnz6+zLxJlb9aw==} + '@smithy/eventstream-serde-node@4.0.4': + resolution: {integrity: sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.0.2': - resolution: {integrity: sha512-St8h9JqzvnbB52FtckiHPN4U/cnXcarMniXRXTKn0r4b4XesZOGiAyUdj1aXbqqn1icSqBlzzUsCl6nPB018ng==} + '@smithy/eventstream-serde-universal@4.0.4': + resolution: {integrity: sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.0.2': - resolution: {integrity: sha512-+9Dz8sakS9pe7f2cBocpJXdeVjMopUDLgZs1yWeu7h++WqSbjUYv/JAJwKwXw1HV6gq1jyWjxuyn24E2GhoEcQ==} + '@smithy/fetch-http-handler@5.1.0': + resolution: {integrity: sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==} 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.0.4': + resolution: {integrity: sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.0.2': - resolution: {integrity: sha512-VnTpYPnRUE7yVhWozFdlxcYknv9UN7CeOqSrMH+V877v4oqtVYuoqhIhtSjmGPvYrYnAkaM61sLMKHvxL138yg==} + '@smithy/hash-node@4.0.4': + resolution: {integrity: sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.0.2': - resolution: {integrity: sha512-POWDuTznzbIwlEXEvvXoPMS10y0WKXK790soe57tFRfvf4zBHyzE529HpZMqmDdwG9MfFflnyzndUQ8j78ZdSg==} + '@smithy/hash-stream-node@4.0.4': + resolution: {integrity: sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==} 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.0.4': + resolution: {integrity: sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': @@ -1723,76 +1774,76 @@ packages: resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.0.2': - resolution: {integrity: sha512-Hc0R8EiuVunUewCse2syVgA2AfSRco3LyAv07B/zCOMa+jpXI9ll+Q21Nc6FAlYPcpNcAXqBzMhNs1CD/pP2bA==} + '@smithy/md5-js@4.0.4': + resolution: {integrity: sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.0.2': - resolution: {integrity: sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A==} + '@smithy/middleware-content-length@4.0.4': + resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.1.3': - resolution: {integrity: sha512-w7fJjCSqdTVTs1o1O7SRZm+Umf6r/FzkdlO5OH6tboASeUeugnMgQAs7gnc2dXvJVJtEGrmrBgPZFPxq3wWyzw==} + '@smithy/middleware-endpoint@4.1.14': + resolution: {integrity: sha512-+BGLpK5D93gCcSEceaaYhUD/+OCGXM1IDaq/jKUQ+ujB0PTWlWN85noodKw/IPFZhIKFCNEe19PGd/reUMeLSQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.1.4': - resolution: {integrity: sha512-QtWuD7bd7AAEFKvBmLQdOax25bXv4BACLQNWi3ddvpWwUUSAkAku9mzI+28jbjg48qw28lbzJ+YoYbbaXhLUjw==} + '@smithy/middleware-retry@4.1.15': + resolution: {integrity: sha512-iKYUJpiyTQ33U2KlOZeUb0GwtzWR3C0soYcKuCnTmJrvt6XwTPQZhMfsjJZNw7PpQ3TU4Ati1qLSrkSJxnnSMQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.3': - resolution: {integrity: sha512-rfgDVrgLEVMmMn0BI8O+8OVr6vXzjV7HZj57l0QxslhzbvVfikZbVfBVthjLHqib4BW44QhcIgJpvebHlRaC9A==} + '@smithy/middleware-serde@4.0.8': + resolution: {integrity: sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.0.2': - resolution: {integrity: sha512-eSPVcuJJGVYrFYu2hEq8g8WWdJav3sdrI4o2c6z/rjnYDd3xH9j9E7deZQCzFn4QvGPouLngH3dQ+QVTxv5bOQ==} + '@smithy/middleware-stack@4.0.4': + resolution: {integrity: sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.1.0': - resolution: {integrity: sha512-gmPsv6L3ZRlBinv+vtSGUwfhTMh4+SgjbgGdX7bqYEs3Ys5RYVQtLuZ/WgZZdxn8QrDSUqLmTWunLM96WyM7UQ==} + '@smithy/node-config-provider@4.1.3': + resolution: {integrity: sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.0.4': - resolution: {integrity: sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g==} + '@smithy/node-http-handler@4.1.0': + resolution: {integrity: sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.0.2': - resolution: {integrity: sha512-wNRoQC1uISOuNc2s4hkOYwYllmiyrvVXWMtq+TysNRVQaHm4yoafYQyjN/goYZS+QbYlPIbb/QRjaUZMuzwQ7A==} + '@smithy/property-provider@4.0.4': + resolution: {integrity: sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.1.0': - resolution: {integrity: sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g==} + '@smithy/protocol-http@5.1.2': + resolution: {integrity: sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.0.2': - resolution: {integrity: sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q==} + '@smithy/querystring-builder@4.0.4': + resolution: {integrity: sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.0.2': - resolution: {integrity: sha512-v6w8wnmZcVXjfVLjxw8qF7OwESD9wnpjp0Dqry/Pod0/5vcEA3qxCr+BhbOHlxS8O+29eLpT3aagxXGwIoEk7Q==} + '@smithy/querystring-parser@4.0.4': + resolution: {integrity: sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.0.3': - resolution: {integrity: sha512-FTbcajmltovWMjj3tksDQdD23b2w6gH+A0DYA1Yz3iSpjDj8fmkwy62UnXcWMy4d5YoMoSyLFHMfkEVEzbiN8Q==} + '@smithy/service-error-classification@4.0.6': + resolution: {integrity: sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.0.2': - resolution: {integrity: sha512-J9/gTWBGVuFZ01oVA6vdb4DAjf1XbDhK6sLsu3OS9qmLrS6KB5ygpeHiM3miIbj1qgSJ96GYszXFWv6ErJ8QEw==} + '@smithy/shared-ini-file-loader@4.0.4': + resolution: {integrity: sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.1.0': - resolution: {integrity: sha512-4t5WX60sL3zGJF/CtZsUQTs3UrZEDO2P7pEaElrekbLqkWPYkgqNW1oeiNYC6xXifBnT9dVBOnNQRvOE9riU9w==} + '@smithy/signature-v4@5.1.2': + resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.2.3': - resolution: {integrity: sha512-j/RRx6N007rJQ3qyjN4yuX9B0bxTn9ynDVxYQ43mcs7fluVJXmQGquy0TrWJfOPZcIikpY377GunZ2UK90GHYQ==} + '@smithy/smithy-client@4.4.6': + resolution: {integrity: sha512-3wfhywdzB/CFszP6moa5L3lf5/zSfQoH0kvVSdkyK2az5qZet0sn2PAHjcTDiq296Y4RP5yxF7B6S6+3oeBUCQ==} engines: {node: '>=18.0.0'} - '@smithy/types@4.2.0': - resolution: {integrity: sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg==} + '@smithy/types@4.3.1': + resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.0.2': - resolution: {integrity: sha512-Bm8n3j2ScqnT+kJaClSVCMeiSenK6jVAzZCNewsYWuZtnBehEz4r2qP0riZySZVfzB+03XZHJeqfmJDkeeSLiQ==} + '@smithy/url-parser@4.0.4': + resolution: {integrity: sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==} engines: {node: '>=18.0.0'} '@smithy/util-base64@4.0.0': @@ -1819,32 +1870,32 @@ packages: resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.11': - resolution: {integrity: sha512-Z49QNUSKbEj7JVZqaSUZkTkexRciQBbmonJ8AMar4fA0S2kvVpgjeVyGXnZYWTFzkgEwStacjFq4cQKbaQ8AnQ==} + '@smithy/util-defaults-mode-browser@4.0.22': + resolution: {integrity: sha512-hjElSW18Wq3fUAWVk6nbk7pGrV7ZT14DL1IUobmqhV3lxcsIenr5FUsDe2jlTVaS8OYBI3x+Og9URv5YcKb5QA==} 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.0.22': + resolution: {integrity: sha512-7B8mfQBtwwr2aNRRmU39k/bsRtv9B6/1mTMrGmmdJFKmLAH+KgIiOuhaqfKOBGh9sZ/VkZxbvm94rI4MMYpFjQ==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.0.3': - resolution: {integrity: sha512-284PZFhCMdudqq61/E67zJ3i10gCYrMBjXcMg3h048qI39gTXQCCeNZvtJhL4vrj9yMpJ/y9M+Ek7V0o5tak3w==} + '@smithy/util-endpoints@3.0.6': + resolution: {integrity: sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==} engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@4.0.0': resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.0.2': - resolution: {integrity: sha512-6GDamTGLuBQVAEuQ4yDQ+ti/YINf/MEmIegrEeg7DdB/sld8BX1lqt9RRuIcABOhAGTA50bRbPzErez7SlDtDQ==} + '@smithy/util-middleware@4.0.4': + resolution: {integrity: sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.0.3': - resolution: {integrity: sha512-DPuYjZQDXmKr/sNvy9Spu8R/ESa2e22wXZzSAY6NkjOLj6spbIje/Aq8rT97iUMdDj0qHMRIe+bTxvlU74d9Ng==} + '@smithy/util-retry@4.0.6': + resolution: {integrity: sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.2.0': - resolution: {integrity: sha512-Vj1TtwWnuWqdgQI6YTUF5hQ/0jmFiOYsc51CSMgj7QfyO+RF4EnT2HNjoviNlOOmgzgvf3f5yno+EiC4vrnaWQ==} + '@smithy/util-stream@4.2.3': + resolution: {integrity: sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.0.0': @@ -1859,8 +1910,8 @@ packages: resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.0.3': - resolution: {integrity: sha512-JtaY3FxmD+te+KSI2FJuEcfNC9T/DGGVf551babM7fAaXhjJUt7oSYurH1Devxd2+BOSUACCgt3buinx4UnmEA==} + '@smithy/util-waiter@4.0.6': + resolution: {integrity: sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg==} engines: {node: '>=18.0.0'} '@solana/buffer-layout-utils@0.2.0': @@ -1881,11 +1932,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 +1958,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 +1998,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 +2063,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,12 +2073,12 @@ 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: @@ -2040,6 +2091,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 +2107,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==} @@ -2076,8 +2131,8 @@ packages: '@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 +2140,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 +2152,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 +2161,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 +2188,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==} @@ -2167,20 +2231,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 +2261,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==} @@ -2325,8 +2395,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 +2444,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 +2558,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 +2593,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 +2658,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: @@ -2672,8 +2742,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 +2782,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 +2838,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.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} @@ -2818,6 +2892,9 @@ packages: 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==} @@ -2850,6 +2927,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,6 +2952,9 @@ packages: borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} @@ -2876,11 +2962,11 @@ packages: 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 +2991,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.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2978,6 +3064,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 +3096,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.30001727: + resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} capability@0.2.5: resolution: {integrity: sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==} @@ -3012,6 +3106,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,8 +3122,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.6.0: - resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} char-regex@1.0.2: @@ -3095,9 +3193,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 +3208,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,14 +3266,14 @@ 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==} engines: {node: '>=20'} + commander@14.0.1: + resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} + engines: {node: '>=20'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3264,19 +3365,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.0.0: + resolution: {integrity: sha512-6aB9WrymEruVDwQOwa5AuYk4/Gb+HaJgLHGKOA9BXTqgsIFvbdHzQzZOuqNCOooTGciPDaHzTlGkU5P6kYVUYw==} - 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.0: + resolution: {integrity: sha512-ANuTejMc7MI4L4hc8KBKVNKg8yuwXFTlKAjCFwPRGsrnO63KUDKbDVY7/m/RADeeAmFZmAwRjk9E6LUh32026A==} 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'} @@ -3320,15 +3425,6 @@ 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==} engines: {node: '>=6.0'} @@ -3345,8 +3441,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==} @@ -3382,6 +3478,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 +3522,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 +3565,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: @@ -3494,8 +3594,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.151: - resolution: {integrity: sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==} + electron-to-chromium@1.5.182: + resolution: {integrity: sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -3504,8 +3604,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==} @@ -3527,8 +3627,8 @@ packages: 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==} @@ -3548,8 +3648,8 @@ packages: 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 +3682,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 @@ -3659,8 +3759,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 +3786,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 +3802,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.4.0: - resolution: {integrity: sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==} + eslint-plugin-prettier@5.5.1: + resolution: {integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -3913,8 +4013,8 @@ packages: fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - 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 +4041,8 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fdir@6.4.4: - resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -3952,6 +4052,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'} @@ -4032,10 +4136,14 @@ packages: resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} engines: {node: '>= 6'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} 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 +4206,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 +4225,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 +4237,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 +4259,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 +4277,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 +4293,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==} @@ -4212,8 +4326,8 @@ packages: peerDependencies: hardhat: ^2.0.0 - hardhat@2.24.0: - resolution: {integrity: sha512-wDkD5GPmttYv21MR7tGDkyQ22tO2V86OEV8pA7NcXWYUpibe8XZ2EanXCeRHO61vwEx0f7/M+NqrhJwasaNMJg==} + hardhat@2.25.0: + resolution: {integrity: sha512-yBiA74Yj3VnTRj7lhnn8GalvBdvsMOqTKRrRATSy/2v0VIR2hR0Jcnmfn4aQBLtGAnr3Q2c8CxL0g3LYegUp+g==} hasBin: true peerDependencies: ts-node: '*' @@ -4297,6 +4411,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 +4422,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'} @@ -4477,12 +4598,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 +4630,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'} @@ -4645,6 +4766,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + jake@10.9.2: resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} @@ -4951,21 +5076,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 +5133,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.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -5120,6 +5249,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 +5263,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 +5339,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 +5359,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 @@ -5251,8 +5391,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 +5411,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 +5429,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 @@ -5299,6 +5448,10 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + 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 +5459,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 +5570,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 +5647,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==} @@ -5529,8 +5694,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.7.0: + resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} hasBin: true pirates@4.0.7: @@ -5545,8 +5710,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.13.1: + resolution: {integrity: sha512-N+vxpcejDV+r4MXfRO6NpMllygxa89urKMOhaBtwolYhjQXIHJwNz3Z+9rhVHrW5YAQrntQwDFkkIzY3fgHPrQ==} engines: {node: '>=18.12'} hasBin: true @@ -5571,8 +5736,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 +5758,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 +5781,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 +5791,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 +5812,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 +5904,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 +5938,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 +5978,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==} @@ -5883,8 +6070,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 +6111,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'} @@ -5983,12 +6174,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 +6285,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 +6301,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 +6324,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'} @@ -6186,8 +6381,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 +6407,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.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} 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==} @@ -6327,17 +6522,18 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-jest@29.3.2: - resolution: {integrity: sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==} + ts-jest@29.4.0: + resolution: {integrity: sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==} 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 +6546,8 @@ packages: optional: true esbuild: optional: true + jest-util: + optional: true ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} @@ -6386,8 +6584,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 @@ -6481,8 +6679,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 +6759,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 +6781,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==} @@ -6651,8 +6856,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,16 +6938,16 @@ 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==} engines: {node: '>= 14.6'} hasBin: true + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -6771,43 +6976,60 @@ 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': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.840.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.840.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/types': 3.840.0 '@aws-sdk/util-locate-window': 3.804.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -6817,7 +7039,7 @@ 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/types': 3.840.0 '@aws-sdk/util-locate-window': 3.804.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -6825,7 +7047,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.840.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -6834,419 +7056,427 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.840.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.806.0': + '@aws-sdk/client-s3@3.844.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 + '@aws-sdk/core': 3.844.0 + '@aws-sdk/credential-provider-node': 3.844.0 + '@aws-sdk/middleware-bucket-endpoint': 3.840.0 + '@aws-sdk/middleware-expect-continue': 3.840.0 + '@aws-sdk/middleware-flexible-checksums': 3.844.0 + '@aws-sdk/middleware-host-header': 3.840.0 + '@aws-sdk/middleware-location-constraint': 3.840.0 + '@aws-sdk/middleware-logger': 3.840.0 + '@aws-sdk/middleware-recursion-detection': 3.840.0 + '@aws-sdk/middleware-sdk-s3': 3.844.0 + '@aws-sdk/middleware-ssec': 3.840.0 + '@aws-sdk/middleware-user-agent': 3.844.0 + '@aws-sdk/region-config-resolver': 3.840.0 + '@aws-sdk/signature-v4-multi-region': 3.844.0 + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-endpoints': 3.844.0 + '@aws-sdk/util-user-agent-browser': 3.840.0 + '@aws-sdk/util-user-agent-node': 3.844.0 + '@aws-sdk/xml-builder': 3.821.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.7.0 + '@smithy/eventstream-serde-browser': 4.0.4 + '@smithy/eventstream-serde-config-resolver': 4.1.2 + '@smithy/eventstream-serde-node': 4.0.4 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/hash-blob-browser': 4.0.4 + '@smithy/hash-node': 4.0.4 + '@smithy/hash-stream-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/md5-js': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.14 + '@smithy/middleware-retry': 4.1.15 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.1.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.6 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 '@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-defaults-mode-browser': 4.0.22 + '@smithy/util-defaults-mode-node': 4.0.22 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 + '@smithy/util-stream': 4.2.3 '@smithy/util-utf8': 4.0.0 - '@smithy/util-waiter': 4.0.3 + '@smithy/util-waiter': 4.0.6 + '@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.844.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 + '@aws-sdk/core': 3.844.0 + '@aws-sdk/middleware-host-header': 3.840.0 + '@aws-sdk/middleware-logger': 3.840.0 + '@aws-sdk/middleware-recursion-detection': 3.840.0 + '@aws-sdk/middleware-user-agent': 3.844.0 + '@aws-sdk/region-config-resolver': 3.840.0 + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-endpoints': 3.844.0 + '@aws-sdk/util-user-agent-browser': 3.840.0 + '@aws-sdk/util-user-agent-node': 3.844.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.7.0 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.14 + '@smithy/middleware-retry': 4.1.15 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.1.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.6 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 '@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-defaults-mode-browser': 4.0.22 + '@smithy/util-defaults-mode-node': 4.0.22 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 '@smithy/util-utf8': 4.0.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.844.0': + dependencies: + '@aws-sdk/types': 3.840.0 + '@aws-sdk/xml-builder': 3.821.0 + '@smithy/core': 3.7.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/smithy-client': 4.4.6 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-utf8': 4.0.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.844.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.844.0 + '@aws-sdk/types': 3.840.0 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 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.844.0': + dependencies: + '@aws-sdk/core': 3.844.0 + '@aws-sdk/types': 3.840.0 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/node-http-handler': 4.1.0 + '@smithy/property-provider': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.6 + '@smithy/types': 4.3.1 + '@smithy/util-stream': 4.2.3 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.844.0': + dependencies: + '@aws-sdk/core': 3.844.0 + '@aws-sdk/credential-provider-env': 3.844.0 + '@aws-sdk/credential-provider-http': 3.844.0 + '@aws-sdk/credential-provider-process': 3.844.0 + '@aws-sdk/credential-provider-sso': 3.844.0 + '@aws-sdk/credential-provider-web-identity': 3.844.0 + '@aws-sdk/nested-clients': 3.844.0 + '@aws-sdk/types': 3.840.0 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 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.844.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.844.0 + '@aws-sdk/credential-provider-http': 3.844.0 + '@aws-sdk/credential-provider-ini': 3.844.0 + '@aws-sdk/credential-provider-process': 3.844.0 + '@aws-sdk/credential-provider-sso': 3.844.0 + '@aws-sdk/credential-provider-web-identity': 3.844.0 + '@aws-sdk/types': 3.840.0 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.806.0': + '@aws-sdk/credential-provider-process@3.844.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.844.0 + '@aws-sdk/types': 3.840.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.806.0': + '@aws-sdk/credential-provider-sso@3.844.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.844.0 + '@aws-sdk/core': 3.844.0 + '@aws-sdk/token-providers': 3.844.0 + '@aws-sdk/types': 3.840.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.806.0': + '@aws-sdk/credential-provider-web-identity@3.844.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.844.0 + '@aws-sdk/nested-clients': 3.844.0 + '@aws-sdk/types': 3.840.0 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.806.0': + '@aws-sdk/middleware-bucket-endpoint@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.840.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/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 '@smithy/util-config-provider': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.804.0': + '@aws-sdk/middleware-expect-continue@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.840.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.806.0': + '@aws-sdk/middleware-flexible-checksums@3.844.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 + '@aws-sdk/core': 3.844.0 + '@aws-sdk/types': 3.840.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/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.3 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.804.0': + '@aws-sdk/middleware-host-header@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.840.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.804.0': + '@aws-sdk/middleware-location-constraint@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.840.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.804.0': + '@aws-sdk/middleware-logger@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.840.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.804.0': + '@aws-sdk/middleware-recursion-detection@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.840.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.806.0': + '@aws-sdk/middleware-sdk-s3@3.844.0': dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/core': 3.844.0 + '@aws-sdk/types': 3.840.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/core': 3.7.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/smithy-client': 4.4.6 + '@smithy/types': 4.3.1 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-stream': 4.2.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.3 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.804.0': + '@aws-sdk/middleware-ssec@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.840.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.806.0': + '@aws-sdk/middleware-user-agent@3.844.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.844.0 + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-endpoints': 3.844.0 + '@smithy/core': 3.7.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.806.0': + '@aws-sdk/nested-clients@3.844.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 + '@aws-sdk/core': 3.844.0 + '@aws-sdk/middleware-host-header': 3.840.0 + '@aws-sdk/middleware-logger': 3.840.0 + '@aws-sdk/middleware-recursion-detection': 3.840.0 + '@aws-sdk/middleware-user-agent': 3.844.0 + '@aws-sdk/region-config-resolver': 3.840.0 + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-endpoints': 3.844.0 + '@aws-sdk/util-user-agent-browser': 3.840.0 + '@aws-sdk/util-user-agent-node': 3.844.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.7.0 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.14 + '@smithy/middleware-retry': 4.1.15 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.1.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.6 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 '@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-defaults-mode-browser': 4.0.22 + '@smithy/util-defaults-mode-node': 4.0.22 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.806.0': + '@aws-sdk/region-config-resolver@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.840.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.2 + '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.806.0': + '@aws-sdk/signature-v4-multi-region@3.844.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.844.0 + '@aws-sdk/types': 3.840.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.806.0': + '@aws-sdk/token-providers@3.844.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.844.0 + '@aws-sdk/nested-clients': 3.844.0 + '@aws-sdk/types': 3.840.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.804.0': + '@aws-sdk/types@3.840.0': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@aws-sdk/util-arn-parser@3.804.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.806.0': + '@aws-sdk/util-endpoints@3.844.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 - '@smithy/util-endpoints': 3.0.3 + '@aws-sdk/types': 3.840.0 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-endpoints': 3.0.6 tslib: 2.8.1 '@aws-sdk/util-locate-window@3.804.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.804.0': + '@aws-sdk/util-user-agent-browser@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.840.0 + '@smithy/types': 4.3.1 bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.806.0': + '@aws-sdk/util-user-agent-node@3.844.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.844.0 + '@aws-sdk/types': 3.840.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.804.0': + '@aws-sdk/xml-builder@3.821.0': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@babel/code-frame@7.27.1': @@ -7255,57 +7485,59 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.2': {} + '@babel/compat-data@7.28.0': {} - '@babel/core@7.27.1': + '@babel/core@7.28.0': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.1 + '@babel/generator': 7.28.0 '@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.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.1 - '@babel/types': 7.27.1 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1(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.0': 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.0 + '@babel/types': 7.28.0 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.2 + '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.5 + browserslist: 4.25.1 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.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.1 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color @@ -7317,142 +7549,159 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.27.1': + '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.1 + '@babel/types': 7.28.0 - '@babel/parser@7.27.2': + '@babel/parser@7.28.0': dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.28.0 - '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.27.1': {} + '@babel/runtime@7.27.6': {} '@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.0 + '@babel/types': 7.28.0 - '@babel/traverse@7.27.1': + '@babel/traverse@7.28.0': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.1 - '@babel/parser': 7.27.2 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/types': 7.27.1 - debug: 4.4.0 - globals: 11.12.0 + '@babel/types': 7.28.0 + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/types@7.27.1': + '@babel/types@7.28.0': 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.3 + got: 11.8.6 + json-bigint: 1.0.0 + + '@blockfrost/openapi@0.1.70-beta.0': 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)) + ajv: 8.17.1 + cbor: 9.0.2 + rimraf: 6.0.1 + yaml: 2.8.0 + + '@bundlr-network/client@0.7.17(bufferutil@4.0.9)(debug@4.4.1)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@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) '@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) + 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.1)(encoding@0.1.13)(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.10.0(debug@4.4.1) base64url: 3.0.1 bignumber.js: 9.3.0 bs58: 4.0.1 commander: 8.3.0 - csv: 6.3.11 + csv: 6.4.0 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) inquirer: 8.2.6 js-sha256: 0.9.0 @@ -7535,95 +7784,105 @@ 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)': @@ -7636,7 +7895,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -7710,7 +7969,7 @@ snapshots: 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 +8377,7 @@ snapshots: fastify-plugin: 4.5.1 openapi-types: 12.1.3 rfdc: 1.4.1 - yaml: 2.7.1 + yaml: 2.8.0 '@fastify/swagger@8.15.0': dependencies: @@ -8126,7 +8385,7 @@ snapshots: json-schema-resolver: 2.0.0 openapi-types: 12.1.3 rfdc: 1.4.1 - yaml: 2.7.1 + yaml: 2.8.0 transitivePeerDependencies: - supports-color @@ -8147,7 +8406,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -8156,6 +8415,12 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@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 @@ -8268,7 +8533,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.29 '@types/node': 15.14.9 chalk: 4.1.2 collect-v8-coverage: 1.0.2 @@ -8302,7 +8567,7 @@ snapshots: '@jest/source-map@29.6.3': dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -8328,9 +8593,9 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -8361,142 +8626,139 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} + '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 - '@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.10.0 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.10.0 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.10.0 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 + '@ledgerhq/types-live': 6.84.0 + axios: 1.10.0 bignumber.js: 9.3.0 - semver: 7.7.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 rxjs: 7.8.2 @@ -8519,7 +8781,7 @@ snapshots: '@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) bs58: 5.0.0 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -8532,7 +8794,7 @@ snapshots: '@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) bs58: 5.0.0 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -8544,7 +8806,7 @@ snapshots: dependencies: ansicolors: 0.3.2 bn.js: 5.2.1 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8552,7 +8814,7 @@ snapshots: dependencies: ansicolors: 0.3.2 bn.js: 5.2.1 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8560,7 +8822,7 @@ snapshots: dependencies: ansicolors: 0.3.2 bn.js: 5.2.1 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8569,7 +8831,7 @@ snapshots: ansicolors: 0.3.2 assert: 2.1.0 bn.js: 5.2.1 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8577,8 +8839,8 @@ snapshots: '@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)': 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.844.0 + '@bundlr-network/client': 0.7.17(bufferutil@4.0.9)(debug@4.4.1)(encoding@0.1.13)(typescript@5.8.3)(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) @@ -8592,7 +8854,7 @@ snapshots: bs58: 5.0.0 buffer: 6.0.3 cross-fetch: 3.2.0(encoding@0.1.13) - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) eventemitter3: 4.0.7 lodash.clonedeep: 4.5.0 mime: 3.0.0 @@ -8654,7 +8916,7 @@ snapshots: '@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) bn.js: 5.2.1 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -8671,7 +8933,7 @@ snapshots: '@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) 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 +8944,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,10 +8963,6 @@ snapshots: dependencies: '@noble/hashes': 1.7.2 - '@noble/curves@1.9.0': - dependencies: - '@noble/hashes': 1.8.0 - '@noble/curves@1.9.1': dependencies: '@noble/hashes': 1.8.0 @@ -8735,29 +8995,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 @@ -8798,36 +9058,19 @@ snapshots: 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 + 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)(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/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)(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 - '@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/v3-sdk': 3.9.6(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 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) @@ -8839,10 +9082,10 @@ 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)(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) + '@pancakeswap/chains': 0.7.0 + '@pancakeswap/sdk': 5.8.17(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) transitivePeerDependencies: - bufferutil @@ -8852,24 +9095,10 @@ 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)': - 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) - 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/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/permit2-sdk@1.1.6(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) + '@pancakeswap/chains': 0.7.0 + '@pancakeswap/sdk': 5.8.17(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: @@ -8880,52 +9109,31 @@ snapshots: - 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.8.3)(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.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/v2-sdk': 1.1.1(bufferutil@4.0.9)(typescript@5.8.3)(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.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.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)(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/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.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/swap-sdk-solana': 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) + '@pancakeswap/v2-sdk': 1.1.6(bufferutil@4.0.9)(typescript@5.8.3)(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 @@ -8940,17 +9148,17 @@ 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)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react@18.3.1)(typescript@5.8.3)(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)(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)(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)(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.10(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/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)(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.6(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) async-retry: 1.3.3 debug: 4.4.1(supports-color@8.1.1) graphql: 16.11.0 @@ -8973,11 +9181,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)(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)': 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)(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) tiny-invariant: 1.3.3 transitivePeerDependencies: - '@reduxjs/toolkit' @@ -9007,35 +9215,22 @@ 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.8.3)(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) + viem: 2.37.7(bufferutil@4.0.9)(typescript@5.8.3)(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.24.4)': + '@pancakeswap/swap-sdk-evm@1.1.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': 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) - 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)': - 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 @@ -9046,12 +9241,12 @@ snapshots: - 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)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(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)(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.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 transitivePeerDependencies: @@ -9069,10 +9264,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)(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)': 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)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(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 +9281,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.8.3)(zod@3.25.76))(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.7(bufferutil@4.0.9)(typescript@5.8.3)(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)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/permit2-sdk': 1.1.6(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)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@pancakeswap/smart-router': 7.5.3(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.6(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) + abitype: 1.1.0(typescript@5.8.3)(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.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@reduxjs/toolkit' - bufferutil @@ -9111,37 +9306,24 @@ 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.8.3)(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.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.24.4) + viem: 2.37.7(bufferutil@4.0.9)(typescript@5.8.3)(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.8.3)(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.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: @@ -9160,46 +9342,27 @@ 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.8.3)(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.8.3)(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) - 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)': - 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/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.37.7(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/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/v3-sdk@3.9.6(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) + '@pancakeswap/chains': 0.7.0 + '@pancakeswap/sdk': 5.8.17(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 @@ -9215,22 +9378,40 @@ snapshots: - 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)': + '@pancakeswap/v4-sdk@0.1.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': 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) + '@pancakeswap/v3-sdk': 3.9.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) 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.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod + '@peculiar/asn1-schema@2.3.15': + dependencies: + 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.3.15 + '@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.7': {} '@randlabs/communication-bridge@1.0.1': {} @@ -9243,7 +9424,7 @@ snapshots: '@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 + axios: 1.10.0 big.js: 6.2.2 bn.js: 5.2.1 dayjs: 1.11.13 @@ -9264,7 +9445,7 @@ snapshots: '@scure/base@1.1.9': {} - '@scure/base@1.2.5': {} + '@scure/base@1.2.6': {} '@scure/bip32@1.1.5': dependencies: @@ -9282,7 +9463,7 @@ snapshots: dependencies: '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 - '@scure/base': 1.2.5 + '@scure/base': 1.2.6 '@scure/bip39@1.1.1': dependencies: @@ -9297,7 +9478,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 +9541,8 @@ snapshots: '@sinclair/typebox@0.33.22': {} + '@sindresorhus/is@4.6.0': {} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -9368,9 +9551,9 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@4.0.2': + '@smithy/abort-controller@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/chunked-blob-reader-native@4.0.0': @@ -9382,94 +9565,95 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.1.1': + '@smithy/config-resolver@4.1.4': dependencies: - '@smithy/node-config-provider': 4.1.0 - '@smithy/types': 4.2.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.2 + '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@smithy/core@3.3.1': + '@smithy/core@3.7.0': dependencies: - '@smithy/middleware-serde': 4.0.3 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@smithy/middleware-serde': 4.0.8 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-stream': 4.2.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.3 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.0.3': + '@smithy/credential-provider-imds@4.0.6': 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.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 tslib: 2.8.1 - '@smithy/eventstream-codec@4.0.2': + '@smithy/eventstream-codec@4.0.4': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 '@smithy/util-hex-encoding': 4.0.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.0.2': + '@smithy/eventstream-serde-browser@4.0.4': dependencies: - '@smithy/eventstream-serde-universal': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/eventstream-serde-universal': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.1.0': + '@smithy/eventstream-serde-config-resolver@4.1.2': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.0.2': + '@smithy/eventstream-serde-node@4.0.4': dependencies: - '@smithy/eventstream-serde-universal': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/eventstream-serde-universal': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.0.2': + '@smithy/eventstream-serde-universal@4.0.4': dependencies: - '@smithy/eventstream-codec': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/eventstream-codec': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.0.2': + '@smithy/fetch-http-handler@5.1.0': dependencies: - '@smithy/protocol-http': 5.1.0 - '@smithy/querystring-builder': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/querystring-builder': 4.0.4 + '@smithy/types': 4.3.1 '@smithy/util-base64': 4.0.0 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.0.2': + '@smithy/hash-blob-browser@4.0.4': dependencies: '@smithy/chunked-blob-reader': 5.0.0 '@smithy/chunked-blob-reader-native': 4.0.0 - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/hash-node@4.0.2': + '@smithy/hash-node@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 '@smithy/util-buffer-from': 4.0.0 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/hash-stream-node@4.0.2': + '@smithy/hash-stream-node@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/invalid-dependency@4.0.2': + '@smithy/invalid-dependency@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': @@ -9480,125 +9664,126 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.0.2': + '@smithy/md5-js@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/middleware-content-length@4.0.2': + '@smithy/middleware-content-length@4.0.4': dependencies: - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.1.3': + '@smithy/middleware-endpoint@4.1.14': 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.7.0 + '@smithy/middleware-serde': 4.0.8 + '@smithy/node-config-provider': 4.1.3 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@smithy/middleware-retry@4.1.4': + '@smithy/middleware-retry@4.1.15': 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.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/service-error-classification': 4.0.6 + '@smithy/smithy-client': 4.4.6 + '@smithy/types': 4.3.1 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@4.0.3': + '@smithy/middleware-serde@4.0.8': dependencies: - '@smithy/types': 4.2.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/middleware-stack@4.0.2': + '@smithy/middleware-stack@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/node-config-provider@4.1.0': + '@smithy/node-config-provider@4.1.3': dependencies: - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/node-http-handler@4.0.4': + '@smithy/node-http-handler@4.1.0': 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.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/querystring-builder': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/property-provider@4.0.2': + '@smithy/property-provider@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/protocol-http@5.1.0': + '@smithy/protocol-http@5.1.2': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/querystring-builder@4.0.2': + '@smithy/querystring-builder@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 '@smithy/util-uri-escape': 4.0.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.0.2': + '@smithy/querystring-parser@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/service-error-classification@4.0.3': + '@smithy/service-error-classification@4.0.6': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 - '@smithy/shared-ini-file-loader@4.0.2': + '@smithy/shared-ini-file-loader@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/signature-v4@5.1.0': + '@smithy/signature-v4@5.1.2': dependencies: '@smithy/is-array-buffer': 4.0.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-middleware': 4.0.2 + '@smithy/util-middleware': 4.0.4 '@smithy/util-uri-escape': 4.0.0 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/smithy-client@4.2.3': + '@smithy/smithy-client@4.4.6': 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.7.0 + '@smithy/middleware-endpoint': 4.1.14 + '@smithy/middleware-stack': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-stream': 4.2.3 tslib: 2.8.1 - '@smithy/types@4.2.0': + '@smithy/types@4.3.1': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.0.2': + '@smithy/url-parser@4.0.4': dependencies: - '@smithy/querystring-parser': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/querystring-parser': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/util-base64@4.0.0': @@ -9629,50 +9814,50 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.11': + '@smithy/util-defaults-mode-browser@4.0.22': dependencies: - '@smithy/property-provider': 4.0.2 - '@smithy/smithy-client': 4.2.3 - '@smithy/types': 4.2.0 + '@smithy/property-provider': 4.0.4 + '@smithy/smithy-client': 4.4.6 + '@smithy/types': 4.3.1 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.11': + '@smithy/util-defaults-mode-node@4.0.22': 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.1.4 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/smithy-client': 4.4.6 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/util-endpoints@3.0.3': + '@smithy/util-endpoints@3.0.6': dependencies: - '@smithy/node-config-provider': 4.1.0 - '@smithy/types': 4.2.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/util-hex-encoding@4.0.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.0.2': + '@smithy/util-middleware@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/util-retry@4.0.3': + '@smithy/util-retry@4.0.6': dependencies: - '@smithy/service-error-classification': 4.0.3 - '@smithy/types': 4.2.0 + '@smithy/service-error-classification': 4.0.6 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/util-stream@4.2.0': + '@smithy/util-stream@4.2.3': dependencies: - '@smithy/fetch-http-handler': 5.0.2 - '@smithy/node-http-handler': 4.0.4 - '@smithy/types': 4.2.0 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/node-http-handler': 4.1.0 + '@smithy/types': 4.3.1 '@smithy/util-base64': 4.0.0 '@smithy/util-buffer-from': 4.0.0 '@smithy/util-hex-encoding': 4.0.0 @@ -9693,10 +9878,10 @@ snapshots: '@smithy/util-buffer-from': 4.0.0 tslib: 2.8.1 - '@smithy/util-waiter@4.0.3': + '@smithy/util-waiter@4.0.6': dependencies: - '@smithy/abort-controller': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/abort-controller': 4.0.4 + '@smithy/types': 4.3.1 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)': @@ -9725,9 +9910,9 @@ snapshots: '@solana/errors': 2.0.0-rc.1(typescript@5.8.3) typescript: 5.8.3 - '@solana/codecs-core@2.1.0(typescript@5.8.3)': + '@solana/codecs-core@2.3.0(typescript@5.8.3)': dependencies: - '@solana/errors': 2.1.0(typescript@5.8.3) + '@solana/errors': 2.3.0(typescript@5.8.3) typescript: 5.8.3 '@solana/codecs-data-structures@2.0.0-preview.4(typescript@5.8.3)': @@ -9756,10 +9941,10 @@ snapshots: '@solana/errors': 2.0.0-rc.1(typescript@5.8.3) typescript: 5.8.3 - '@solana/codecs-numbers@2.1.0(typescript@5.8.3)': + '@solana/codecs-numbers@2.3.0(typescript@5.8.3)': dependencies: - '@solana/codecs-core': 2.1.0(typescript@5.8.3) - '@solana/errors': 2.1.0(typescript@5.8.3) + '@solana/codecs-core': 2.3.0(typescript@5.8.3) + '@solana/errors': 2.3.0(typescript@5.8.3) typescript: 5.8.3 '@solana/codecs-strings@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': @@ -9802,20 +9987,20 @@ snapshots: '@solana/errors@2.0.0-preview.4(typescript@5.8.3)': dependencies: - chalk: 5.6.0 + chalk: 5.4.1 commander: 12.1.0 typescript: 5.8.3 '@solana/errors@2.0.0-rc.1(typescript@5.8.3)': dependencies: - chalk: 5.6.0 + chalk: 5.4.1 commander: 12.1.0 typescript: 5.8.3 - '@solana/errors@2.1.0(typescript@5.8.3)': + '@solana/errors@2.3.0(typescript@5.8.3)': dependencies: - chalk: 5.6.0 - commander: 13.1.0 + chalk: 5.4.1 + commander: 14.0.0 typescript: 5.8.3 '@solana/options@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': @@ -9849,26 +10034,26 @@ snapshots: - 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)': + '@solana/spl-token-group@0.0.7(@solana/web3.js@1.98.4(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)': 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)(encoding@0.1.13)(typescript@5.8.3)(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-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)': 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.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-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)(encoding@0.1.13)(typescript@5.8.3)(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.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)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript @@ -9904,13 +10089,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)(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)': 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/spl-token-group': 0.0.7(@solana/web3.js@1.98.4(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)(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.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) buffer: 6.0.3 transitivePeerDependencies: - bufferutil @@ -9938,7 +10123,7 @@ 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.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(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) @@ -9951,14 +10136,14 @@ 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)': + '@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 '@solana/buffer-layout': 4.0.1 + '@solana/codecs-numbers': 2.3.0(typescript@5.8.3) agentkeepalive: 4.6.0 - bigint-buffer: 1.1.5 bn.js: 5.2.1 borsh: 0.7.0 bs58: 4.0.1 @@ -9971,15 +10156,16 @@ snapshots: transitivePeerDependencies: - bufferutil - encoding + - typescript - 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)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.0 + '@babel/runtime': 7.27.6 + '@noble/curves': 1.9.2 '@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.8.3) agentkeepalive: 4.6.0 bn.js: 5.2.1 borsh: 0.7.0 @@ -10000,7 +10186,7 @@ snapshots: 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 + axios: 1.10.0 eventemitter3: 5.0.1 lodash: 4.17.21 transitivePeerDependencies: @@ -10019,6 +10205,10 @@ snapshots: 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 +10217,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 +10228,30 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.28.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.28.0 '@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 +10265,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 +10284,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 +10303,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 +10331,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': {} @@ -10161,7 +10364,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: '@types/node': 15.14.9 - form-data: 4.0.2 + form-data: 4.0.3 '@types/node@11.11.6': {} @@ -10173,24 +10376,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 +10407,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: @@ -10244,7 +10453,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -10260,7 +10469,7 @@ snapshots: 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 + debug: 4.4.1(supports-color@8.1.1) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -10274,11 +10483,11 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -10315,25 +10524,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.25.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))': 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.25.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/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.25.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.25.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)) 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.25.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))': 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.25.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/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.25.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.25.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)) transitivePeerDependencies: - hardhat @@ -10376,24 +10585,24 @@ 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)(encoding@0.1.13)(hardhat@2.25.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)': 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) '@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/router-sdk': 1.23.0(hardhat@2.25.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/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.25.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/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.25.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/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.25.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.25.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)) async-retry: 1.3.3 await-timeout: 1.1.1 - axios: 1.9.0 + axios: 1.10.0 brotli: 1.3.2 bunyan: 1.8.15 bunyan-blackhole: 1.1.1(bunyan@1.8.15) @@ -10412,31 +10621,31 @@ 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.25.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))': 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.25.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)) 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.25.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)': 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/router-sdk': 1.23.0(hardhat@2.25.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/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)) + '@uniswap/v3-sdk': 3.25.2(hardhat@2.25.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.25.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 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -10444,18 +10653,18 @@ snapshots: - 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.25.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)': 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/router-sdk': 2.0.4(hardhat@2.25.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/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)) + '@uniswap/v3-sdk': 3.25.2(hardhat@2.25.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.25.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 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -10503,12 +10712,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.25.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))': 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.25.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-periphery': 1.4.4 '@uniswap/v3-staker': 1.0.0 tiny-invariant: 1.3.3 @@ -10522,73 +10731,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.25.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))': 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.25.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)) 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 +10806,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): optionalDependencies: typescript: 5.8.3 zod: 3.25.76 - abitype@1.0.9(typescript@5.8.3)(zod@3.24.4): + abitype@1.1.0(typescript@5.8.3)(zod@3.25.76): optionalDependencies: typescript: 5.8.3 - zod: 3.24.4 + zod: 3.25.76 abort-controller@3.0.0: dependencies: @@ -10633,15 +10837,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: {} @@ -10711,7 +10915,7 @@ snapshots: dependencies: type-fest: 0.21.3 - ansi-escapes@7.0.0: + ansi-escapes@7.1.0: dependencies: environment: 1.1.0 @@ -10744,16 +10948,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.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.1)(encoding@0.1.13)(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)) + '@solana/wallet-adapter-base': 0.9.27(@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) 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.10.0(debug@4.4.1) base64url: 3.0.1 bs58: 4.0.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -10796,14 +11000,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 +11020,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 +11029,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 +11044,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 @@ -10862,6 +11068,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 +11115,37 @@ snapshots: await-timeout@1.1.1: {} - axios@1.9.0: + axios@1.10.0: dependencies: - follow-redirects: 1.15.9(debug@4.4.0) - form-data: 4.0.2 + follow-redirects: 1.15.9(debug@4.3.4) + form-data: 4.0.3 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.9.0(debug@4.3.4): + axios@1.10.0(debug@4.3.4): dependencies: follow-redirects: 1.15.9(debug@4.3.4) - form-data: 4.0.2 + form-data: 4.0.3 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.9.0(debug@4.4.0): + axios@1.10.0(debug@4.4.1): dependencies: - follow-redirects: 1.15.9(debug@4.4.0) - form-data: 4.0.2 + follow-redirects: 1.15.9(debug@4.4.1) + form-data: 4.0.3 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.0): dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -10953,34 +11165,34 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.1 + '@babel/types': 7.28.0 '@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 + babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) + + babel-preset-jest@29.6.3(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 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.1.0(@babel/core@7.28.0) balanced-match@1.0.2: {} @@ -11008,6 +11220,8 @@ snapshots: bech32@1.1.4: {} + bech32@2.0.0: {} + big.js@5.2.2: {} big.js@6.2.2: {} @@ -11044,6 +11258,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,6 +11302,8 @@ snapshots: bs58: 4.0.1 text-encoding-utf-8: 1.0.2 + bottleneck@2.19.5: {} + bowser@2.11.0: {} boxen@5.1.2: @@ -11092,12 +11317,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 +11369,12 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - browserslist@4.24.5: + browserslist@4.25.1: dependencies: - caniuse-lite: 1.0.30001717 - electron-to-chromium: 1.5.151 + caniuse-lite: 1.0.30001727 + electron-to-chromium: 1.5.182 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.5) + update-browserslist-db: 1.1.3(browserslist@4.25.1) bs-logger@0.2.6: dependencies: @@ -11202,7 +11427,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 +11455,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 +11490,16 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001717: {} + caniuse-lite@1.0.30001727: {} 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,7 +11521,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.6.0: {} + chalk@5.4.1: {} char-regex@1.0.2: {} @@ -11350,10 +11591,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 +11610,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: {} @@ -11419,10 +11664,10 @@ snapshots: commander@12.1.0: {} - commander@13.1.0: {} - commander@14.0.0: {} + commander@14.0.1: {} + commander@2.20.3: {} commander@8.3.0: {} @@ -11469,8 +11714,8 @@ snapshots: 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 +11723,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,7 +11732,7 @@ 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)): dependencies: @@ -11526,18 +11771,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.0.0: {} - csv-stringify@6.5.2: {} + csv-stringify@6.6.0: {} - csv@6.3.11: + csv@6.4.0: 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.0.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: @@ -11573,10 +11820,6 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.4.0: - dependencies: - ms: 2.1.3 - debug@4.4.1(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -11587,7 +11830,7 @@ snapshots: decimal.js-light@2.5.1: {} - decimal.js@10.5.0: {} + decimal.js@10.6.0: {} decode-uri-component@0.2.2: {} @@ -11611,6 +11854,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 +11891,7 @@ snapshots: destroy@1.2.0: {} - detect-libc@2.0.4: {} + detect-libc@2.1.0: {} detect-newline@3.1.0: {} @@ -11677,11 +11922,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: @@ -11704,7 +11949,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.151: {} + electron-to-chromium@1.5.182: {} elliptic@6.6.1: dependencies: @@ -11718,7 +11963,7 @@ snapshots: emittery@0.13.1: {} - emoji-regex@10.4.0: {} + emoji-regex@10.5.0: {} emoji-regex@8.0.0: {} @@ -11735,7 +11980,7 @@ snapshots: iconv-lite: 0.6.3 optional: true - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -11758,7 +12003,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 +12032,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 +12049,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 +12091,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 +12135,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): 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.8.3))(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 +12153,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,29 +12168,29 @@ 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) 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 + 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.8.3))(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.8.3))(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) 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 @@ -11952,10 +12201,10 @@ snapshots: 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.8.3))(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 +12212,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.8.3))(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 @@ -11987,21 +12236,21 @@ snapshots: 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.1(eslint-config-prettier@9.1.0(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.8 optionalDependencies: eslint-config-prettier: 9.1.0(eslint@8.57.1) @@ -12033,7 +12282,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -12065,8 +12314,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: {} @@ -12356,9 +12605,9 @@ snapshots: fast-uri@3.0.6: {} - 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 +12615,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 +12632,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.7.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 +12648,17 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.4.4(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 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 @@ -12478,10 +12732,6 @@ snapshots: 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): optionalDependencies: debug: 4.4.1(supports-color@8.1.1) @@ -12504,13 +12754,18 @@ snapshots: es-set-tostringtag: 2.1.0 mime-types: 2.1.35 - form-data@4.0.2: + form-data@4.0.3: 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: {} @@ -12563,7 +12818,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 +12842,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 +12854,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 +12879,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 +12914,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,6 +12934,20 @@ 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: {} @@ -12699,16 +12975,16 @@ 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)): + hardhat-watcher@2.5.0(hardhat@2.25.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)): 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.25.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.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.25.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): 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 @@ -12827,6 +13103,8 @@ snapshots: html-escaper@2.0.2: {} + http-cache-semantics@4.2.0: {} + http-errors@1.8.1: dependencies: depd: 1.1.2 @@ -12843,6 +13121,11 @@ 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 @@ -12976,7 +13259,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 is-callable@1.2.7: {} @@ -13023,11 +13306,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 +13334,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 +13432,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.27.1 - '@babel/parser': 7.27.2 + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -13159,11 +13442,11 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.27.1 - '@babel/parser': 7.27.2 + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -13175,7 +13458,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -13192,6 +13475,10 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + jake@10.9.2: dependencies: async: 3.2.6 @@ -13272,10 +13559,10 @@ snapshots: jest-config@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3)): dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -13504,15 +13791,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.0 + '@babel/generator': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.0 '@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.1.0(@babel/core@7.28.0) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -13523,7 +13810,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 @@ -13620,7 +13907,7 @@ snapshots: json-schema-resolver@2.0.0: dependencies: - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) rfdc: 1.4.1 uri-js: 4.4.1 transitivePeerDependencies: @@ -13704,33 +13991,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 +14037,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 + slice-ansi: 7.1.2 strip-ansi: 7.1.0 - wrap-ansi: 9.0.0 + wrap-ansi: 9.0.2 logform@2.7.0: dependencies: @@ -13784,8 +14064,12 @@ snapshots: dependencies: tslib: 2.8.1 + lowercase-keys@2.0.0: {} + lru-cache@10.4.3: {} + lru-cache@11.1.0: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -13794,7 +14078,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 make-error@1.3.6: {} @@ -13814,9 +14098,9 @@ snapshots: mathjs@10.6.4: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 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 @@ -13858,7 +14142,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 +14181,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: {} @@ -13983,10 +14273,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,7 +14300,7 @@ snapshots: napi-macros@2.2.2: {} - napi-postinstall@0.2.5: {} + napi-postinstall@0.3.3: {} natural-compare@1.4.0: {} @@ -14053,9 +14345,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,6 +14361,8 @@ 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): @@ -14077,6 +14371,12 @@ snapshots: 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: {} node-hid@2.1.2: @@ -14089,6 +14389,8 @@ snapshots: node-releases@2.0.19: {} + nofilter@3.1.0: {} + noms@0.0.0: dependencies: inherits: 2.0.4 @@ -14096,6 +14398,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 +14447,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,24 +14522,9 @@ 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): 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 @@ -14248,21 +14537,23 @@ snapshots: transitivePeerDependencies: - zod - ox@0.9.3(typescript@5.8.3)(zod@3.24.4): + ox@0.9.6(typescript@5.8.3)(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.8.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - zod + p-cancelable@2.1.1: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -14317,6 +14608,11 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.0: + dependencies: + lru-cache: 11.1.0 + minipass: 7.1.2 + path-to-regexp@0.1.12: {} path-type@4.0.0: {} @@ -14333,7 +14629,7 @@ 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: {} @@ -14359,7 +14655,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 +14663,14 @@ snapshots: pino-std-serializers@7.0.0: {} - pino@9.6.0: + pino@9.7.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 +14687,7 @@ snapshots: dependencies: queue-lit: 1.5.2 - pnpm@10.10.0: {} + pnpm@10.13.1: {} posix-character-classes@0.1.1: {} @@ -14399,17 +14695,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 +14714,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.5.3: {} + prettier@3.6.2: {} pretty-format@22.4.3: dependencies: @@ -14442,7 +14738,7 @@ snapshots: process-warning@3.0.0: {} - process-warning@4.0.1: {} + process-warning@5.0.0: {} process@0.11.10: {} @@ -14462,15 +14758,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 +14783,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 +14862,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 +14893,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 +14919,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 +14952,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 @@ -14745,7 +15060,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.1: {} + semver@7.7.2: {} send@0.19.0: dependencies: @@ -14813,10 +15128,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: @@ -14880,15 +15200,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 + is-fullwidth-code-point: 5.1.0 snake-case@3.0.4: dependencies: @@ -15018,6 +15333,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 +15350,7 @@ snapshots: dependencies: stream-chain: 2.2.5 - stream-transform@3.3.3: {} + stream-transform@3.4.0: {} string-argv@0.3.2: {} @@ -15053,8 +15373,13 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.4.0 - get-east-asian-width: 1.3.0 + emoji-regex: 10.5.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.0 + + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.4.0 strip-ansi: 7.1.0 string.prototype.trim@1.2.10: @@ -15063,7 +15388,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 @@ -15112,7 +15437,7 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@1.1.2: {} + strnum@2.1.1: {} superstruct@0.15.5: {} @@ -15132,10 +15457,9 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.11.4: + synckit@0.11.8: dependencies: - '@pkgr/core': 0.2.4 - tslib: 2.8.1 + '@pkgr/core': 0.2.7 table@6.9.0: dependencies: @@ -15145,17 +15469,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 @@ -15191,7 +15515,7 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.4(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 tmp-promise@3.0.3: @@ -15250,25 +15574,25 @@ snapshots: dependencies: typescript: 5.8.3 - 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.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(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.8.3)))(typescript@5.8.3): 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 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 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.0 '@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.0) + jest-util: 29.7.0 ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3): dependencies: @@ -15278,7 +15602,7 @@ 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 @@ -15317,10 +15641,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 @@ -15414,29 +15738,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 +15769,9 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.1.3(browserslist@4.24.5): + update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: - browserslist: 4.24.5 + browserslist: 4.25.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -15459,7 +15783,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,29 +15818,12 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 '@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): dependencies: '@noble/curves': 1.9.2 @@ -15534,15 +15841,15 @@ snapshots: - 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.8.3)(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.8.3)(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.8.3)(zod@3.25.76) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 @@ -15555,7 +15862,7 @@ snapshots: wait-on@7.0.1(debug@4.3.4): dependencies: - axios: 1.9.0(debug@4.3.4) + axios: 1.10.0(debug@4.3.4) joi: 17.13.3 lodash: 4.17.21 minimist: 0.2.4 @@ -15571,6 +15878,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 +15890,14 @@ snapshots: randombytes: 2.1.0 utf8: 3.0.0 + webcrypto-core@1.8.1: + dependencies: + '@peculiar/asn1-schema': 2.3.15 + '@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: @@ -15687,7 +16004,7 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - wrap-ansi@9.0.0: + wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.1 string-width: 7.2.0 @@ -15731,10 +16048,10 @@ snapshots: yallist@3.1.1: {} - yaml@2.7.1: {} - yaml@2.8.0: {} + yaml@2.8.1: {} + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} @@ -15770,10 +16087,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..952c043280 100644 --- a/src/app.ts +++ b/src/app.ts @@ -15,6 +15,7 @@ import Fastify, { FastifyInstance } from 'fastify'; // Routes import { ethereumRoutes } from './chains/ethereum/ethereum.routes'; import { solanaRoutes } from './chains/solana/solana.routes'; +import { cardanoRoutes } from './chains/cardano/cardano.routes'; import { configRoutes } from './config/config.routes'; import { register0xRoutes } from './connectors/0x/0x.routes'; import { jupiterRoutes } from './connectors/jupiter/jupiter.routes'; @@ -63,6 +64,12 @@ const swaggerOptions = { { name: '/pools', description: 'Pool management endpoints' }, // Chains + { name: 'solana', description: 'Solana chain endpoints' }, + { name: 'ethereum', description: 'Ethereum chain endpoints' }, + { name: 'cardano', description: 'Cardano chain endpoints' }, + + // Connectors + { name: 'jupiter', description: 'Jupiter DEX aggregator (Solana)' }, { name: '/chain/solana', description: 'Solana and SVM-based chain endpoints', @@ -247,6 +254,7 @@ const configureGatewayServer = () => { }); app.register(pancakeswapRoutes.amm, { prefix: '/connectors/pancakeswap/amm' }); app.register(pancakeswapRoutes.clmm, { prefix: '/connectors/pancakeswap/clmm' }); + app.register(cardanoRoutes, { prefix: '/chains/cardano' }); }; // Register routes on main server diff --git a/src/chains/cardano/cardano.config.ts b/src/chains/cardano/cardano.config.ts new file mode 100644 index 0000000000..c67d17aa2b --- /dev/null +++ b/src/chains/cardano/cardano.config.ts @@ -0,0 +1,67 @@ +import { ConfigManagerV2 } from '../../services/config-manager-v2'; +export interface NetworkConfig { + name: string; + apiurl: string; +} + +export interface Config { + network: NetworkConfig; + allowedSlippage: string; + blockfrostProjectId: string; + preprodBlockfrostProjectId: string; + previewBlockfrostProjectId: string; + ttl: string; + minswapPoolId: string; + sundaeswapPoolId: string; + defaultAddress: string; + nativeCurrencySymbol: string; + tokenListType: string; // default: FILE + tokenListSource: string; // default: src/chains/cardano/cardano_tokens.json +} + +export function getCardanoConfig( + chainName: string, + networkName: string, +): Config { + const network = networkName; + return { + network: { + name: network, + apiurl: ConfigManagerV2.getInstance().get( + chainName + '.blockfrostApiUrls.' + networkName + '.apiurl', + ), + }, + + allowedSlippage: ConfigManagerV2.getInstance().get( + chainName + '.allowedSlippage', + ), + blockfrostProjectId: ConfigManagerV2.getInstance().get( + chainName + '.blockfrostProjectId', + ), + preprodBlockfrostProjectId: ConfigManagerV2.getInstance().get( + chainName + '.preprodBlockfrostProjectId', + ), + previewBlockfrostProjectId: ConfigManagerV2.getInstance().get( + chainName + '.previewBlockfrostProjectId', + ), + minswapPoolId: ConfigManagerV2.getInstance().get( + chainName + '.minswapPoolId.' + networkName + '.poolId', + ), + sundaeswapPoolId: ConfigManagerV2.getInstance().get( + chainName + '.sundaeswapPoolId.' + networkName + '.poolId', + ), + defaultAddress: ConfigManagerV2.getInstance().get( + chainName + '.defaultAddress', + ), + ttl: ConfigManagerV2.getInstance().get(chainName + '.ttl'), + nativeCurrencySymbol: ConfigManagerV2.getInstance().get( + chainName + '.networks.' + networkName + '.nativeCurrencySymbol', + ), + tokenListType: ConfigManagerV2.getInstance().get( + chainName + '.networks.' + networkName + '.tokenListType', + ), + tokenListSource: ConfigManagerV2.getInstance().get( + chainName + '.networks.' + networkName + '.tokenListSource', + ), + }; +} diff --git a/src/chains/cardano/cardano.routes.ts b/src/chains/cardano/cardano.routes.ts new file mode 100644 index 0000000000..4e683d6d2a --- /dev/null +++ b/src/chains/cardano/cardano.routes.ts @@ -0,0 +1,24 @@ +import { FastifyPluginAsync } from 'fastify'; + +import { statusRoute } from './routes/status'; +import { tokensRoute } from './routes/tokens'; +import { balancesRoute } from './routes/balances'; +import { pollRoute } from './routes/poll'; + +// Register the type declaration needed for Fastify schema tags +declare module 'fastify' { + interface FastifySchema { + tags?: readonly string[]; + description?: string; + } +} + +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..05be2098a7 --- /dev/null +++ b/src/chains/cardano/cardano.ts @@ -0,0 +1,488 @@ +import { Config, getCardanoConfig } from './cardano.config'; +import { Lucid, Blockfrost, C } from '@vespr-wallet/lucid-cardano'; +import { TokenListType, TokenValue } from '../../services/base'; +import { ConfigManagerCertPassphrase } from '../../services/config-manager-cert-passphrase'; +import { walletPath } from '../../wallet/utils'; +import { promises as fs } from 'fs'; +import fse from 'fs-extra'; +import crypto from 'crypto'; +import { + NETWORK_ERROR_CODE, + NETWORK_ERROR_MESSAGE, + HttpException, + TOKEN_NOT_SUPPORTED_ERROR_CODE, + TOKEN_NOT_SUPPORTED_ERROR_MESSAGE, + TransactionStatus, +} from './cardano.utils'; +import { logger } from '../../services/logger'; +import { TokenListResolutionStrategy } from '../../services/token-list-resolution'; + +//import { Cardanoish } from "../../services/common-interfaces"; +export type CardanoTokenInfo = { + policyId: string; + assetName: string; + decimals: number; + name: string; + symbol: string; + logoURI: string; +}; + +export class Cardano { + private static _instances: { [name: string]: Cardano }; + // protected tokenList: CardanoTokenInfo[] = []; + // private _tokenMap: Record = {}; + public tokenList: CardanoTokenInfo[] = []; + public config: Config; + public tokenMap: Record = {}; + private _tokenListSource: string; + private _tokenListType: TokenListType; + public lucidInstance: Lucid | null = null; + private network: string; + public allowedSlippage?: string; + public blockfrostProjectId: string; + //public gasLimitEstimate: number; + public ttl?: string; + private _chain: string; + private _ready: boolean = false; + public apiURL: any; + public minswapPoolId: string; + public sundaeswapPoolId: string; + public nativeTokenSymbol: string; + + private constructor(network: string) { + // Throw error if network is not 'mainnet' or 'preprod' + if ( + network !== 'mainnet' && + network !== 'preprod' && + network !== 'preview' + ) { + throw new HttpException(503, NETWORK_ERROR_MESSAGE, NETWORK_ERROR_CODE); + } + this.config = getCardanoConfig('cardano', network); + this._chain = 'cardano'; + this.ttl = this.config.ttl; + // Determine the appropriate Blockfrost Project ID and API URL + const networkConfig = { + preprod: this.config.preprodBlockfrostProjectId, + preview: this.config.previewBlockfrostProjectId, + mainnet: this.config.blockfrostProjectId, // Assuming mainnet as default + }; + this.blockfrostProjectId = + networkConfig[network] || this.config.blockfrostProjectId; + + this.allowedSlippage = this.config.allowedSlippage; + this.apiURL = this.config.network.apiurl; + this.minswapPoolId = this.config.minswapPoolId; + this.sundaeswapPoolId = this.config.sundaeswapPoolId; + this.network = this.config.network.name; + this.nativeTokenSymbol = this.config.nativeCurrencySymbol; + this._tokenListSource = this.config.tokenListSource; + this._tokenListType = this.config.tokenListType; + } + public static async getInstance(network: string): Promise { + if (Cardano._instances === undefined) { + Cardano._instances = {}; + } + + if (!Cardano._instances[network]) { + const instance = new Cardano(network); + await instance.init(); + Cardano._instances[network] = instance; + } + + return Cardano._instances[network]; + } + + public static getConnectedInstances(): { [name: string]: Cardano } { + return Cardano._instances; + } + + public get chain(): string { + return this._chain; + } + + public ready(): boolean { + return this._ready; + } + + public async init(): Promise { + if (!this.lucidInstance) { + this.lucidInstance = await Lucid.new( + new Blockfrost(this.apiURL, this.blockfrostProjectId), + this.network === 'preprod' + ? 'Preprod' + : this.network === 'preview' + ? 'Preview' + : 'Mainnet', + ); + } + + if (!this._ready) { + // Ensure we only set ready once + this._ready = true; + await this.loadTokens(this._tokenListSource, this._tokenListType); + } + } + + 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<{ + privateKey: string; + }> { + 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: CardanoTokenInfo, + ): Promise { + let tokenAdress: string; + + // If token information is not found, throw an error + if (!token || Object.keys(token).length === 0) { + throw new Error(`Token ${token} is not supported.`); + } + + tokenAdress = token.policyId + token.assetName; + // console.log('tokenAdress', tokenAdress); + + 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[tokenAdress]) { + return acc + Number(utxo.assets[tokenAdress]); + } + 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.blockfrostProjectId, + }, + }); + + 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.blockfrostProjectId, // 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: Number(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( + tokenListSource: string, + tokenListType: TokenListType, + ): Promise { + logger.info( + `Loading tokens for cardano from ${tokenListType} source: ${tokenListSource}`, + ); + try { + this.tokenList = await this.getTokenList(tokenListSource, tokenListType); + + if (this.tokenList) { + logger.info(`Loaded ${this.tokenList.length} tokens for cardano`); + // Build token map for faster lookups + this.tokenList.forEach( + (token: CardanoTokenInfo) => (this.tokenMap[token.symbol] = token), + ); + } + } catch (error) { + logger.error(`Failed to load token list: ${error.message}`); + throw error; + } + } + + /** + * Get token list from source + */ + private async getTokenList( + tokenListSource: string, + tokenListType: TokenListType, + ): Promise { + const tokensList = await new TokenListResolutionStrategy( + tokenListSource, + tokenListType, + ).resolve(); + + // Normalize addresses + return tokensList.tokens; + } + + public get storedTokenList(): CardanoTokenInfo[] { + return this.tokenList; + } + + /** + * Get token info by symbol or address + */ + public getTokenBySymbol(tokenSymbol: string): CardanoTokenInfo | undefined { + // First try to find token by symbol + const tokenBySymbol = this.tokenList.find( + (token: CardanoTokenInfo) => + token.symbol.toUpperCase() === tokenSymbol.toUpperCase(), + ); + + if (tokenBySymbol) { + return tokenBySymbol; + } + } + + public getTokenAddress(symbol: string): string { + let tokenAddress: string = ''; + let 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, + ); + } + // console.log("tokenInfo", tokenInfo); + + tokenAddress = tokenInfo[0]?.policyId + tokenInfo[0]?.assetName; + // console.log("tokenAdress", tokenAddress); + + 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; + } + } + + /** + * 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}`); + } + } + + 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..125f3f640b --- /dev/null +++ b/src/chains/cardano/cardano.utils.ts @@ -0,0 +1,66 @@ +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 +} diff --git a/src/chains/cardano/routes/balances.ts b/src/chains/cardano/routes/balances.ts new file mode 100644 index 0000000000..ae1b49d084 --- /dev/null +++ b/src/chains/cardano/routes/balances.ts @@ -0,0 +1,222 @@ +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: { + privateKey: 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.privateKey); + // 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.privateKey, + 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.privateKey, + 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) => { + // Get first wallet address for example + const cardano = await Cardano.getInstance('preprod'); + + // Default Ethereum address for examples if no wallet is available + let firstWalletAddress = ''; + + try { + // Try to get user's first Ethereum wallet if available + // getFirstWalletAddress specifically looks in the /ethereum directory + const userWallet = await cardano.getFirstWalletAddress(); + if (userWallet) { + // Make sure it's a valid Cardano address + const isValidCardanoAddress = /^(addr|addr_test)[0-9a-zA-Z]{1,}$/i.test( + userWallet, + ); + if (isValidCardanoAddress) { + firstWalletAddress = userWallet; + logger.info( + `Using user's Cardano wallet for examples: ${firstWalletAddress}`, + ); + } + } + } catch (error) { + logger.warn('No Ethereum wallets found for examples in schema'); + } + + BalanceRequestSchema.properties.address.examples = [firstWalletAddress]; + + 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: ['cardano'], + body: { + ...BalanceRequestSchema, + properties: { + ...BalanceRequestSchema.properties, + network: { + type: 'string', + examples: ['mainnet', 'preprod', 'preview'], + }, + address: { type: 'string', examples: [firstWalletAddress] }, + 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..7fd880c14a --- /dev/null +++ b/src/chains/cardano/routes/poll.ts @@ -0,0 +1,108 @@ +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, + txHash: string, +): Promise { + const cardano = await Cardano.getInstance(network); + + try { + const currentBlock = await cardano.getCurrentBlockNumber(); + + // Validate transaction signature format + if (!txHash || typeof txHash !== 'string') { + return { + currentBlock, + signature: txHash, + txBlock: null, + txStatus: 0, + txData: null, + fee: null, + error: 'Invalid transaction signature format', + }; + } + + const txData = await cardano.getTransaction(txHash); + + if (!txData) { + return { + currentBlock, + signature: txHash, + txBlock: null, + txStatus: 0, + txData: null, + fee: null, + }; + } + + return { + currentBlock, + signature: txHash, + txBlock: txData.block, + txStatus: txData.status, + fee: txData.fees, + txData, + }; + } catch (error) { + logger.error(`Error polling transaction ${txHash}: ${error.message}`); + return { + currentBlock: await cardano.getCurrentBlockNumber(), + signature: txHash, + 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: ['cardano'], + body: { + ...PollRequestSchema, + properties: { + ...PollRequestSchema.properties, + network: { + type: 'string', + examples: ['mainnet', 'preprod', 'preview'], + }, + signature: { + type: 'string', + examples: [ + 'a03a01fb56ba60fab341bcb95340302853aea4c3d8faace9ba930a5b3e93f307', + ], + }, + }, + }, + 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..d31f8a39d1 --- /dev/null +++ b/src/chains/cardano/routes/status.ts @@ -0,0 +1,97 @@ +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; + + // 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, + 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: ['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', + 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..30972da5b6 --- /dev/null +++ b/src/chains/cardano/routes/tokens.ts @@ -0,0 +1,81 @@ +import { FastifyPluginAsync } from 'fastify'; + +import { + TokensRequestType, + TokensResponseType, + TokensRequestSchema, + TokensResponseSchema, +} from '../../../schemas/chain-schema'; +import { logger } from '../../../services/logger'; +import { Cardano } from '../cardano'; + +export async function getCardanoTokens( + network: string, + tokenSymbols?: string[] | string, +): Promise { + try { + const cardano = await Cardano.getInstance(network); + await cardano.init(); + + let tokens = []; + if (!tokenSymbols) { + tokens = cardano.storedTokenList; + } else { + const symbolsArray = Array.isArray(tokenSymbols) + ? tokenSymbols + : typeof tokenSymbols === 'string' + ? (tokenSymbols as string).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 Cardano tokens: ${error.message}`); + throw new Error(`Failed to get tokens: ${error.message}`); + } +} + +export const tokensRoute: FastifyPluginAsync = async (fastify) => { + fastify.get<{ + Querystring: TokensRequestType; + Reply: TokensResponseType; + }>( + '/tokens', + { + schema: { + description: 'Get Cardano tokens', + tags: ['cardano'], + querystring: { + ...TokensRequestSchema, + properties: { + ...TokensRequestSchema.properties, + network: { + type: 'string', + examples: ['mainnet', 'preprod', 'preview'], + }, + }, + }, + response: { + 200: TokensResponseSchema, + }, + }, + }, + async (request, reply) => { + const { network, tokenSymbols } = request.query; + try { + return await getCardanoTokens(network, tokenSymbols); + } catch (error) { + logger.error(`Error handling Cardano tokens request: ${error.message}`); + reply.status(500); + return { tokens: [] }; + } + }, + ); +}; + +export default tokensRoute; diff --git a/src/services/connection-manager.ts b/src/services/connection-manager.ts index 400fe795c7..3a4f714862 100644 --- a/src/services/connection-manager.ts +++ b/src/services/connection-manager.ts @@ -1,11 +1,12 @@ import { Ethereum } from '../chains/ethereum/ethereum'; import { Solana } from '../chains/solana/solana'; +import { Cardano } from '../chains/cardano/cardano'; 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,8 @@ 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') { + connection = await Cardano.getInstance(network); } else { connection = undefined; } diff --git a/src/templates/connectors/cardano.yml b/src/templates/connectors/cardano.yml new file mode 100644 index 0000000000..d5dc07e1ff --- /dev/null +++ b/src/templates/connectors/cardano.yml @@ -0,0 +1,55 @@ +# how much the execution price is allowed to move unfavorably from the trade execution price. It uses a rational number for precision. +allowedSlippage: '1/100' + +# For Cardano this will be used to connect to the network via blockfrost API +blockfrostProjectId: 'mainnetkCD2MvERTpHuh2oojUli0QtGp6zuJyrR' + +preprodBlockfrostProjectId: 'preprodN1EZYj11zL89jJeaAjeRybxYMLp7grmn' + +previewBlockfrostProjectId: 'previewjsuJtAX0Fki1dAewDoWQ1xoHXXgVzg1w' + +# how long a trade is valid in seconds. +ttl: 300 + +minswapPoolId: + mainnet: + poolId : 6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2 + preprod: + poolId : 3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d + +sundaeswapPoolId: + preview: + poolId : '2baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3' + mainnet: + poolId : '2f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773' + +defaultAddress: testaddresstouse + + +# this is the blockfrost project id we need to connect to the Minswap DEX +#blockfrost-projectid: + +blockfrostApiUrls: + # Blockfrost API URLs for different Cardano networks + mainnet: + apiurl: 'https://cardano-mainnet.blockfrost.io/api/v0' + preprod: + apiurl: 'https://cardano-preprod.blockfrost.io/api/v0' + preview: + apiurl: 'https://cardano-preview.blockfrost.io/api/v0' + + +networks: + mainnet: + tokenListType: "FILE" + tokenListSource: "/home/gateway/conf/lists/cardano_mainnet_tokens.json" + nativeCurrencySymbol: 'ADA' + preprod: + tokenListType: "FILE" + tokenListSource: "/home/gateway/conf/lists/cardano_preprod_tokens.json" + nativeCurrencySymbol: 'ADA' + preview: + tokenListType: "FILE" + tokenListSource: "/home/gateway/conf/lists/cardano_preview_tokens.json" + nativeCurrencySymbol: 'ADA' + diff --git a/src/templates/namespace/cardano_mainnet_tokens.json b/src/templates/namespace/cardano_mainnet_tokens.json new file mode 100644 index 0000000000..dbb9621121 --- /dev/null +++ b/src/templates/namespace/cardano_mainnet_tokens.json @@ -0,0 +1,40 @@ +{ + "name": "Cardano Tokenlist", + "logoURI": "https://ibb.co/N1Jmswk", + "keywords": ["cardano", "tokens", "MIN"], + "timestamp": "2024-12-12T12:00:00+00:00", + "tokens": [ + { + "policyId": "29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6", + "assetName": "4d494e", + "decimals": 0, + "name": "Minswap Token", + "symbol": "MIN", + "logoURI": "https://ibb.co/L1Tp0rQ" + }, + { + "policyId": "9a9693a9a37912a5097918f97918d15240c92ab729a0b7c4aa144d77", + "assetName": "53554e444145", + "decimals": 6, + "name": "SUNDAE Token", + "symbol": "SUNDAE", + "logoURI": "https://ibb.co/Q31Nv1TK" + }, + { + "policyId": "ada", + "assetName": "lovelace", + "decimals": 6, + "name": "Cardano Native Token", + "symbol": "ADA", + "logoURI": "https://ibb.co/N1Jmswk" + }, + { + "policyId": "e0302560ced2fdcbfcb2602697df970cd0d6a38f94b32703f51c312b", + "assetName": "0014df102f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773", + "decimals": 0, + "name": "SundaeSwap LP Token", + "symbol": "LP-SUNDAE", + "logoURI": "" + } + ] +} diff --git a/src/templates/namespace/cardano_preprod_tokens.json b/src/templates/namespace/cardano_preprod_tokens.json new file mode 100644 index 0000000000..0db7396bdb --- /dev/null +++ b/src/templates/namespace/cardano_preprod_tokens.json @@ -0,0 +1,32 @@ +{ + "name": "Cardano Tokenlist", + "logoURI": "https://ibb.co/N1Jmswk", + "keywords": ["cardano", "tokens", "MIN"], + "timestamp": "2024-12-12T12:00:00+00:00", + "tokens": [ + { + "policyId": "e16c2dc8ae937e8d3790c7fd7168d7b994621ba14ca11415f39fed72", + "assetName": "4d494e", + "decimals": 0, + "name": "Minswap Token", + "symbol": "MIN", + "logoURI": "https://ibb.co/L1Tp0rQ" + }, + { + "policyId": "ada", + "assetName": "lovelace", + "decimals": 6, + "name": "Cardano Native Token", + "symbol": "ADA", + "logoURI": "https://ibb.co/N1Jmswk" + }, + { + "policyId": "e4214b7cce62ac6fbba385d164df48e157eae5863521b4b67ca71d86", + "assetName": "3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d", + "decimals": 0, + "name": "Minswap Liquidity pool token", + "symbol": "LP", + "logoURI": "https://ibb.co/L1Tp0rQ" + } + ] +} diff --git a/src/templates/namespace/cardano_preview_tokens.json b/src/templates/namespace/cardano_preview_tokens.json new file mode 100644 index 0000000000..e1ed975e08 --- /dev/null +++ b/src/templates/namespace/cardano_preview_tokens.json @@ -0,0 +1,32 @@ +{ + "name": "Cardano Tokenlist", + "logoURI": "https://ibb.co/N1Jmswk", + "keywords": ["cardano", "tokens", "SUNDAE"], + "timestamp": "2024-12-12T12:00:00+00:00", + "tokens": [ + { + "policyId": "99b071ce8580d6a3a11b4902145adb8bfd0d2a03935af8cf66403e15", + "assetName": "534245525259", + "decimals": 0, + "name": "SBERRY Token", + "symbol": "SBERRY", + "logoURI": "https://ibb.co/hJbVKRJW" + }, + { + "policyId": "ada", + "assetName": "lovelace", + "decimals": 6, + "name": "Cardano Native Token", + "symbol": "ADA", + "logoURI": "https://ibb.co/N1Jmswk" + }, + { + "policyId": "44a1eb2d9f58add4eb1932bd0048e6a1947e85e3fe4f32956a110414", + "assetName": "0014df102baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3", + "decimals": 0, + "name": "Sundaeswap Liquidity pool token", + "symbol": "LP", + "logoURI": "hhttps://ibb.co/JWr1GWs3" + } + ] +} diff --git a/src/templates/root.yml b/src/templates/root.yml index 338fa6dafc..4eed87e260 100644 --- a/src/templates/root.yml +++ b/src/templates/root.yml @@ -92,3 +92,7 @@ configurations: $namespace infura: configurationPath: rpc/infura.yml schemaPath: infura-schema.json + + $namespace cardano: + configurationPath: connectors/cardano.yml + schemaPath: cardano-schema.json \ No newline at end of file diff --git a/src/wallet/schemas.ts b/src/wallet/schemas.ts index 944d07270c..50763871a2 100644 --- a/src/wallet/schemas.ts +++ b/src/wallet/schemas.ts @@ -6,21 +6,9 @@ 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()), }); export const AddWalletResponseSchema = Type.Object({ diff --git a/src/wallet/utils.ts b/src/wallet/utils.ts index 63089ded5b..b81063c275 100644 --- a/src/wallet/utils.ts +++ b/src/wallet/utils.ts @@ -4,6 +4,7 @@ import fse from 'fs-extra'; import { Ethereum } from '../chains/ethereum/ethereum'; import { Solana } from '../chains/solana/solana'; import { updateDefaultWallet } from '../config/utils'; +import { Cardano } from '../chains/cardano/cardano'; import { ConfigManagerCertPassphrase } from '../services/config-manager-cert-passphrase'; import { getInitializedChain, @@ -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,15 @@ 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); + } 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 +118,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 +168,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 +261,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 +283,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/services/data/config-manager-v2/test1/namespace/cardano-schema.json b/test/services/data/config-manager-v2/test1/namespace/cardano-schema.json new file mode 100644 index 0000000000..1a9de95b42 --- /dev/null +++ b/test/services/data/config-manager-v2/test1/namespace/cardano-schema.json @@ -0,0 +1,117 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "allowedSlippage": { "type": "string" }, + "blockfrostProjectId": { "type": "string" }, + "nativeCurrencySymbol": { "type": "string" }, + "preprodBlockfrostProjectId": { "type": "string" }, + "previewBlockfrostProjectId": { "type": "string" }, + "minswapPoolId": { + "type": "object", + "patternProperties": { + "^\\w+$": { + "type": "object", + "properties": { + "poolId": { "type": "string" } + }, + "required": ["poolId"], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "sundaeswapPoolId": { + "type": "object", + "patternProperties": { + "^\\w+$": { + "type": "object", + "properties": { + "poolId": { "type": "string" } + }, + "required": ["poolId"], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "defaultAddress": { "type": "string" }, + "ttl": { "type": "integer" }, + "blockfrostApiUrls": { + "type": "object", + "patternProperties": { + "^\\w+$": { + "type": "object", + "properties": { + "apiurl": { "type": "string" } + }, + "required": ["apiurl"], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "networks": { + "type": "object", + "properties": { + "mainnet": { + "type": "object", + "properties": { + "tokenListType": { "type": "string" }, + "tokenListSource": { "type": "string" }, + "nativeCurrencySymbol": { "type": "string" } + }, + "required": [ + "tokenListType", + "tokenListSource", + "nativeCurrencySymbol" + ], + "additionalProperties": false + }, + "preprod": { + "type": "object", + "properties": { + "tokenListType": { "type": "string" }, + "tokenListSource": { "type": "string" }, + "nativeCurrencySymbol": { "type": "string" } + }, + "required": [ + "tokenListType", + "tokenListSource", + "nativeCurrencySymbol" + ], + "additionalProperties": false + }, + "preview": { + "type": "object", + "properties": { + "tokenListType": { "type": "string" }, + "tokenListSource": { "type": "string" }, + "nativeCurrencySymbol": { "type": "string" } + }, + "required": [ + "tokenListType", + "tokenListSource", + "nativeCurrencySymbol" + ], + "additionalProperties": false + } + }, + "required": ["mainnet", "preprod", "preview"], + "additionalProperties": false + } + }, + "additionalProperties": false, + "required": [ + "allowedSlippage", + "blockfrostProjectId", + "preprodBlockfrostProjectId", + "previewBlockfrostProjectId", + "ttl", + "minswapPoolId", + "sundaeswapPoolId", + "defaultAddress", + "blockfrostApiUrls", + "networks" + ] +} From 57207338abbd62b07f718210926ce25a3c218762 Mon Sep 17 00:00:00 2001 From: Aiquant1 Date: Thu, 26 Jun 2025 17:28:23 +0530 Subject: [PATCH 02/12] Added minswap pool-info, quote-swap route --- package.json | 3 + pnpm-lock.yaml | 801 +++++++++++++++++- src/app.ts | 4 + src/chains/cardano/cardano.config.ts | 67 +- src/chains/cardano/cardano.ts | 46 +- src/chains/cardano/cardano.utils.ts | 2 + src/chains/cardano/routes/balances.ts | 16 +- src/chains/cardano/routes/poll.ts | 20 +- src/chains/cardano/routes/tokens.ts | 35 +- src/config/schemas.ts | 14 +- src/connectors/minswap/amm-routes/poolInfo.ts | 82 ++ .../minswap/amm-routes/quoteSwap.ts | 452 ++++++++++ src/connectors/minswap/minswap.config.ts | 62 ++ src/connectors/minswap/minswap.routes.ts | 29 + src/connectors/minswap/minswap.ts | 149 ++++ src/connectors/minswap/minswap.utils.ts | 53 ++ .../sundaeswap/sundaeswap.config.ts | 62 ++ src/templates/chains/cardano.yml | 20 + src/templates/connectors/cardano.yml | 55 -- src/templates/connectors/minswap.yml | 20 + src/templates/connectors/sundaeswap.yml | 19 + .../namespace/cardano_mainnet_tokens.json | 25 +- .../namespace/cardano_preprod_tokens.json | 22 +- .../namespace/cardano_preview_tokens.json | 13 +- src/templates/root.yml | 16 +- .../test1/namespace/cardano-schema.json | 102 +-- .../test1/namespace/minswap-schema.json | 31 + .../test1/namespace/sundaeswap-schema.json | 31 + 28 files changed, 1959 insertions(+), 292 deletions(-) create mode 100644 src/connectors/minswap/amm-routes/poolInfo.ts create mode 100644 src/connectors/minswap/amm-routes/quoteSwap.ts create mode 100644 src/connectors/minswap/minswap.config.ts create mode 100644 src/connectors/minswap/minswap.routes.ts create mode 100644 src/connectors/minswap/minswap.ts create mode 100644 src/connectors/minswap/minswap.utils.ts create mode 100644 src/connectors/sundaeswap/sundaeswap.config.ts create mode 100644 src/templates/chains/cardano.yml delete mode 100644 src/templates/connectors/cardano.yml create mode 100644 src/templates/connectors/minswap.yml create mode 100644 src/templates/connectors/sundaeswap.yml create mode 100644 test/services/data/config-manager-v2/test1/namespace/minswap-schema.json create mode 100644 test/services/data/config-manager-v2/test1/namespace/sundaeswap-schema.json diff --git a/package.json b/package.json index 57e86a136d..b3762629ac 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ }, "dependencies": { "@aiquant/minswap-sdk": "^0.0.0", + "@blockfrost/blockfrost-js": "^5.7.0", "@coral-xyz/anchor": "^0.29.0", "@ethersproject/abstract-provider": "5.7.0", "@ethersproject/address": "5.7.0", @@ -74,6 +75,7 @@ "@solflare-wallet/utl-sdk": "^1.4.0", "@uniswap/permit2-sdk": "^1.3.1", "@uniswap/router-sdk": "^2.0.4", + "@sundaeswap/core": "^1.3.48", "@uniswap/sdk": "3.0.3", "@uniswap/sdk-core": "^5.9.0", "@uniswap/smart-order-router": "^3.59.0", @@ -89,6 +91,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 c89b1c2f70..2c6b3dfb5e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,6 +22,9 @@ importers: '@aiquant/minswap-sdk': specifier: ^0.0.0 version: 0.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@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) @@ -124,6 +127,9 @@ importers: '@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) + '@sundaeswap/core': + specifier: ^1.3.48 + version: 1.3.48(@blaze-cardano/sdk@0.2.43(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(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)(lucid-cardano@0.10.7(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@uniswap/permit2-sdk': specifier: ^1.3.1 version: 1.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -175,6 +181,9 @@ 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 @@ -705,6 +714,40 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@biglup/is-cid@1.0.3': + resolution: {integrity: sha512-R0XPZ/IQhU2TtetSFI9vI+7kJOJYNiCncn5ixEBW+/LNaZCo2HK37Mq3pRNzrM4FryuAkyeqY7Ujmj3I3e3t9g==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + + '@blaze-cardano/core@0.7.0': + resolution: {integrity: sha512-zVwWKnBfR1pMfAD87cXwTolb39T5n+uFafzUi1soBFzXCnFfqvZaDdxIthWA/Xn9ARZlvDNcvKXZewfskBRXgQ==} + + '@blaze-cardano/data@0.6.4': + resolution: {integrity: sha512-PSG3w9WPfmYMrcbBDCp+Bq2scU1igVHSF1MWScMAy0zGQljTaoZsg08bUkP7j6Pxq4qDjw6EyTyN1hPQAWXcmA==} + + '@blaze-cardano/jest-config@0.0.1': + resolution: {integrity: sha512-q/0BzXoN+PP4kcwmqthJEYrQ1ee3pZ1Y2dV7X7levyccX8yVMxgMUvJjXhZKl0Bb9g8JidoxanVaBW0d0Y0mSw==} + + '@blaze-cardano/ogmios@0.0.7': + resolution: {integrity: sha512-6T5Iz9Qpenp8tj3eogfvjGIxScm01oSrXrnT8oUFxOT4xYGz7PmX69Y80e+1AFAGIzZpHvYZdIQpGBr0Qlyswg==} + + '@blaze-cardano/query@0.5.2': + resolution: {integrity: sha512-GXRkr4LTYUd+Gd9d+05DVUSx1xz8wp9lIqC+n9yf//xSP6wjKUNQDrxB0XmLic1d9OEZZIwJl/gO9YJj/gmHXA==} + + '@blaze-cardano/sdk@0.2.43': + resolution: {integrity: sha512-g4IPG7EDAYW0Idm9KiyG7I9nnUzD1WaPwdPUCpQBoRUbGgBGJ1L/DzsyrQH7z5ZDjP1Q6ITWKowhgeqsIinSBQ==} + + '@blaze-cardano/tx@0.13.4': + resolution: {integrity: sha512-Jj1IzRLMquyl167qwWxtn/yuFI9w8l+8UsweTqMuRS8KVhUBkF/OMJ6D0xBFrnV6YxVtR67YeFbIGzmFokqBmw==} + + '@blaze-cardano/uplc@0.4.1': + resolution: {integrity: sha512-agzJaaK9DNGObCT3TsxS/ppioxJ40esF2ziIt9kk2zbM9H6F8JHmrGcW++v1REKSlmfHYhULUcaCrYzDSapjZQ==} + + '@blaze-cardano/vm@0.2.1': + resolution: {integrity: sha512-jCQMeLwDb7VHrKKUIsVfROKZUrVav5XxTmCa8uZpO/qd0DYjB6Qy4h6iFgLrRS9qKO8X2/7rLs1H4BY3VnULDQ==} + + '@blaze-cardano/wallet@0.4.13': + resolution: {integrity: sha512-mCZ09TYE+3M4d+epEo2FZbep6Oy6EOKGTRp8BrF2QwY8XsFVLbwWOVFRE95FIb/8DBWexhuHZIbZsIVEgiQ7bw==} + '@blockfrost/blockfrost-js@5.7.0': resolution: {integrity: sha512-Rzw+Ya+LlKJNv9k5g7xW0uM33Xf6Lt3MXANtuwtm7+R9xuMFc7iKocwHSgrGUTTZ1EKou4n4Znai18MdvqG2bw==} engines: {node: '>=16'} @@ -718,6 +761,74 @@ packages: deprecated: Bundlr is now Irys - please switch to @irys/sdk - this package will remain compatible with Irys for the foreseeable future. hasBin: true + '@cardano-ogmios/client@6.9.0': + resolution: {integrity: sha512-IsoUVsaMXiYyhWrdVKYOA5PDlX0EZ2gaq4lfk4JelRw6mcWVxemUrMaU2ndvugO9LQ3SCM1nESPgMIU0xe5FWw==} + engines: {node: '>=14'} + + '@cardano-ogmios/schema@6.13.0': + resolution: {integrity: sha512-rw8DaDUDqTJa/EEs3JXYzE9OWkAv7TjgUGPC1dWl0pUEQiPSxNLtSkdaX88ULXetJttb9P/1A7dJo0keZBn4fg==} + engines: {node: '>=14'} + + '@cardano-ogmios/schema@6.9.0': + resolution: {integrity: sha512-e7QVLF+dQMIv9p+p5CWQjMfBmkERYRa2wK2AjyehQZCJnecZ0gvTbRqewdX5VW4mVXf6KUfFyphsxWK46Pg6LA==} + engines: {node: '>=14'} + + '@cardano-sdk/core@0.45.0': + resolution: {integrity: sha512-7bRpbbwsZF5XIGy4Tsm4KErMEnEhTsPjgvjgGDUO+oacXZkdxJRckcsiI7DPRmmJBm/7tAyHUirfXiGw3Gg9DQ==} + engines: {node: '>=16.20.2'} + peerDependencies: + rxjs: ^7.4.0 + peerDependenciesMeta: + rxjs: + optional: true + + '@cardano-sdk/crypto@0.1.32': + resolution: {integrity: sha512-RCKFvkzD32QpKQ0jULADVRNmfBNkCwiZl2nlFbkZ3aCrfIex+6/2CizoagJ161fA7lL5/HGuzWfjOg3GX2ax6w==} + engines: {node: '>=16.20.2'} + peerDependencies: + '@dcspark/cardano-multiplatform-lib-asmjs': ^3.1.1 + '@dcspark/cardano-multiplatform-lib-browser': ^3.1.1 + '@dcspark/cardano-multiplatform-lib-nodejs': ^3.1.1 + peerDependenciesMeta: + '@dcspark/cardano-multiplatform-lib-asmjs': + optional: true + '@dcspark/cardano-multiplatform-lib-browser': + optional: true + '@dcspark/cardano-multiplatform-lib-nodejs': + optional: true + + '@cardano-sdk/crypto@0.2.3': + resolution: {integrity: sha512-jTl8rbocV1XO5DBR6+lGY6Owc/bP+wBg5eO3PttTeKhx/J7o99pyuTa5H36a/XTJwqDwKIXV922QxZR+rfjVbA==} + engines: {node: '>=16.20.2'} + peerDependencies: + '@dcspark/cardano-multiplatform-lib-asmjs': ^3.1.1 + '@dcspark/cardano-multiplatform-lib-browser': ^3.1.1 + '@dcspark/cardano-multiplatform-lib-nodejs': ^3.1.1 + peerDependenciesMeta: + '@dcspark/cardano-multiplatform-lib-asmjs': + optional: true + '@dcspark/cardano-multiplatform-lib-browser': + optional: true + '@dcspark/cardano-multiplatform-lib-nodejs': + optional: true + + '@cardano-sdk/util@0.15.7': + resolution: {integrity: sha512-L0f3gXFujRwSSpjzq2W/OwW23fg0gw5S+9R+91He3LgmyfjNygd939eFPCLhwOscsHcJ4AN27UJSYnx3JMKZ0w==} + engines: {node: '>=16.20.2'} + + '@cardano-sdk/util@0.16.0': + resolution: {integrity: sha512-f0tfX8oiauqAFCyyc/o2Ouezyk83QD4zqLl4DUjZNyCtITL8gBHh25Bkw7RUCGEZ+hf6Qms1n0ui0j3wVY7zRg==} + engines: {node: '>=16.20.2'} + + '@cardanosolutions/json-bigint@1.0.2': + resolution: {integrity: sha512-hRgKDFRR5zW6vv6KoymE1PuhKk8hxA/F5YsH37ghIFIYnWAMbVoQ7xRKAT5AEy9HrqWM6HxNQLIZ3r3omg96/w==} + + '@chainsafe/is-ip@2.1.0': + resolution: {integrity: sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w==} + + '@chainsafe/netmask@2.0.0': + resolution: {integrity: sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==} + '@colors/colors@1.6.0': resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} @@ -758,6 +869,12 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emurgo/cardano-message-signing-browser@1.1.0': + resolution: {integrity: sha512-LyeiGIqCyZu9DZnKsi4wlBjZA1MN+uy3Cqpb5J6RZWvFXDJnCoxrYB/EixUiGRD/la4WsldBgtPsrIHyGsVkpg==} + + '@emurgo/cardano-message-signing-nodejs@1.1.0': + resolution: {integrity: sha512-PQRc8K8wZshEdmQenNUzVtiI8oJNF/1uAnBhidee5C4o1l2mDLOW+ur46HWHIFKQ6x8mSJTllcjMscHgzju0gQ==} + '@emurgo/cardano-serialization-lib-nodejs@11.5.0': resolution: {integrity: sha512-IlVABlRgo9XaTR1NunwZpWcxnfEv04ba2l1vkUz4S1W7Jt36F4CtffP+jPeqBZGnAe+fnUwo0XjIJC3ZTNToNQ==} @@ -1121,6 +1238,9 @@ packages: peerDependencies: '@sinclair/typebox': '>=0.26 <=0.33' + '@foxglove/crc@0.0.3': + resolution: {integrity: sha512-DjIZsnL3CyP/yQ/vUYA9cjrD0a/8YXejI5ZmsaOiT16cLfZcTwaCxIN01/ys4jsy+dZCQ/9DnWFn7AEFbiMDaA==} + '@graphql-typed-document-node/core@3.2.0': resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: @@ -1308,6 +1428,9 @@ packages: '@ledgerhq/types-live@6.84.0': resolution: {integrity: sha512-0n8p4xlE/Vb2+hQey0tFtOsLJ+QHLgU3/VzrUNyVv2XTDNsOiJB86hHBocATR+fg4UjyNBRE1ff9/fGhqKyEzg==} + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + '@lukeed/ms@2.0.2': resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} @@ -1360,6 +1483,15 @@ packages: '@minswap/tiny-invariant@1.2.0': resolution: {integrity: sha512-m4CMTsZ4MDB2WLND6rV0eti+f2WcMPhKvXf9ZHXlQMqvNmgoX1z//84FpEX0D1vVTPfJtNS8XIoIQ9pm6X590A==} + '@multiformats/dns@1.0.9': + resolution: {integrity: sha512-Ja4hevWI9p96ICx11K3suFvFirnMmXILzS7FpsR2KG3FoKF/XJijm8ylf3vY6kRFGr98yfZYM+zIn18KaINs3A==} + + '@multiformats/mafmt@12.1.6': + resolution: {integrity: sha512-tlJRfL21X+AKn9b5i5VnaTD6bNttpSpcqwKVmDmSHLwxoz97fAHaepqFOk/l1fIu94nImIXneNbhsJx/RQNIww==} + + '@multiformats/multiaddr@12.5.1': + resolution: {integrity: sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ==} + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -1385,6 +1517,9 @@ packages: '@noble/ed25519@1.7.5': resolution: {integrity: sha512-xuS0nwRMQBvSxDa7UxMb61xTiH3MxTgUfhyPUALVIe0FlOAz4sjELwyDRyUvqeEYfRSG9qNjFIycqLZppg4RSA==} + '@noble/ed25519@2.3.0': + resolution: {integrity: sha512-M7dvXL2B92/M7dw9+gzuydL8qn/jiqNHaoR3Q+cb1q1GHV7uwE17WCyFMG+Y+TZb5izcaXk5TdJRrDUxHXL78A==} + '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -1692,6 +1827,9 @@ packages: '@sinclair/typebox@0.33.22': resolution: {integrity: sha512-auUj4k+f4pyrIVf4GW5UKquSZFHJWri06QgARy9C0t9ZTjJLIuNIrr1yl9bWcJWJ1Gz1vOvYN1D+QPaIlNMVkQ==} + '@sinclair/typebox@0.34.41': + resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -2084,6 +2222,32 @@ packages: 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/core@1.3.48': + resolution: {integrity: sha512-ArZmTuLU9fTFfNqY83WzkJv9z05lLAh1vj5DHR1saLcIQs6oqunjXZnpzNwmeojYbppOF6Ks3SnWnLv8OEw46Q==} + peerDependencies: + '@blaze-cardano/sdk': ^0.2.20 + '@sundaeswap/asset': ^1.0.3 + '@sundaeswap/bigint-math': ^0.6.3 + '@sundaeswap/cpp': ^1.0.7 + '@sundaeswap/fraction': ^1.0.5 + lucid-cardano: 0.10.7 + + '@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'} @@ -2185,6 +2349,9 @@ packages: '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/json-bigint@1.0.4': + resolution: {integrity: sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag==} + '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -2547,6 +2714,9 @@ packages: resolution: {integrity: sha512-hiEivWNztx73s+7iLxsuD1sOJ28xtRix58W7Xnz4XzzA/pF0+aicnWgjOdA10doVDEDZdUuZCIIqG96SFNlDUg==} engines: {node: '>=16'} + '@zxing/text-encoding@0.9.0': + resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} + abitype@1.0.8: resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} peerDependencies: @@ -2573,6 +2743,9 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + abort-error@1.0.1: + resolution: {integrity: sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==} + abstract-level@1.0.4: resolution: {integrity: sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==} engines: {node: '>=12'} @@ -2841,6 +3014,14 @@ packages: axios@1.10.0: resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + b4a@1.7.1: + resolution: {integrity: sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2908,6 +3089,9 @@ packages: 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==} engines: {node: '>=8'} @@ -2930,9 +3114,15 @@ packages: blake2b-wasm@1.1.7: resolution: {integrity: sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA==} + blake2b-wasm@2.4.0: + resolution: {integrity: sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==} + blake2b@2.1.3: resolution: {integrity: sha512-pkDss4xFVbMb4270aCyGD3qLv92314Et+FsKzilCLxDz5DuZ2/1g3w4nmBbu6nKApPspnjG7JcwTjGZnduB1yg==} + blake2b@2.1.4: + resolution: {integrity: sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==} + blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} @@ -3328,6 +3518,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==} @@ -3550,6 +3743,10 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -4151,6 +4348,9 @@ packages: fp-ts@1.19.3: resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + fraction.js@4.0.1: + resolution: {integrity: sha512-NQYzZw8MUsxSZFQo6E8tKOlmSd/BlDTNOR4puXFSHSwFwNaIlmbortQy5PDN/KnVQ4xWG2NtN0J0hjPw7eE06A==} + fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -4391,6 +4591,9 @@ packages: hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hashlru@2.3.0: + resolution: {integrity: sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -4402,6 +4605,9 @@ packages: help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hex-encoding@2.0.3: + resolution: {integrity: sha512-sSmMo4ij2Vejht+5UkzuzNGiYgIWTSUw0GQqxHIQXsuuXB1ozYnjCZJZ/nwWNYRoU8+92Dp736wqxmiAN6/fcw==} + hi-base32@0.5.1: resolution: {integrity: sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==} @@ -4442,6 +4648,10 @@ packages: engines: {node: '>=18'} hasBin: true + i@0.3.7: + resolution: {integrity: sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==} + engines: {node: '>=0.4'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -4498,6 +4708,10 @@ packages: io-ts@1.10.4: resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -4721,6 +4935,10 @@ packages: isnumber@1.0.0: resolution: {integrity: sha512-JLiSz/zsZcGFXPrB4I/AGBvtStkt+8QmksyZBZnVXnnK9XdTEyz0tX8CRYljtwYDuIuZzih6DpHQdi+3Q6zHPw==} + iso-url@1.2.1: + resolution: {integrity: sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==} + engines: {node: '>=12'} + isobject@2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} @@ -4734,6 +4952,11 @@ packages: peerDependencies: ws: '*' + isomorphic-ws@5.0.0: + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + isows@1.0.7: resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} peerDependencies: @@ -4971,6 +5194,9 @@ packages: jsbi@3.2.5: resolution: {integrity: sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==} + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -5073,6 +5299,12 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + libsodium-sumo@0.7.15: + resolution: {integrity: sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==} + + libsodium-wrappers-sumo@0.7.15: + resolution: {integrity: sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==} + light-my-request@5.14.0: resolution: {integrity: sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==} @@ -5150,6 +5382,10 @@ packages: lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + lucid-cardano@0.10.7: + resolution: {integrity: sha512-hxJRMWj8VH+SGFqsVMG6T3LSRuxzwFbWOQ5DTGQQUyR/20FL7bjiVL+2ivMJF52tAbFKcwqpRD4fddR7LbqcAw==} + engines: {node: '>=14'} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -5321,6 +5557,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + multiformats@13.4.1: + resolution: {integrity: sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==} + multistream@4.1.0: resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} @@ -5349,6 +5588,14 @@ packages: nanoassert@1.1.0: resolution: {integrity: sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==} + nanoassert@2.0.0: + resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanomatch@1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -5407,6 +5654,9 @@ packages: node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + node-buffer-encoding@1.0.3: + resolution: {integrity: sha512-9hJZNChhQoCN1rCFScJiEwtzvWEJw2wSnu2nhDLD/YOYl1Ce8GbtnorsnjwwjpSk4sWE7zSp2etX6j7+bO7fVA==} + node-cache@5.1.2: resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} engines: {node: '>= 8.0.0'} @@ -5467,6 +5717,82 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + npm@9.9.4: + resolution: {integrity: sha512-NzcQiLpqDuLhavdyJ2J3tGJ/ni/ebcqHVFZkv1C4/6lblraUPbPgCJ4Vhb4oa3FFhRa2Yj9gA58jGH/ztKueNQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + bundledDependencies: + - '@isaacs/string-locale-compare' + - '@npmcli/arborist' + - '@npmcli/config' + - '@npmcli/fs' + - '@npmcli/map-workspaces' + - '@npmcli/package-json' + - '@npmcli/promise-spawn' + - '@npmcli/run-script' + - abbrev + - archy + - cacache + - chalk + - ci-info + - cli-columns + - cli-table3 + - columnify + - fastest-levenshtein + - fs-minipass + - glob + - graceful-fs + - hosted-git-info + - ini + - init-package-json + - is-cidr + - json-parse-even-better-errors + - libnpmaccess + - libnpmdiff + - libnpmexec + - libnpmfund + - libnpmhook + - libnpmorg + - libnpmpack + - libnpmpublish + - libnpmsearch + - libnpmteam + - libnpmversion + - make-fetch-happen + - minimatch + - minipass + - minipass-pipeline + - ms + - node-gyp + - nopt + - normalize-package-data + - npm-audit-report + - npm-install-checks + - npm-package-arg + - npm-pick-manifest + - npm-profile + - npm-registry-fetch + - npm-user-validate + - npmlog + - p-map + - pacote + - parse-conflict-json + - proc-log + - qrcode-terminal + - read + - semver + - sigstore + - spdx-expression-parse + - ssri + - supports-color + - tar + - text-table + - tiny-relative-date + - treeverse + - validate-npm-package-name + - which + - write-file-atomic + number-to-bn@1.7.0: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} engines: {node: '>=6.5.0', npm: '>=3'} @@ -5602,6 +5928,14 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} + p-queue@8.1.1: + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} + engines: {node: '>=18'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -5765,6 +6099,9 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + progress-events@1.0.1: + resolution: {integrity: sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -6079,6 +6416,10 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} + serialize-error@8.1.0: + resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} + engines: {node: '>=10'} + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -6241,6 +6582,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stable-hash-x@0.1.1: resolution: {integrity: sha512-l0x1D6vhnsNUGPFVDx45eif0y6eedVC8nm5uACTrVFJFtl2mLRW17aWtVyxFCpn5t94VUPkjU8vSLwIuwwqtJQ==} engines: {node: '>=12.0.0'} @@ -6522,6 +6866,10 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-custom-error@3.3.1: + resolution: {integrity: sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==} + engines: {node: '>=14.0.0'} + ts-jest@29.4.0: resolution: {integrity: sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} @@ -6549,6 +6897,9 @@ packages: jest-util: optional: true + ts-log@2.2.7: + resolution: {integrity: sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==} + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -6619,6 +6970,10 @@ packages: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -6655,6 +7010,18 @@ packages: u3@0.1.1: resolution: {integrity: sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w==} + uint8-encoding@2.0.1: + resolution: {integrity: sha512-xZAjZ+3OvrDtjFLLgojrLmG6T0YwZEo0OTyqCBxFjlFimIKnLtFqyYk6z/jDOUlJFJE52Srtrv4W4x7t4Cn/dA==} + + uint8-varint@2.0.4: + resolution: {integrity: sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==} + + uint8arraylist@2.4.8: + resolution: {integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==} + + uint8arrays@5.1.0: + resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -6781,6 +7148,9 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-encoding@1.1.5: + resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -7670,6 +8040,152 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@biglup/is-cid@1.0.3': + dependencies: + '@multiformats/mafmt': 12.1.6 + '@multiformats/multiaddr': 12.5.1 + iso-url: 1.2.1 + multiformats: 13.4.1 + uint8arrays: 5.1.0 + + '@blaze-cardano/core@0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': + dependencies: + '@cardano-sdk/core': 0.45.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@cardano-sdk/crypto': 0.1.32 + '@cardano-sdk/util': 0.15.7 + '@noble/curves': 1.9.2 + '@noble/ed25519': 2.3.0 + '@noble/hashes': 1.8.0 + '@scure/bip39': 1.6.0 + blakejs: 1.2.1 + transitivePeerDependencies: + - '@dcspark/cardano-multiplatform-lib-asmjs' + - '@dcspark/cardano-multiplatform-lib-browser' + - '@dcspark/cardano-multiplatform-lib-nodejs' + - bufferutil + - encoding + - react-native-b4a + - rxjs + - utf-8-validate + + '@blaze-cardano/data@0.6.4(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': + dependencies: + '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@sinclair/typebox': 0.34.41 + transitivePeerDependencies: + - '@dcspark/cardano-multiplatform-lib-asmjs' + - '@dcspark/cardano-multiplatform-lib-browser' + - '@dcspark/cardano-multiplatform-lib-nodejs' + - bufferutil + - encoding + - react-native-b4a + - rxjs + - utf-8-validate + + '@blaze-cardano/jest-config@0.0.1': {} + + '@blaze-cardano/ogmios@0.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@cardano-ogmios/schema': 6.13.0 + isomorphic-ws: 5.0.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - ws + + '@blaze-cardano/query@0.5.2(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': + dependencies: + '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@blaze-cardano/jest-config': 0.0.1 + '@blaze-cardano/ogmios': 0.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@cardano-ogmios/schema': 6.13.0 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@dcspark/cardano-multiplatform-lib-asmjs' + - '@dcspark/cardano-multiplatform-lib-browser' + - '@dcspark/cardano-multiplatform-lib-nodejs' + - bufferutil + - encoding + - react-native-b4a + - rxjs + - utf-8-validate + + '@blaze-cardano/sdk@0.2.43(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': + dependencies: + '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@blaze-cardano/query': 0.5.2(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@blaze-cardano/tx': 0.13.4(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@blaze-cardano/uplc': 0.4.1(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@blaze-cardano/wallet': 0.4.13(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@dcspark/cardano-multiplatform-lib-asmjs' + - '@dcspark/cardano-multiplatform-lib-browser' + - '@dcspark/cardano-multiplatform-lib-nodejs' + - bufferutil + - encoding + - react-native-b4a + - rxjs + - utf-8-validate + + '@blaze-cardano/tx@0.13.4(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': + dependencies: + '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@blaze-cardano/vm': 0.2.1(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@dcspark/cardano-multiplatform-lib-asmjs' + - '@dcspark/cardano-multiplatform-lib-browser' + - '@dcspark/cardano-multiplatform-lib-nodejs' + - bufferutil + - encoding + - react-native-b4a + - rxjs + - utf-8-validate + + '@blaze-cardano/uplc@0.4.1(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': + dependencies: + '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@blaze-cardano/data': 0.6.4(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + hex-encoding: 2.0.3 + transitivePeerDependencies: + - '@dcspark/cardano-multiplatform-lib-asmjs' + - '@dcspark/cardano-multiplatform-lib-browser' + - '@dcspark/cardano-multiplatform-lib-nodejs' + - bufferutil + - encoding + - react-native-b4a + - rxjs + - utf-8-validate + + '@blaze-cardano/vm@0.2.1(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': + dependencies: + '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@blaze-cardano/uplc': 0.4.1(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@dcspark/cardano-multiplatform-lib-asmjs' + - '@dcspark/cardano-multiplatform-lib-browser' + - '@dcspark/cardano-multiplatform-lib-nodejs' + - bufferutil + - encoding + - react-native-b4a + - rxjs + - utf-8-validate + + '@blaze-cardano/wallet@0.4.13(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': + dependencies: + '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@blaze-cardano/jest-config': 0.0.1 + '@blaze-cardano/query': 0.5.2(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@blaze-cardano/tx': 0.13.4(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) + '@emurgo/cardano-message-signing-browser': 1.1.0 + '@emurgo/cardano-message-signing-nodejs': 1.1.0 + transitivePeerDependencies: + - '@dcspark/cardano-multiplatform-lib-asmjs' + - '@dcspark/cardano-multiplatform-lib-browser' + - '@dcspark/cardano-multiplatform-lib-nodejs' + - bufferutil + - encoding + - react-native-b4a + - rxjs + - utf-8-validate + '@blockfrost/blockfrost-js@5.7.0': dependencies: '@blockfrost/openapi': 0.1.70-beta.0 @@ -7685,7 +8201,7 @@ snapshots: ajv: 8.17.1 cbor: 9.0.2 rimraf: 6.0.1 - yaml: 2.8.0 + yaml: 2.8.1 '@bundlr-network/client@0.7.17(bufferutil@4.0.9)(debug@4.4.1)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: @@ -7715,6 +8231,109 @@ snapshots: - typescript - utf-8-validate + '@cardano-ogmios/client@6.9.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@cardano-ogmios/schema': 6.9.0 + '@cardanosolutions/json-bigint': 1.0.2 + '@types/json-bigint': 1.0.4 + bech32: 2.0.0 + cross-fetch: 3.2.0(encoding@0.1.13) + fastq: 1.19.1 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + nanoid: 3.3.11 + ts-custom-error: 3.3.1 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@cardano-ogmios/schema@6.13.0': {} + + '@cardano-ogmios/schema@6.9.0': {} + + '@cardano-sdk/core@0.45.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': + dependencies: + '@biglup/is-cid': 1.0.3 + '@cardano-ogmios/client': 6.9.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@cardano-ogmios/schema': 6.9.0 + '@cardano-sdk/crypto': 0.2.3 + '@cardano-sdk/util': 0.15.7 + '@foxglove/crc': 0.0.3 + '@scure/base': 1.2.6 + fraction.js: 4.0.1 + ip-address: 9.0.5 + lodash: 4.17.21 + ts-custom-error: 3.3.1 + ts-log: 2.2.7 + web-encoding: 1.1.5 + optionalDependencies: + rxjs: 7.8.2 + transitivePeerDependencies: + - '@dcspark/cardano-multiplatform-lib-asmjs' + - '@dcspark/cardano-multiplatform-lib-browser' + - '@dcspark/cardano-multiplatform-lib-nodejs' + - bufferutil + - encoding + - react-native-b4a + - utf-8-validate + + '@cardano-sdk/crypto@0.1.32': + dependencies: + '@cardano-sdk/util': 0.15.7 + blake2b: 2.1.4 + i: 0.3.7 + libsodium-wrappers-sumo: 0.7.15 + lodash: 4.17.21 + npm: 9.9.4 + pbkdf2: 3.1.3 + ts-custom-error: 3.3.1 + ts-log: 2.2.7 + transitivePeerDependencies: + - react-native-b4a + + '@cardano-sdk/crypto@0.2.3': + dependencies: + '@cardano-sdk/util': 0.16.0 + blake2b: 2.1.4 + i: 0.3.7 + libsodium-wrappers-sumo: 0.7.15 + lodash: 4.17.21 + npm: 9.9.4 + pbkdf2: 3.1.3 + ts-custom-error: 3.3.1 + ts-log: 2.2.7 + transitivePeerDependencies: + - react-native-b4a + + '@cardano-sdk/util@0.15.7': + dependencies: + bech32: 2.0.0 + lodash: 4.17.21 + serialize-error: 8.1.0 + ts-custom-error: 3.3.1 + ts-log: 2.2.7 + type-fest: 2.19.0 + + '@cardano-sdk/util@0.16.0': + dependencies: + bech32: 2.0.0 + lodash: 4.17.21 + serialize-error: 8.1.0 + ts-custom-error: 3.3.1 + ts-log: 2.2.7 + type-fest: 2.19.0 + + '@cardanosolutions/json-bigint@1.0.2': + dependencies: + bignumber.js: 9.3.1 + + '@chainsafe/is-ip@2.1.0': {} + + '@chainsafe/netmask@2.0.0': + dependencies: + '@chainsafe/is-ip': 2.1.0 + '@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)': @@ -7800,6 +8419,10 @@ snapshots: tslib: 2.8.1 optional: true + '@emurgo/cardano-message-signing-browser@1.1.0': {} + + '@emurgo/cardano-message-signing-nodejs@1.1.0': {} + '@emurgo/cardano-serialization-lib-nodejs@11.5.0': {} '@emurgo/cip14-js@3.0.1': @@ -8393,6 +9016,8 @@ snapshots: dependencies: '@sinclair/typebox': 0.33.22 + '@foxglove/crc@0.0.3': {} + '@graphql-typed-document-node/core@3.2.0(graphql@16.11.0)': dependencies: graphql: 16.11.0 @@ -8763,6 +9388,8 @@ snapshots: bignumber.js: 9.3.0 rxjs: 7.8.2 + '@leichtgewicht/ip-codec@2.0.5': {} + '@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)': @@ -8946,6 +9573,29 @@ snapshots: '@minswap/tiny-invariant@1.2.0': {} + '@multiformats/dns@1.0.9': + dependencies: + buffer: 6.0.3 + dns-packet: 5.6.1 + hashlru: 2.3.0 + p-queue: 8.1.1 + progress-events: 1.0.1 + uint8arrays: 5.1.0 + + '@multiformats/mafmt@12.1.6': + dependencies: + '@multiformats/multiaddr': 12.5.1 + + '@multiformats/multiaddr@12.5.1': + dependencies: + '@chainsafe/is-ip': 2.1.0 + '@chainsafe/netmask': 2.0.0 + '@multiformats/dns': 1.0.9 + abort-error: 1.0.1 + multiformats: 13.4.1 + uint8-varint: 2.0.4 + uint8arrays: 5.1.0 + '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.5.0 @@ -8973,6 +9623,8 @@ snapshots: '@noble/ed25519@1.7.5': {} + '@noble/ed25519@2.3.0': {} + '@noble/hashes@1.2.0': {} '@noble/hashes@1.4.0': {} @@ -9541,6 +10193,8 @@ snapshots: '@sinclair/typebox@0.33.22': {} + '@sinclair/typebox@0.34.41': {} + '@sindresorhus/is@4.6.0': {} '@sinonjs/commons@3.0.1': @@ -10199,6 +10853,29 @@ snapshots: - typescript - utf-8-validate + '@sundaeswap/asset@1.0.11': + dependencies: + '@sundaeswap/fraction': 1.0.8 + + '@sundaeswap/bigint-math@0.6.3': {} + + '@sundaeswap/core@1.3.48(@blaze-cardano/sdk@0.2.43(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(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)(lucid-cardano@0.10.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@blaze-cardano/sdk': 0.2.43(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(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 + lucid-cardano: 0.10.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@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': @@ -10329,6 +11006,8 @@ snapshots: '@types/js-yaml@4.0.9': {} + '@types/json-bigint@1.0.4': {} + '@types/json5@0.0.29': {} '@types/keyv@3.1.4': @@ -10806,6 +11485,9 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 + '@zxing/text-encoding@0.9.0': + optional: true + abitype@1.0.8(typescript@5.8.3)(zod@3.25.76): optionalDependencies: typescript: 5.8.3 @@ -10820,6 +11502,8 @@ snapshots: dependencies: event-target-shim: 5.0.1 + abort-error@1.0.1: {} + abstract-level@1.0.4: dependencies: buffer: 6.0.3 @@ -11139,6 +11823,8 @@ snapshots: transitivePeerDependencies: - debug + b4a@1.7.1: {} + babel-jest@29.7.0(@babel/core@7.28.0): dependencies: '@babel/core': 7.28.0 @@ -11232,6 +11918,8 @@ snapshots: bignumber.js@9.3.0: {} + bignumber.js@9.3.1: {} + binary-extensions@2.3.0: {} bindings@1.5.0: @@ -11262,11 +11950,25 @@ snapshots: dependencies: nanoassert: 1.1.0 + blake2b-wasm@2.4.0: + dependencies: + b4a: 1.7.1 + nanoassert: 2.0.0 + transitivePeerDependencies: + - react-native-b4a + blake2b@2.1.3: dependencies: blake2b-wasm: 1.1.7 nanoassert: 1.1.0 + blake2b@2.1.4: + dependencies: + blake2b-wasm: 2.4.0 + nanoassert: 2.0.0 + transitivePeerDependencies: + - react-native-b4a + blakejs@1.2.1: {} bluebird@3.7.2: {} @@ -11708,6 +12410,8 @@ 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: @@ -11907,6 +12611,10 @@ snapshots: dependencies: path-type: 4.0.0 + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -12770,6 +13478,8 @@ snapshots: fp-ts@1.19.3: {} + fraction.js@4.0.1: {} + fraction.js@4.3.7: {} fragment-cache@0.2.1: @@ -13085,6 +13795,8 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 + hashlru@2.3.0: {} + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -13093,6 +13805,11 @@ snapshots: help-me@5.0.0: {} + hex-encoding@2.0.3: + dependencies: + node-buffer-encoding: 1.0.3 + uint8-encoding: 2.0.1 + hi-base32@0.5.1: {} hmac-drbg@1.0.1: @@ -13141,6 +13858,8 @@ snapshots: husky@9.1.7: {} + i@0.3.7: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -13207,6 +13926,11 @@ snapshots: dependencies: fp-ts: 1.19.3 + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + ipaddr.js@1.9.1: {} is-accessor-descriptor@1.0.1: @@ -13410,6 +14134,8 @@ snapshots: isnumber@1.0.0: {} + iso-url@1.2.1: {} + isobject@2.1.0: dependencies: isarray: 1.0.0 @@ -13420,6 +14146,10 @@ snapshots: dependencies: ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isomorphic-ws@5.0.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -13891,6 +14621,8 @@ snapshots: jsbi@3.2.5: {} + jsbn@1.1.0: {} + jsesc@3.1.0: {} json-bigint@1.0.0: @@ -13985,6 +14717,12 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + libsodium-sumo@0.7.15: {} + + libsodium-wrappers-sumo@0.7.15: + dependencies: + libsodium-sumo: 0.7.15 + light-my-request@5.14.0: dependencies: cookie: 0.7.2 @@ -14076,6 +14814,15 @@ snapshots: lru_map@0.3.3: {} + lucid-cardano@0.10.7(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 + make-dir@4.0.0: dependencies: semver: 7.7.2 @@ -14255,6 +15002,8 @@ snapshots: ms@2.1.3: {} + multiformats@13.4.1: {} + multistream@4.1.0: dependencies: once: 1.4.0 @@ -14280,6 +15029,10 @@ snapshots: nanoassert@1.1.0: {} + nanoassert@2.0.0: {} + + nanoid@3.3.11: {} + nanomatch@1.2.13: dependencies: arr-diff: 4.0.0 @@ -14357,6 +15110,8 @@ snapshots: node-addon-api@6.1.0: {} + node-buffer-encoding@1.0.3: {} + node-cache@5.1.2: dependencies: clone: 2.1.2 @@ -14404,6 +15159,8 @@ snapshots: dependencies: path-key: 3.1.1 + npm@9.9.4: {} + number-to-bn@1.7.0: dependencies: bn.js: 5.2.1 @@ -14574,6 +15331,13 @@ snapshots: dependencies: aggregate-error: 3.1.0 + p-queue@8.1.1: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.4 + + p-timeout@6.1.4: {} + p-try@2.2.0: {} package-json-from-dist@1.0.1: {} @@ -14742,6 +15506,8 @@ snapshots: process@0.11.10: {} + progress-events@1.0.1: {} + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -15080,6 +15846,10 @@ snapshots: transitivePeerDependencies: - supports-color + serialize-error@8.1.0: + dependencies: + type-fest: 0.20.2 + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -15289,6 +16059,8 @@ snapshots: sprintf-js@1.0.3: {} + sprintf-js@1.1.3: {} + stable-hash-x@0.1.1: {} stable-hash-x@0.2.0: {} @@ -15574,6 +16346,8 @@ snapshots: dependencies: typescript: 5.8.3 + ts-custom-error@3.3.1: {} + ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(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.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 @@ -15594,6 +16368,8 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.28.0) jest-util: 29.7.0 + ts-log@2.2.7: {} + ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -15668,6 +16444,8 @@ snapshots: type-fest@0.7.1: {} + type-fest@2.19.0: {} + type-fest@4.41.0: {} type-is@1.6.18: @@ -15714,6 +16492,21 @@ snapshots: u3@0.1.1: {} + uint8-encoding@2.0.1: {} + + uint8-varint@2.0.4: + dependencies: + uint8arraylist: 2.4.8 + uint8arrays: 5.1.0 + + uint8arraylist@2.4.8: + dependencies: + uint8arrays: 5.1.0 + + uint8arrays@5.1.0: + dependencies: + multiformats: 13.4.1 + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -15878,6 +16671,12 @@ snapshots: dependencies: defaults: 1.0.4 + web-encoding@1.1.5: + dependencies: + util: 0.12.5 + optionalDependencies: + '@zxing/text-encoding': 0.9.0 + web-streams-polyfill@3.3.3: {} web3-utils@1.7.3: diff --git a/src/app.ts b/src/app.ts index 952c043280..7015a5cf25 100644 --- a/src/app.ts +++ b/src/app.ts @@ -23,6 +23,7 @@ import { meteoraRoutes } from './connectors/meteora/meteora.routes'; import { pancakeswapRoutes } from './connectors/pancakeswap/pancakeswap.routes'; import { raydiumRoutes } from './connectors/raydium/raydium.routes'; import { uniswapRoutes } from './connectors/uniswap/uniswap.routes'; +import { minswapRoutes } from './connectors/minswap/minswap.routes'; import { getHttpsOptions } from './https'; import { poolRoutes } from './pools/pools.routes'; import { ConfigManagerV2 } from './services/config-manager-v2'; @@ -245,6 +246,9 @@ 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' }); + // 0x routes app.register(register0xRoutes); diff --git a/src/chains/cardano/cardano.config.ts b/src/chains/cardano/cardano.config.ts index c67d17aa2b..c1499a90a2 100644 --- a/src/chains/cardano/cardano.config.ts +++ b/src/chains/cardano/cardano.config.ts @@ -1,67 +1,40 @@ import { ConfigManagerV2 } from '../../services/config-manager-v2'; -export interface NetworkConfig { +interface NetworkConfig { name: string; + tokenListType: string; + tokenListSource: string; + nativeCurrencySymbol: string; apiurl: string; + projectId: string; } export interface Config { network: NetworkConfig; - allowedSlippage: string; - blockfrostProjectId: string; - preprodBlockfrostProjectId: string; - previewBlockfrostProjectId: string; - ttl: string; - minswapPoolId: string; - sundaeswapPoolId: string; - defaultAddress: string; - nativeCurrencySymbol: string; - tokenListType: string; // default: FILE - tokenListSource: string; // default: src/chains/cardano/cardano_tokens.json } export function getCardanoConfig( chainName: string, networkName: string, ): Config { - const network = networkName; return { network: { - name: network, + name: networkName, + tokenListType: ConfigManagerV2.getInstance().get( + chainName + '.networks.' + networkName + '.tokenListType', + ), + tokenListSource: ConfigManagerV2.getInstance().get( + chainName + '.networks.' + networkName + '.tokenListSource', + ), + nativeCurrencySymbol: ConfigManagerV2.getInstance().get( + chainName + '.networks.' + networkName + '.nativeCurrencySymbol', + ), apiurl: ConfigManagerV2.getInstance().get( - chainName + '.blockfrostApiUrls.' + networkName + '.apiurl', + chainName + '.networks.' + networkName + '.apiurl', + ), + projectId: ConfigManagerV2.getInstance().get( + chainName + '.networks.' + networkName + '.projectId', ), }, - - allowedSlippage: ConfigManagerV2.getInstance().get( - chainName + '.allowedSlippage', - ), - blockfrostProjectId: ConfigManagerV2.getInstance().get( - chainName + '.blockfrostProjectId', - ), - preprodBlockfrostProjectId: ConfigManagerV2.getInstance().get( - chainName + '.preprodBlockfrostProjectId', - ), - previewBlockfrostProjectId: ConfigManagerV2.getInstance().get( - chainName + '.previewBlockfrostProjectId', - ), - minswapPoolId: ConfigManagerV2.getInstance().get( - chainName + '.minswapPoolId.' + networkName + '.poolId', - ), - sundaeswapPoolId: ConfigManagerV2.getInstance().get( - chainName + '.sundaeswapPoolId.' + networkName + '.poolId', - ), - defaultAddress: ConfigManagerV2.getInstance().get( - chainName + '.defaultAddress', - ), - ttl: ConfigManagerV2.getInstance().get(chainName + '.ttl'), - nativeCurrencySymbol: ConfigManagerV2.getInstance().get( - chainName + '.networks.' + networkName + '.nativeCurrencySymbol', - ), - tokenListType: ConfigManagerV2.getInstance().get( - chainName + '.networks.' + networkName + '.tokenListType', - ), - tokenListSource: ConfigManagerV2.getInstance().get( - chainName + '.networks.' + networkName + '.tokenListSource', - ), + // Additional Cardano-specific configurations can be added here }; } diff --git a/src/chains/cardano/cardano.ts b/src/chains/cardano/cardano.ts index 05be2098a7..e95d54a49e 100644 --- a/src/chains/cardano/cardano.ts +++ b/src/chains/cardano/cardano.ts @@ -25,29 +25,23 @@ export type CardanoTokenInfo = { name: string; symbol: string; logoURI: string; + address: string; }; export class Cardano { private static _instances: { [name: string]: Cardano }; - // protected tokenList: CardanoTokenInfo[] = []; - // private _tokenMap: Record = {}; public tokenList: CardanoTokenInfo[] = []; public config: Config; public tokenMap: Record = {}; private _tokenListSource: string; private _tokenListType: TokenListType; public lucidInstance: Lucid | null = null; - private network: string; - public allowedSlippage?: string; - public blockfrostProjectId: string; - //public gasLimitEstimate: number; - public ttl?: string; + public network: string; private _chain: string; private _ready: boolean = false; public apiURL: any; - public minswapPoolId: string; - public sundaeswapPoolId: string; public nativeTokenSymbol: string; + public projectId: string; private constructor(network: string) { // Throw error if network is not 'mainnet' or 'preprod' @@ -60,24 +54,13 @@ export class Cardano { } this.config = getCardanoConfig('cardano', network); this._chain = 'cardano'; - this.ttl = this.config.ttl; // Determine the appropriate Blockfrost Project ID and API URL - const networkConfig = { - preprod: this.config.preprodBlockfrostProjectId, - preview: this.config.previewBlockfrostProjectId, - mainnet: this.config.blockfrostProjectId, // Assuming mainnet as default - }; - this.blockfrostProjectId = - networkConfig[network] || this.config.blockfrostProjectId; - - this.allowedSlippage = this.config.allowedSlippage; this.apiURL = this.config.network.apiurl; - this.minswapPoolId = this.config.minswapPoolId; - this.sundaeswapPoolId = this.config.sundaeswapPoolId; this.network = this.config.network.name; - this.nativeTokenSymbol = this.config.nativeCurrencySymbol; - this._tokenListSource = this.config.tokenListSource; - this._tokenListType = this.config.tokenListType; + this.nativeTokenSymbol = this.config.network.nativeCurrencySymbol; + this._tokenListSource = this.config.network.tokenListSource; + this._tokenListType = this.config.network.tokenListType; + this.projectId = this.config.network.projectId; } public static async getInstance(network: string): Promise { if (Cardano._instances === undefined) { @@ -108,7 +91,7 @@ export class Cardano { public async init(): Promise { if (!this.lucidInstance) { this.lucidInstance = await Lucid.new( - new Blockfrost(this.apiURL, this.blockfrostProjectId), + new Blockfrost(this.apiURL, this.projectId), this.network === 'preprod' ? 'Preprod' : this.network === 'preview' @@ -155,9 +138,7 @@ export class Cardano { } } - public async getWalletFromAddress(address: string): Promise<{ - privateKey: string; - }> { + public async getWalletFromAddress(address: string): Promise { const path = `${walletPath}/${this._chain}`; const encryptedPrivateKey: string = await fse.readFile( `${path}/${address}.json`, @@ -171,7 +152,7 @@ export class Cardano { // Ensure decrypt is awaited if it's asynchronous const privateKey = await this.decrypt(encryptedPrivateKey, passphrase); - return { privateKey }; // Correctly resolved the Promise to string + return privateKey; // Correctly resolved the Promise to string } // get native balance ADA public async getNativeBalance(privateKey: string): Promise { @@ -296,7 +277,7 @@ export class Cardano { async getCurrentBlockNumber(): Promise { const response = await fetch(`${this.apiURL}/blocks/latest`, { headers: { - project_id: this.blockfrostProjectId, + project_id: this.projectId, }, }); @@ -314,7 +295,7 @@ export class Cardano { const response = await fetch(`${this.apiURL}/txs/${txHash}`, { method: 'GET', headers: { - project_id: this.blockfrostProjectId, // Pass project ID in the header + project_id: this.projectId, // Pass project ID in the header }, }); @@ -325,11 +306,12 @@ export class Cardano { // Parse the response JSON const tx = await response.json(); + console.log(tx); // Simplify the response for the bot return { txHash: tx.hash, - block: Number(tx.block), + block: tx.block, blockHeight: tx.block_height, blockTime: tx.block_time, fees: Number(tx.fees), diff --git a/src/chains/cardano/cardano.utils.ts b/src/chains/cardano/cardano.utils.ts index 125f3f640b..dbdbd5fca3 100644 --- a/src/chains/cardano/cardano.utils.ts +++ b/src/chains/cardano/cardano.utils.ts @@ -64,3 +64,5 @@ export interface TransactionStatus { 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 index ae1b49d084..e6cb2f4e75 100644 --- a/src/chains/cardano/routes/balances.ts +++ b/src/chains/cardano/routes/balances.ts @@ -20,9 +20,7 @@ export async function getCardanoBalances( const cardano = await Cardano.getInstance(network); await cardano.init(); - let wallet: { - privateKey: string; - }; + let wallet: string; const balances: Record = {}; // Treat empty array as if no tokens were specified @@ -41,7 +39,7 @@ export async function getCardanoBalances( } // Always get native token balance - const nativeBalance = await cardano.getNativeBalance(wallet.privateKey); + const nativeBalance = await cardano.getNativeBalance(wallet); // Convert string to number as required by schema balances[cardano.nativeTokenSymbol] = parseFloat( tokenValueToString(nativeBalance), @@ -87,10 +85,7 @@ export async function getCardanoBalances( await Promise.all( batch.map(async (token) => { try { - const balance = await cardano.getAssetBalance( - wallet.privateKey, - token, - ); + const balance = await cardano.getAssetBalance(wallet, token); // Parse balance to number const balanceNum = parseFloat(tokenValueToString(balance)); @@ -121,10 +116,7 @@ export async function getCardanoBalances( const token = cardano.getTokenBySymbol(symbolOrAddress); if (token) { - const balance = await cardano.getAssetBalance( - wallet.privateKey, - token, - ); + const balance = await cardano.getAssetBalance(wallet, token); // Convert string to number as required by schema balances[token.symbol] = parseFloat(tokenValueToString(balance)); } diff --git a/src/chains/cardano/routes/poll.ts b/src/chains/cardano/routes/poll.ts index 7fd880c14a..2ecb0d5907 100644 --- a/src/chains/cardano/routes/poll.ts +++ b/src/chains/cardano/routes/poll.ts @@ -12,7 +12,7 @@ import { Cardano } from '../cardano'; export async function pollCardanoTransaction( _fastify: FastifyInstance, network: string, - txHash: string, + signature: string, ): Promise { const cardano = await Cardano.getInstance(network); @@ -20,10 +20,10 @@ export async function pollCardanoTransaction( const currentBlock = await cardano.getCurrentBlockNumber(); // Validate transaction signature format - if (!txHash || typeof txHash !== 'string') { + if (!signature || typeof signature !== 'string') { return { currentBlock, - signature: txHash, + signature, txBlock: null, txStatus: 0, txData: null, @@ -32,12 +32,12 @@ export async function pollCardanoTransaction( }; } - const txData = await cardano.getTransaction(txHash); + const txData = await cardano.getTransaction(signature); if (!txData) { return { currentBlock, - signature: txHash, + signature, txBlock: null, txStatus: 0, txData: null, @@ -47,17 +47,17 @@ export async function pollCardanoTransaction( return { currentBlock, - signature: txHash, - txBlock: txData.block, + signature, + txBlock: txData.blockHeight, txStatus: txData.status, fee: txData.fees, txData, }; } catch (error) { - logger.error(`Error polling transaction ${txHash}: ${error.message}`); + logger.error(`Error polling transaction ${signature}: ${error.message}`); return { currentBlock: await cardano.getCurrentBlockNumber(), - signature: txHash, + signature, txBlock: null, txStatus: 0, txData: null, @@ -88,7 +88,7 @@ export const pollRoute: FastifyPluginAsync = async (fastify) => { signature: { type: 'string', examples: [ - 'a03a01fb56ba60fab341bcb95340302853aea4c3d8faace9ba930a5b3e93f307', + '66f5f15d15124a77418cfa3ec0e72cc1d2295647e528a9ecb4636f9ed5342d06', ], }, }, diff --git a/src/chains/cardano/routes/tokens.ts b/src/chains/cardano/routes/tokens.ts index 30972da5b6..eae5372bee 100644 --- a/src/chains/cardano/routes/tokens.ts +++ b/src/chains/cardano/routes/tokens.ts @@ -1,4 +1,4 @@ -import { FastifyPluginAsync } from 'fastify'; +import { FastifyPluginAsync, FastifyInstance } from 'fastify'; import { TokensRequestType, @@ -10,21 +10,21 @@ 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); - await cardano.init(); - let tokens = []; + if (!tokenSymbols) { - tokens = cardano.storedTokenList; + tokens = cardano.tokenList; } else { const symbolsArray = Array.isArray(tokenSymbols) ? tokenSymbols : typeof tokenSymbols === 'string' - ? (tokenSymbols as string).replace(/[[\]]/g, '').split(',') + ? tokenSymbols.replace(/[\[\]]/g, '').split(',') : []; for (const symbol of symbolsArray) { @@ -35,8 +35,10 @@ export async function getCardanoTokens( return { tokens }; } catch (error) { - logger.error(`Error getting Cardano tokens: ${error.message}`); - throw new Error(`Failed to get tokens: ${error.message}`); + logger.error(`Error getting tokens: ${error.message}`); + throw fastify.httpErrors.internalServerError( + `Failed to get tokens: ${error.message}`, + ); } } @@ -48,16 +50,15 @@ export const tokensRoute: FastifyPluginAsync = async (fastify) => { '/tokens', { schema: { - description: 'Get Cardano tokens', + description: + 'Get list of supported Cardano tokens with their addresses and decimals', tags: ['cardano'], querystring: { ...TokensRequestSchema, properties: { ...TokensRequestSchema.properties, - network: { - type: 'string', - examples: ['mainnet', 'preprod', 'preview'], - }, + network: { type: 'string', default: 'preprod' }, + tokenSymbols: { type: 'array', items: { type: 'string' } }, }, }, response: { @@ -65,15 +66,9 @@ export const tokensRoute: FastifyPluginAsync = async (fastify) => { }, }, }, - async (request, reply) => { + async (request) => { const { network, tokenSymbols } = request.query; - try { - return await getCardanoTokens(network, tokenSymbols); - } catch (error) { - logger.error(`Error handling Cardano tokens request: ${error.message}`); - reply.status(500); - return { tokens: [] }; - } + return await getCardanoTokens(fastify, network, tokenSymbols); }, ); }; diff --git a/src/config/schemas.ts b/src/config/schemas.ts index 5617647241..34491a50d5 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({ diff --git a/src/connectors/minswap/amm-routes/poolInfo.ts b/src/connectors/minswap/amm-routes/poolInfo.ts new file mode 100644 index 0000000000..5bb3a2fed5 --- /dev/null +++ b/src/connectors/minswap/amm-routes/poolInfo.ts @@ -0,0 +1,82 @@ +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: ['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, baseToken, quoteToken } = request.query; + const network = request.query.network || 'mainnet'; + + const minswap = await Minswap.getInstance(network); + + // Check if either poolAddress or both baseToken and quoteToken are provided + if (!poolAddress && (!baseToken || !quoteToken)) { + throw fastify.httpErrors.badRequest( + 'Either poolAddress or both baseToken and quoteToken must be provided', + ); + } + + let poolAddressToUse = poolAddress; + + // If no pool address provided, find default pool using base and quote tokens + if (!poolAddressToUse) { + poolAddressToUse = await minswap.findDefaultPool( + baseToken, + quoteToken, + 'amm', + ); + if (!poolAddressToUse) { + throw fastify.httpErrors.notFound( + `No AMM pool found for pair ${baseToken}-${quoteToken}`, + ); + } + } + + const poolInfo = await minswap.getAmmPoolInfo(poolAddressToUse); + 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/quoteSwap.ts b/src/connectors/minswap/amm-routes/quoteSwap.ts new file mode 100644 index 0000000000..2d097da3e7 --- /dev/null +++ b/src/connectors/minswap/amm-routes/quoteSwap.ts @@ -0,0 +1,452 @@ +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync, FastifyInstance } from 'fastify'; +import { Cardano, CardanoTokenInfo } from '../../../chains/cardano/cardano'; +import { + GetSwapQuoteResponseType, + GetSwapQuoteResponse, + GetSwapQuoteRequestType, + GetSwapQuoteRequest, +} from '../../../schemas/swap-schema'; +import { logger } from '../../../services/logger'; +import { Minswap } from '../minswap'; // Added DexV2Calculation import +import { formatTokenAmount } from '../minswap.utils'; +import { + Asset, + calculateSwapExactIn, + calculateSwapExactOut, +} from '@aiquant/minswap-sdk'; + +async function quoteAmmSwap( + minswap: Minswap, + poolAddress: string, + baseToken: CardanoTokenInfo, + quoteToken: CardanoTokenInfo, + amount: number, + side: 'BUY' | 'SELL', +): Promise { + try { + // Get the V2 pair + const assetA: Asset = { + policyId: baseToken.policyId, + tokenName: baseToken.assetName, + }; + + const assetB: Asset = { + policyId: quoteToken.policyId, + tokenName: quoteToken.assetName, + }; + + const pool = await minswap.blockfrostAdapter.getV2PoolByPair( + assetA, + assetB, + ); + + if (!pool) { + throw new Error( + `Pool not found for ${baseToken.symbol}-${quoteToken.symbol}`, + ); + } + + // Form full asset IDs for comparison + // if base token is ADA then take baseTokenAsset as lovelace + let baseTokenAsset: string; + if (baseToken.symbol === 'ADA') { + baseTokenAsset = 'lovelace'; + } else { + baseTokenAsset = baseToken.policyId + baseToken.assetName; + } + const quoteTokenAsset = quoteToken.policyId + quoteToken.assetName; + + // Determine which token is being traded + const exactIn = side === 'SELL'; + const inputToken = exactIn ? baseToken : quoteToken; + const outputToken = exactIn ? quoteToken : baseToken; + + // Convert amount to baseToken's smallest unit (since amount always refers to baseToken) + const amountInSmallestUnit = BigNumber.from( + Math.floor(amount * Math.pow(10, baseToken.decimals)), + ).toBigInt(); + + // Determine reserves and fee based on trading direction + let reserveIn: bigint; + let reserveOut: bigint; + let tradingFeeNumerator: bigint; + + if (exactIn) { + // Selling baseToken (inputToken = baseToken) + console.log(pool); + + console.log( + 'pool.assetA' + pool.assetA, + 'baseTokenAsset' + baseTokenAsset, + ); + + if (baseTokenAsset === pool.assetA) { + reserveIn = pool.reserveA; + reserveOut = pool.reserveB; + tradingFeeNumerator = pool.feeA[0]; // Fee for A->B + } else if (baseTokenAsset === pool.assetB) { + reserveIn = pool.reserveB; + reserveOut = pool.reserveA; + tradingFeeNumerator = pool.feeA[1]; // Fee for B->A + } else { + throw new Error('Base token not found in pool'); + } + } else { + // Buying baseToken (inputToken = quoteToken) + if (quoteTokenAsset === pool.assetA) { + reserveIn = pool.reserveA; + reserveOut = pool.reserveB; + tradingFeeNumerator = pool.feeA[0]; // Fee for A->B + } else if (quoteTokenAsset === pool.assetB) { + reserveIn = pool.reserveB; + reserveOut = pool.reserveA; + tradingFeeNumerator = pool.feeA[1]; // Fee for B->A + } else { + throw new Error('Quote token not found in pool'); + } + } + + // Perform calculations + let inputAmount: bigint; + let outputAmount: bigint; + let priceImpact: number; + + if (exactIn) { + inputAmount = amountInSmallestUnit; + const result = calculateSwapExactIn({ + amountIn: inputAmount, + reserveIn, + reserveOut, + }); + outputAmount = result.amountOut; + priceImpact = result.priceImpact.toNumber(); + } else { + outputAmount = amountInSmallestUnit; + const result = calculateSwapExactOut({ + exactAmountOut: outputAmount, + reserveIn, + reserveOut, + }); + inputAmount = result.amountIn; + priceImpact = result.priceImpact.toNumber(); + } + + // Calculate slippage amounts (using 0.5% default slippage) + const slippagePercent = 0.5; + const slippageFactor = BigInt(Math.floor((100 - slippagePercent) * 100)); + const slippageDenominator = 10000n; + + const minAmountOut = exactIn + ? (outputAmount * slippageFactor) / slippageDenominator + : outputAmount; + + const maxAmountIn = exactIn + ? inputAmount + : (inputAmount * BigInt(10000 + Math.floor(slippagePercent * 100))) / + slippageDenominator; + + // Format amounts for display + const estimatedAmountIn = formatTokenAmount( + inputAmount.toString(), + inputToken.decimals, + ); + + const estimatedAmountOut = formatTokenAmount( + outputAmount.toString(), + outputToken.decimals, + ); + + const minAmountOutValue = formatTokenAmount( + minAmountOut.toString(), + outputToken.decimals, + ); + + const maxAmountInValue = formatTokenAmount( + maxAmountIn.toString(), + inputToken.decimals, + ); + + return { + poolAddress, + estimatedAmountIn, + estimatedAmountOut, + minAmountOut: minAmountOutValue, + maxAmountIn: maxAmountInValue, + priceImpact, + inputToken, + outputToken, + // Add raw values for execution + rawAmountIn: inputAmount.toString(), + rawAmountOut: outputAmount.toString(), + rawMinAmountOut: minAmountOut.toString(), + rawMaxAmountIn: maxAmountIn.toString(), + pathAddresses: [ + inputToken.address || `${inputToken.policyId}.${inputToken.assetName}`, + outputToken.address || + `${outputToken.policyId}.${outputToken.assetName}`, + ], + }; + } catch (error) { + logger.error(`Error quoting AMM swap: ${error.message}`); + // Check for insufficient reserves error + if ( + error.message?.includes('INSUFFICIENT_RESERVES') || + error.message?.includes('insufficient') || + error.name === 'InsufficientReservesError' + ) { + throw new Error( + `Insufficient liquidity in pool for ${baseToken.symbol}-${quoteToken.symbol}`, + ); + } + throw error; + } +} + +export async function getMinswapAmmQuote( + _fastify: FastifyInstance, + network: string, + poolAddress: string, + baseToken: string, + quoteToken: string, + amount: number, + side: 'BUY' | 'SELL', +): 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', + ); + + 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', +): 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, + ); + + logger.info( + `Quote result: estimatedAmountIn=${quote.estimatedAmountIn}, estimatedAmountOut=${quote.estimatedAmountOut}`, + ); + + // Calculate balance changes based on which tokens are being swapped + 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 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 { + poolAddress, + estimatedAmountIn: quote.estimatedAmountIn, + estimatedAmountOut: quote.estimatedAmountOut, + minAmountOut: quote.minAmountOut, + maxAmountIn: quote.maxAmountIn, + baseTokenBalanceChange, + quoteTokenBalanceChange, + price, + gasPrice: 0, + gasLimit: 0, + gasCost: 0, + }; + } 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: GetSwapQuoteRequestType; + Reply: GetSwapQuoteResponseType; + }>( + '/quote-swap', + { + schema: { + description: 'Get swap quote for Minswap AMM', + tags: ['minswap/amm'], + querystring: { + ...GetSwapQuoteRequest, + properties: { + ...GetSwapQuoteRequest.properties, + network: { type: 'string', default: 'mainnet' }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['MIN'] }, + amount: { type: 'number', examples: [0.001] }, + side: { type: 'string', enum: ['BUY', 'SELL'], examples: ['SELL'] }, + poolAddress: { type: 'string', examples: [''] }, + slippagePct: { type: 'number', examples: [1] }, + }, + }, + response: { + 200: { + properties: { + ...GetSwapQuoteResponse.properties, + }, + }, + }, + }, + }, + async (request) => { + try { + const { + network, + poolAddress: requestedPoolAddress, + baseToken, + quoteToken, + amount, + side, + slippagePct, + } = request.query; + + const networkToUse = network || 'mainnet'; + + console.log('working upto here'); + 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', + ); + } 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/minswap.config.ts b/src/connectors/minswap/minswap.config.ts new file mode 100644 index 0000000000..455d42316f --- /dev/null +++ b/src/connectors/minswap/minswap.config.ts @@ -0,0 +1,62 @@ +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']; + + 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..ca493450b3 --- /dev/null +++ b/src/connectors/minswap/minswap.routes.ts @@ -0,0 +1,29 @@ +import sensible from '@fastify/sensible'; +import type { FastifyPluginAsync } from 'fastify'; +import { ammPoolInfoRoute } from './amm-routes/poolInfo'; +import { quoteSwapRoute as ammQuoteSwapRoute } from './amm-routes/quoteSwap'; + +// 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 = ['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..7c2eb38e3a --- /dev/null +++ b/src/connectors/minswap/minswap.ts @@ -0,0 +1,149 @@ +import { Cardano } from '../../chains/cardano/cardano'; +import { Data, PrivateKey } from '@vespr-wallet/lucid-cardano'; +import { BlockFrostAPI } from '@blockfrost/blockfrost-js'; +import { BlockfrostAdapter, NetworkId } from '@aiquant/minswap-sdk'; + +import { + percentRegexp, + ConfigManagerV2, +} from '../../services/config-manager-v2'; +import { logger } from '../../services/logger'; + +import { MinswapConfig } from './minswap.config'; +import { PoolInfo } from '../../schemas/amm-schema'; + +export class Minswap { + private static _instances: { [name: string]: Minswap }; + public cardano: Cardano; + public config: MinswapConfig.NetworkConfig; + private owner?: PrivateKey; + public blockfrostAdapter: BlockfrostAdapter; + + private constructor() { + this.config = + MinswapConfig.config as unknown as MinswapConfig.NetworkConfig; + 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(); + 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( + baseToken: string, + quoteToken: string, + routeType: 'amm', + ): Promise { + // Get the network-specific pools + const network = this.cardano.network; + const pools = MinswapConfig.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(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: pool.address, + baseTokenAddress: pool.assetA, + quoteTokenAddress: pool.assetB, + feePct: 2, + price: price[0], + baseTokenAmount: baseTokenAmount, + quoteTokenAmount: quoteTokenAmount, + poolType: 'amm', + lpMint: { + address: pool.address, + decimals: 0, + }, + }; + } +} diff --git a/src/connectors/minswap/minswap.utils.ts b/src/connectors/minswap/minswap.utils.ts new file mode 100644 index 0000000000..da18811924 --- /dev/null +++ b/src/connectors/minswap/minswap.utils.ts @@ -0,0 +1,53 @@ +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, + decimals: number, +): number => { + try { + if (typeof amount === 'string') { + return parseFloat(amount) / Math.pow(10, decimals); + } + return amount / Math.pow(10, decimals); + } catch (error) { + logger.error(`Error formatting token amount: ${error}`); + return 0; + } +}; diff --git a/src/connectors/sundaeswap/sundaeswap.config.ts b/src/connectors/sundaeswap/sundaeswap.config.ts new file mode 100644 index 0000000000..f0e2633499 --- /dev/null +++ b/src/connectors/sundaeswap/sundaeswap.config.ts @@ -0,0 +1,62 @@ +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']; + + 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/templates/chains/cardano.yml b/src/templates/chains/cardano.yml new file mode 100644 index 0000000000..a80f81331c --- /dev/null +++ b/src/templates/chains/cardano.yml @@ -0,0 +1,20 @@ +networks: + mainnet: + tokenListType: "FILE" + tokenListSource: "/home/gateway/conf/lists/cardano_mainnet_tokens.json" + nativeCurrencySymbol: 'ADA' + apiurl: 'https://cardano-mainnet.blockfrost.io/api/v0' + projectId: 'mainnetkCD2MvERTpHuh2oojUli0QtGp6zuJyrR' + preprod: + tokenListType: "FILE" + tokenListSource: "/home/gateway/conf/lists/cardano_preprod_tokens.json" + nativeCurrencySymbol: 'ADA' + apiurl: 'https://cardano-preprod.blockfrost.io/api/v0' + projectId: 'preprodN1EZYj11zL89jJeaAjeRybxYMLp7grmn' + preview: + tokenListType: "FILE" + tokenListSource: "/home/gateway/conf/lists/cardano_preview_tokens.json" + nativeCurrencySymbol: 'ADA' + apiurl: 'https://cardano-preview.blockfrost.io/api/v0' + projectId: 'previewjsuJtAX0Fki1dAewDoWQ1xoHXXgVzg1w' + diff --git a/src/templates/connectors/cardano.yml b/src/templates/connectors/cardano.yml deleted file mode 100644 index d5dc07e1ff..0000000000 --- a/src/templates/connectors/cardano.yml +++ /dev/null @@ -1,55 +0,0 @@ -# how much the execution price is allowed to move unfavorably from the trade execution price. It uses a rational number for precision. -allowedSlippage: '1/100' - -# For Cardano this will be used to connect to the network via blockfrost API -blockfrostProjectId: 'mainnetkCD2MvERTpHuh2oojUli0QtGp6zuJyrR' - -preprodBlockfrostProjectId: 'preprodN1EZYj11zL89jJeaAjeRybxYMLp7grmn' - -previewBlockfrostProjectId: 'previewjsuJtAX0Fki1dAewDoWQ1xoHXXgVzg1w' - -# how long a trade is valid in seconds. -ttl: 300 - -minswapPoolId: - mainnet: - poolId : 6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2 - preprod: - poolId : 3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d - -sundaeswapPoolId: - preview: - poolId : '2baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3' - mainnet: - poolId : '2f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773' - -defaultAddress: testaddresstouse - - -# this is the blockfrost project id we need to connect to the Minswap DEX -#blockfrost-projectid: - -blockfrostApiUrls: - # Blockfrost API URLs for different Cardano networks - mainnet: - apiurl: 'https://cardano-mainnet.blockfrost.io/api/v0' - preprod: - apiurl: 'https://cardano-preprod.blockfrost.io/api/v0' - preview: - apiurl: 'https://cardano-preview.blockfrost.io/api/v0' - - -networks: - mainnet: - tokenListType: "FILE" - tokenListSource: "/home/gateway/conf/lists/cardano_mainnet_tokens.json" - nativeCurrencySymbol: 'ADA' - preprod: - tokenListType: "FILE" - tokenListSource: "/home/gateway/conf/lists/cardano_preprod_tokens.json" - nativeCurrencySymbol: 'ADA' - preview: - tokenListType: "FILE" - tokenListSource: "/home/gateway/conf/lists/cardano_preview_tokens.json" - nativeCurrencySymbol: 'ADA' - 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..9fe4a45a04 --- /dev/null +++ b/src/templates/connectors/sundaeswap.yml @@ -0,0 +1,19 @@ +# 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: '2baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3' + + # Cardano preprod pools + preprod: + # AMM pools for Cardano preprod + amm: + # Format: base-quote: pool_address + ADA-SBERRY: '2f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773' diff --git a/src/templates/namespace/cardano_mainnet_tokens.json b/src/templates/namespace/cardano_mainnet_tokens.json index dbb9621121..262c8c5be9 100644 --- a/src/templates/namespace/cardano_mainnet_tokens.json +++ b/src/templates/namespace/cardano_mainnet_tokens.json @@ -10,7 +10,8 @@ "decimals": 0, "name": "Minswap Token", "symbol": "MIN", - "logoURI": "https://ibb.co/L1Tp0rQ" + "logoURI": "https://ibb.co/L1Tp0rQ", + "address": "29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6.4d494e" }, { "policyId": "9a9693a9a37912a5097918f97918d15240c92ab729a0b7c4aa144d77", @@ -18,15 +19,17 @@ "decimals": 6, "name": "SUNDAE Token", "symbol": "SUNDAE", - "logoURI": "https://ibb.co/Q31Nv1TK" + "logoURI": "https://ibb.co/Q31Nv1TK", + "address": "9a9693a9a37912a5097918f97918d15240c92ab729a0b7c4aa144d77.53554e444145" }, { - "policyId": "ada", - "assetName": "lovelace", + "policyId": "", + "assetName": "", "decimals": 6, "name": "Cardano Native Token", "symbol": "ADA", - "logoURI": "https://ibb.co/N1Jmswk" + "logoURI": "https://ibb.co/N1Jmswk", + "address": "ada.lovelace" }, { "policyId": "e0302560ced2fdcbfcb2602697df970cd0d6a38f94b32703f51c312b", @@ -34,7 +37,17 @@ "decimals": 0, "name": "SundaeSwap LP Token", "symbol": "LP-SUNDAE", - "logoURI": "" + "logoURI": "", + "address": "e0302560ced2fdcbfcb2602697df970cd0d6a38f94b32703f51c312b.0014df102f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773" + }, + { + "policyId": "f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c", + "assetName": "82e2b1fd27a7712a1a9cf750dfbea1a5778611b20e06dd6a611df7a643f8cb75", + "decimals": 0, + "name": "Minswap LP Token", + "symbol": "LP-MIN", + "logoURI": "", + "address": "addr1z84q0denmyep98ph3tmzwsmw0j7zau9ljmsqx6a4rvaau66j2c79gy9l76sdg0xwhd7r0c0kna0tycz4y5s6mlenh8pq777e2a.0014df102f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773" } ] } diff --git a/src/templates/namespace/cardano_preprod_tokens.json b/src/templates/namespace/cardano_preprod_tokens.json index 0db7396bdb..1964df10e0 100644 --- a/src/templates/namespace/cardano_preprod_tokens.json +++ b/src/templates/namespace/cardano_preprod_tokens.json @@ -10,15 +10,17 @@ "decimals": 0, "name": "Minswap Token", "symbol": "MIN", - "logoURI": "https://ibb.co/L1Tp0rQ" + "logoURI": "https://ibb.co/L1Tp0rQ", + "address": "e16c2dc8ae937e8d3790c7fd7168d7b994621ba14ca11415f39fed72.4d494e" }, { - "policyId": "ada", - "assetName": "lovelace", + "policyId": "", + "assetName": "", "decimals": 6, "name": "Cardano Native Token", "symbol": "ADA", - "logoURI": "https://ibb.co/N1Jmswk" + "logoURI": "https://ibb.co/N1Jmswk", + "address": "ada.lovelace" }, { "policyId": "e4214b7cce62ac6fbba385d164df48e157eae5863521b4b67ca71d86", @@ -26,7 +28,17 @@ "decimals": 0, "name": "Minswap Liquidity pool token", "symbol": "LP", - "logoURI": "https://ibb.co/L1Tp0rQ" + "logoURI": "https://ibb.co/L1Tp0rQ", + "address": "e4214b7cce62ac6fbba385d164df48e157eae5863521b4b67ca71d86.3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d" + }, + { + "policyId": "d4fece6b39f7cd78a3f036b2ae6508c13524b863922da80f68dd9ab7", + "assetName": "5553444d", + "decimals": 6, + "name": "USDM", + "symbol": "USDM", + "logoURI": "", + "address": "d4fece6b39f7cd78a3f036b2ae6508c13524b863922da80f68dd9ab7.5553444d" } ] } diff --git a/src/templates/namespace/cardano_preview_tokens.json b/src/templates/namespace/cardano_preview_tokens.json index e1ed975e08..647f83f783 100644 --- a/src/templates/namespace/cardano_preview_tokens.json +++ b/src/templates/namespace/cardano_preview_tokens.json @@ -10,15 +10,17 @@ "decimals": 0, "name": "SBERRY Token", "symbol": "SBERRY", - "logoURI": "https://ibb.co/hJbVKRJW" + "logoURI": "https://ibb.co/hJbVKRJW", + "address": "99b071ce8580d6a3a11b4902145adb8bfd0d2a03935af8cf66403e15.534245525259" }, { - "policyId": "ada", - "assetName": "lovelace", + "policyId": "", + "assetName": "", "decimals": 6, "name": "Cardano Native Token", "symbol": "ADA", - "logoURI": "https://ibb.co/N1Jmswk" + "logoURI": "https://ibb.co/N1Jmswk", + "address": "ada.lovelace" }, { "policyId": "44a1eb2d9f58add4eb1932bd0048e6a1947e85e3fe4f32956a110414", @@ -26,7 +28,8 @@ "decimals": 0, "name": "Sundaeswap Liquidity pool token", "symbol": "LP", - "logoURI": "hhttps://ibb.co/JWr1GWs3" + "logoURI": "hhttps://ibb.co/JWr1GWs3", + "address": "44a1eb2d9f58add4eb1932bd0048e6a1947e85e3fe4f32956a110414.0014df102baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3" } ] } diff --git a/src/templates/root.yml b/src/templates/root.yml index 4eed87e260..869338a82e 100644 --- a/src/templates/root.yml +++ b/src/templates/root.yml @@ -64,6 +64,10 @@ configurations: configurationPath: connectors/uniswap.yml schemaPath: uniswap-schema.json + $namespace solana: + configurationPath: solana.yml + schemaPath: solana-schema.json + $namespace jupiter: configurationPath: connectors/jupiter.yml schemaPath: jupiter-schema.json @@ -94,5 +98,13 @@ configurations: schemaPath: infura-schema.json $namespace cardano: - configurationPath: connectors/cardano.yml - schemaPath: cardano-schema.json \ No newline at end of file + configurationPath: chains/cardano.yml + schemaPath: cardano-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/test/services/data/config-manager-v2/test1/namespace/cardano-schema.json b/test/services/data/config-manager-v2/test1/namespace/cardano-schema.json index 1a9de95b42..5567f077e4 100644 --- a/test/services/data/config-manager-v2/test1/namespace/cardano-schema.json +++ b/test/services/data/config-manager-v2/test1/namespace/cardano-schema.json @@ -2,116 +2,30 @@ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { - "allowedSlippage": { "type": "string" }, - "blockfrostProjectId": { "type": "string" }, - "nativeCurrencySymbol": { "type": "string" }, - "preprodBlockfrostProjectId": { "type": "string" }, - "previewBlockfrostProjectId": { "type": "string" }, - "minswapPoolId": { - "type": "object", - "patternProperties": { - "^\\w+$": { - "type": "object", - "properties": { - "poolId": { "type": "string" } - }, - "required": ["poolId"], - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "sundaeswapPoolId": { - "type": "object", - "patternProperties": { - "^\\w+$": { - "type": "object", - "properties": { - "poolId": { "type": "string" } - }, - "required": ["poolId"], - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "defaultAddress": { "type": "string" }, - "ttl": { "type": "integer" }, - "blockfrostApiUrls": { + "networks": { "type": "object", "patternProperties": { "^\\w+$": { - "type": "object", - "properties": { - "apiurl": { "type": "string" } - }, - "required": ["apiurl"], - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "networks": { - "type": "object", - "properties": { - "mainnet": { - "type": "object", - "properties": { - "tokenListType": { "type": "string" }, - "tokenListSource": { "type": "string" }, - "nativeCurrencySymbol": { "type": "string" } - }, - "required": [ - "tokenListType", - "tokenListSource", - "nativeCurrencySymbol" - ], - "additionalProperties": false - }, - "preprod": { - "type": "object", - "properties": { - "tokenListType": { "type": "string" }, - "tokenListSource": { "type": "string" }, - "nativeCurrencySymbol": { "type": "string" } - }, - "required": [ - "tokenListType", - "tokenListSource", - "nativeCurrencySymbol" - ], - "additionalProperties": false - }, - "preview": { "type": "object", "properties": { "tokenListType": { "type": "string" }, "tokenListSource": { "type": "string" }, - "nativeCurrencySymbol": { "type": "string" } + "nativeCurrencySymbol": { "type": "string" }, + "apiurl": { "type": "string" }, + "projectId": { "type": "string" } }, "required": [ "tokenListType", "tokenListSource", - "nativeCurrencySymbol" + "nativeCurrencySymbol", + "apiurl", + "projectId" ], "additionalProperties": false } }, - "required": ["mainnet", "preprod", "preview"], "additionalProperties": false } }, - "additionalProperties": false, - "required": [ - "allowedSlippage", - "blockfrostProjectId", - "preprodBlockfrostProjectId", - "previewBlockfrostProjectId", - "ttl", - "minswapPoolId", - "sundaeswapPoolId", - "defaultAddress", - "blockfrostApiUrls", - "networks" - ] + "additionalProperties": false } diff --git a/test/services/data/config-manager-v2/test1/namespace/minswap-schema.json b/test/services/data/config-manager-v2/test1/namespace/minswap-schema.json new file mode 100644 index 0000000000..477ddc589d --- /dev/null +++ b/test/services/data/config-manager-v2/test1/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/test/services/data/config-manager-v2/test1/namespace/sundaeswap-schema.json b/test/services/data/config-manager-v2/test1/namespace/sundaeswap-schema.json new file mode 100644 index 0000000000..477ddc589d --- /dev/null +++ b/test/services/data/config-manager-v2/test1/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"] +} From 152ab1902697d19e1b3a20413a1b75ee15ae31bf Mon Sep 17 00:00:00 2001 From: Aiquant1 Date: Tue, 1 Jul 2025 11:39:11 +0530 Subject: [PATCH 03/12] Written swap route for minswap along with utility functions --- package.json | 1 + pnpm-lock.yaml | 3 + src/app.ts | 4 + src/chains/cardano/cardano.ts | 32 +- .../minswap/amm-routes/executeSwap.ts | 198 ++++++++++++ .../minswap/amm-routes/quoteLiquidity.ts | 253 +++++++++++++++ .../minswap/amm-routes/quoteSwap.ts | 288 +++++++----------- src/connectors/minswap/minswap.routes.ts | 6 +- src/connectors/minswap/minswap.ts | 2 +- .../namespace/cardano_mainnet_tokens.json | 2 +- 10 files changed, 611 insertions(+), 178 deletions(-) create mode 100644 src/connectors/minswap/amm-routes/executeSwap.ts create mode 100644 src/connectors/minswap/amm-routes/quoteLiquidity.ts diff --git a/package.json b/package.json index b3762629ac..69b2e5cfdf 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "prepare": "pnpm husky" }, "dependencies": { + "@aiquant/lucid-cardano": "^0.10.10", "@aiquant/minswap-sdk": "^0.0.0", "@blockfrost/blockfrost-js": "^5.7.0", "@coral-xyz/anchor": "^0.29.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2c6b3dfb5e..4ff1bdf0cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,6 +19,9 @@ importers: .: dependencies: + '@aiquant/lucid-cardano': + specifier: ^0.10.10 + 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) diff --git a/src/app.ts b/src/app.ts index 7015a5cf25..2af1db26b9 100644 --- a/src/app.ts +++ b/src/app.ts @@ -98,6 +98,10 @@ const swaggerOptions = { description: 'Uniswap connector endpoints', }, { name: '/connector/0x', description: '0x connector endpoints' }, + { + name: 'minswap/amm', + description: 'Minswap pool connector (Cardano)', + }, ], components: { parameters: { diff --git a/src/chains/cardano/cardano.ts b/src/chains/cardano/cardano.ts index e95d54a49e..5e64e07aec 100644 --- a/src/chains/cardano/cardano.ts +++ b/src/chains/cardano/cardano.ts @@ -1,5 +1,5 @@ import { Config, getCardanoConfig } from './cardano.config'; -import { Lucid, Blockfrost, C } from '@vespr-wallet/lucid-cardano'; +import { Lucid, Blockfrost, C, UTxO } from '@aiquant/lucid-cardano'; import { TokenListType, TokenValue } from '../../services/base'; import { ConfigManagerCertPassphrase } from '../../services/config-manager-cert-passphrase'; import { walletPath } from '../../wallet/utils'; @@ -441,6 +441,36 @@ export class Cardano { } } + /** + * 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 diff --git a/src/connectors/minswap/amm-routes/executeSwap.ts b/src/connectors/minswap/amm-routes/executeSwap.ts new file mode 100644 index 0000000000..d01059a52e --- /dev/null +++ b/src/connectors/minswap/amm-routes/executeSwap.ts @@ -0,0 +1,198 @@ +import { FastifyPluginAsync } from 'fastify'; +import { + ExecuteSwapRequestType, + ExecuteSwapRequest, + ExecuteSwapResponseType, + ExecuteSwapResponse, +} from '../../../schemas/swap-schema'; +import { logger } from '../../../services/logger'; +import { Minswap } from '../minswap'; +import { + ADA, + Asset, + Dex, + calculateSwapExactIn, + calculateSwapExactOut, +} from '@aiquant/minswap-sdk'; +import { formatTokenAmount } from '../minswap.utils'; +import { Blockfrost, Lucid, TxComplete } from '@aiquant/lucid-cardano'; + +export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { + await fastify.register(require('@fastify/sensible')); + + fastify.post<{ + Body: ExecuteSwapRequestType; + Reply: ExecuteSwapResponseType; + }>( + '/execute-swap', + { + schema: { + description: 'Execute a swap on Minswap AMM (Cardano)', + tags: ['minswap/amm'], + body: { + ...ExecuteSwapRequest, + properties: { + ...ExecuteSwapRequest.properties, + network: { type: 'string', default: 'mainnet' }, + walletAddress: { type: 'string' }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['MIN'] }, + amount: { type: 'number', examples: [1.5] }, // now always quote + side: { type: 'string', enum: ['BUY', 'SELL'] }, + poolAddress: { type: 'string' }, + slippagePct: { type: 'number', examples: [1] }, + }, + }, + response: { 200: ExecuteSwapResponse }, + }, + }, + async (request) => { + try { + const { + network, + walletAddress: reqAddr, + baseToken, + quoteToken, + amount, // this is always quote quantity + side, + slippagePct = 1, + poolAddress: reqPool, + } = 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 = + reqPool || + (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, + }; + + // On‑chain reserves + const poolState = await minswap.blockfrostAdapter.getV2PoolByPair( + assetA, + assetB, + ); + if (!poolState) { + throw fastify.httpErrors.notFound('Pool state unavailable'); + } + const baseReserve = poolState.reserveA; + const quoteReserve = poolState.reserveB; + + // 1) interpret `amount` as quoteUnits + const amountIn = BigInt( + Math.floor(amount * 10 ** quoteInfo.decimals).toString(), + ); + const pct = BigInt(slippagePct); + + // 2) build via SDK + const privateKey = + await minswap.cardano.getWalletFromAddress(walletAddr); + minswap.cardano.lucidInstance.selectWalletFromPrivateKey(privateKey); + const dex = new Dex(minswap.cardano.lucidInstance); + + let txBuild: TxComplete; + let rawOut: bigint; + + if (side === 'SELL') { + // SELL quote → receive base (exact‑in) + const { amountOut: idealBaseOut } = calculateSwapExactIn({ + amountIn, + reserveIn: quoteReserve, + reserveOut: baseReserve, + }); + const minBaseOut = (idealBaseOut * (100n - pct)) / 100n; + rawOut = minBaseOut; + txBuild = await dex.buildSwapExactInTx({ + sender: walletAddr, + availableUtxos: + await minswap.cardano.lucidInstance.utxosAt(walletAddr), + assetIn: quoteToken === 'ADA' ? ADA : assetB, + amountIn, + assetOut: baseToken === 'ADA' ? ADA : assetA, + minimumAmountOut: minBaseOut, + isLimitOrder: false, + }); + } else { + // BUY quote → means you want exactly `amountIn` quote out, spending base (exact‑out) + const exactQuoteOut = amountIn; + rawOut = exactQuoteOut; + const { amountIn: idealBaseIn } = calculateSwapExactOut({ + exactAmountOut: exactQuoteOut, + reserveIn: baseReserve, + reserveOut: quoteReserve, + }); + + const maxBaseIn = (idealBaseIn * (100n + pct)) / 100n; + + txBuild = await dex.buildSwapExactOutTx({ + sender: walletAddr, + availableUtxos: + await minswap.cardano.lucidInstance.utxosAt(walletAddr), + assetIn: baseToken === 'ADA' ? ADA : assetA, + maximumAmountIn: maxBaseIn, + assetOut: quoteToken === 'ADA' ? ADA : assetB, + expectedAmountOut: exactQuoteOut, + }); + } + + // 3) sign & submit + const signed = await txBuild.sign().complete(); + + const txHash = await signed.submit(); + + return { + signature: txHash, + totalInputSwapped: amount, // quote in + totalOutputSwapped: Number( + formatTokenAmount( + rawOut.toString(), + side === 'SELL' ? baseInfo.decimals : quoteInfo.decimals, + ), + ), + fee: txBuild.fee, + // for SELL: base balance goes +, quote goes − + // for BUY: quote goes +, base goes − + baseTokenBalanceChange: + side === 'SELL' + ? +formatTokenAmount(rawOut.toString(), baseInfo.decimals) + : -Number(amount), + quoteTokenBalanceChange: + side === 'SELL' + ? -Number(amount) + : +formatTokenAmount(rawOut.toString(), quoteInfo.decimals), + }; + } 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/quoteLiquidity.ts b/src/connectors/minswap/amm-routes/quoteLiquidity.ts new file mode 100644 index 0000000000..303628d3d6 --- /dev/null +++ b/src/connectors/minswap/amm-routes/quoteLiquidity.ts @@ -0,0 +1,253 @@ +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync } from 'fastify'; +import { Cardano } from '../../../chains/cardano/cardano'; +import { + QuoteLiquidityRequestType, + QuoteLiquidityRequest, + QuoteLiquidityResponseType, + QuoteLiquidityResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Minswap } from '../minswap'; +import { Asset, DexV2Constant } from '@aiquant/minswap-sdk'; // ← pull in Asset helper + constants +import { formatTokenAmount } from '../minswap.utils'; + +export async function getMinswapAmmLiquidityQuote( + network: string, + poolAddress?: string, + baseToken?: string, + quoteToken?: string, + baseTokenAmount?: number, + quoteTokenAmount?: number, + _slippagePct?: number, +): Promise<{ + baseLimited: boolean; + baseTokenAmount: number; + quoteTokenAmount: number; + baseTokenAmountMax: number; + quoteTokenAmountMax: number; + baseTokenObj: any; + quoteTokenObj: any; + 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); + const cardano = await Cardano.getInstance(networkToUse); + + const baseTokenObj = cardano.getTokenBySymbol(baseToken); + const quoteTokenObj = cardano.getTokenBySymbol(quoteToken); + if (!baseTokenObj || !quoteTokenObj) { + throw new Error( + `Token not found: ${!baseTokenObj ? baseToken : quoteToken}`, + ); + } + + let poolId = poolAddress; + let existingPool = true; + if (!poolId) { + poolId = await minswap.findDefaultPool(baseToken, quoteToken, 'amm'); + if (!poolId) { + 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) { + // ── 1) Load the on‐chain pool state ───────────────────── + // For a V2 (Constant Product) pool, use the Cardano SDK's V2 "getPoolByPair" + const a = Asset.fromString(baseTokenObj.policyId + baseTokenObj.assetName); + const b = Asset.fromString( + quoteTokenObj.policyId + quoteTokenObj.assetName, + ); + const poolState = await minswap.blockfrostAdapter.getV2PoolByPair(a, b); + if (!poolState) { + throw new Error(`Unable to load pool ${poolId}`); + } + + // ── 2) Pull reserves as bigints ──────────────────────── + const baseReserve: bigint = poolState.reserveA; + const quoteReserve: bigint = poolState.reserveB; + + // ── 3) Convert user inputs into raw bigints ─────────── + const baseRaw = baseTokenAmount + ? BigInt( + Math.floor(baseTokenAmount * 10 ** baseTokenObj.decimals).toString(), + ) + : null; + const quoteRaw = quoteTokenAmount + ? BigInt( + Math.floor( + quoteTokenAmount * 10 ** quoteTokenObj.decimals, + ).toString(), + ) + : null; + + // ── 4) 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(), quoteTokenObj.decimals), + ); + } else { + baseLimited = false; + const baseOptimal = (quoteRaw * baseReserve) / quoteReserve; + baseTokenAmountOptimal = Number( + formatTokenAmount(baseOptimal.toString(), baseTokenObj.decimals), + ); + } + } else if (baseRaw !== null) { + // only base provided + const quoteOptimal = + baseReserve === BigInt(0) + ? BigInt(0) + : (baseRaw * quoteReserve) / baseReserve; + quoteTokenAmountOptimal = Number( + formatTokenAmount(quoteOptimal.toString(), quoteTokenObj.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(), baseTokenObj.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 + } + + // ── 5) Convert back into Ethers BigNumber for any on‐chain tx ─── + const rawBaseTokenAmount = BigNumber.from( + Math.floor(baseTokenAmountOptimal * 10 ** baseTokenObj.decimals).toString(), + ); + const rawQuoteTokenAmount = BigNumber.from( + Math.floor( + quoteTokenAmountOptimal * 10 ** quoteTokenObj.decimals, + ).toString(), + ); + + // ── 6) (Optional) pull router address if you later build txs ───── + const routerAddress = + DexV2Constant.CONFIG[networkToUse === 'mainnet' ? 1 : 0] + .poolCreationAddress; + + return { + baseLimited, + baseTokenAmount: baseTokenAmountOptimal, + quoteTokenAmount: quoteTokenAmountOptimal, + baseTokenAmountMax: baseTokenAmount ?? baseTokenAmountOptimal, + quoteTokenAmountMax: quoteTokenAmount ?? quoteTokenAmountOptimal, + baseTokenObj, + quoteTokenObj, + poolAddress: poolId, + rawBaseTokenAmount, + rawQuoteTokenAmount, + routerAddress, + }; +} + +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: ['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, + baseToken, + quoteToken, + baseTokenAmount, + quoteTokenAmount, + slippagePct, + } = request.query; + + 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 index 2d097da3e7..30ce571499 100644 --- a/src/connectors/minswap/amm-routes/quoteSwap.ts +++ b/src/connectors/minswap/amm-routes/quoteSwap.ts @@ -21,186 +21,128 @@ async function quoteAmmSwap( poolAddress: string, baseToken: CardanoTokenInfo, quoteToken: CardanoTokenInfo, - amount: number, + amount: number, // now always refers to quote‐token units side: 'BUY' | 'SELL', ): Promise { - try { - // Get the V2 pair - const assetA: Asset = { - policyId: baseToken.policyId, - tokenName: baseToken.assetName, - }; - - const assetB: Asset = { - policyId: quoteToken.policyId, - tokenName: quoteToken.assetName, - }; - - const pool = await minswap.blockfrostAdapter.getV2PoolByPair( - assetA, - assetB, - ); - - if (!pool) { - throw new Error( - `Pool not found for ${baseToken.symbol}-${quoteToken.symbol}`, - ); - } - - // Form full asset IDs for comparison - // if base token is ADA then take baseTokenAsset as lovelace - let baseTokenAsset: string; - if (baseToken.symbol === 'ADA') { - baseTokenAsset = 'lovelace'; - } else { - baseTokenAsset = baseToken.policyId + baseToken.assetName; - } - const quoteTokenAsset = quoteToken.policyId + quoteToken.assetName; - - // Determine which token is being traded - const exactIn = side === 'SELL'; - const inputToken = exactIn ? baseToken : quoteToken; - const outputToken = exactIn ? quoteToken : baseToken; - - // Convert amount to baseToken's smallest unit (since amount always refers to baseToken) - const amountInSmallestUnit = BigNumber.from( - Math.floor(amount * Math.pow(10, baseToken.decimals)), - ).toBigInt(); - - // Determine reserves and fee based on trading direction - let reserveIn: bigint; - let reserveOut: bigint; - let tradingFeeNumerator: bigint; - - if (exactIn) { - // Selling baseToken (inputToken = baseToken) - console.log(pool); - - console.log( - 'pool.assetA' + pool.assetA, - 'baseTokenAsset' + baseTokenAsset, - ); - - if (baseTokenAsset === pool.assetA) { - reserveIn = pool.reserveA; - reserveOut = pool.reserveB; - tradingFeeNumerator = pool.feeA[0]; // Fee for A->B - } else if (baseTokenAsset === pool.assetB) { - reserveIn = pool.reserveB; - reserveOut = pool.reserveA; - tradingFeeNumerator = pool.feeA[1]; // Fee for B->A - } else { - throw new Error('Base token not found in pool'); - } - } else { - // Buying baseToken (inputToken = quoteToken) - if (quoteTokenAsset === pool.assetA) { - reserveIn = pool.reserveA; - reserveOut = pool.reserveB; - tradingFeeNumerator = pool.feeA[0]; // Fee for A->B - } else if (quoteTokenAsset === pool.assetB) { - reserveIn = pool.reserveB; - reserveOut = pool.reserveA; - tradingFeeNumerator = pool.feeA[1]; // Fee for B->A - } else { - throw new Error('Quote token not found in pool'); - } - } - - // Perform calculations - let inputAmount: bigint; - let outputAmount: bigint; - let priceImpact: number; - - if (exactIn) { - inputAmount = amountInSmallestUnit; - const result = calculateSwapExactIn({ - amountIn: inputAmount, - reserveIn, - reserveOut, - }); - outputAmount = result.amountOut; - priceImpact = result.priceImpact.toNumber(); - } else { - outputAmount = amountInSmallestUnit; - const result = calculateSwapExactOut({ - exactAmountOut: outputAmount, - reserveIn, - reserveOut, - }); - inputAmount = result.amountIn; - priceImpact = result.priceImpact.toNumber(); - } - - // Calculate slippage amounts (using 0.5% default slippage) - const slippagePercent = 0.5; - const slippageFactor = BigInt(Math.floor((100 - slippagePercent) * 100)); - const slippageDenominator = 10000n; - - const minAmountOut = exactIn - ? (outputAmount * slippageFactor) / slippageDenominator - : outputAmount; - - const maxAmountIn = exactIn - ? inputAmount - : (inputAmount * BigInt(10000 + Math.floor(slippagePercent * 100))) / - slippageDenominator; - - // Format amounts for display - const estimatedAmountIn = formatTokenAmount( - inputAmount.toString(), - inputToken.decimals, + // BUY: you want to RECEIVE `amount` of quoteToken, paying baseToken + // SELL: you want to SPEND `amount` of quoteToken, receiving baseToken + const exactIn = side === 'SELL'; + + // Figure out which asset is input vs. output + const inputToken = exactIn ? quoteToken : baseToken; + const outputToken = exactIn ? baseToken : quoteToken; + + // Convert `amount` to smallest‐unit of the input token + const amountInSmallestUnit = BigNumber.from( + Math.floor(amount * 10 ** inputToken.decimals), + ).toBigInt(); + + // Fetch the pool + const assetA: Asset = { + policyId: baseToken.policyId, + tokenName: baseToken.assetName, + }; + const assetB: Asset = { + policyId: quoteToken.policyId, + tokenName: quoteToken.assetName, + }; + const pool = await minswap.blockfrostAdapter.getV2PoolByPair(assetA, assetB); + if (!pool) + throw new Error( + `Pool not found for ${baseToken.symbol}-${quoteToken.symbol}`, ); - const estimatedAmountOut = formatTokenAmount( - outputAmount.toString(), - outputToken.decimals, - ); + // Figure out reserves & fee depending on input/output + const idA = pool.assetA; + const idB = pool.assetB; + const assetIdIn = + inputToken.symbol === 'ADA' + ? 'lovelace' + : inputToken.policyId + inputToken.assetName; + let reserveIn: bigint, reserveOut: bigint, feeNum: bigint; + if (assetIdIn === idA) { + reserveIn = pool.reserveA; + reserveOut = pool.reserveB; + feeNum = pool.feeA[0]; + } else if (assetIdIn === idB) { + reserveIn = pool.reserveB; + reserveOut = pool.reserveA; + feeNum = pool.feeA[1]; + } else { + throw new Error(`Input token not in pool`); + } - const minAmountOutValue = formatTokenAmount( - minAmountOut.toString(), - outputToken.decimals, - ); + // Do the math + let inputAmount: bigint, outputAmount: bigint, priceImpact: number; + if (exactIn) { + inputAmount = amountInSmallestUnit; + const { amountOut, priceImpact: pi } = calculateSwapExactIn({ + amountIn: inputAmount, + reserveIn, + reserveOut, + }); + outputAmount = amountOut; + priceImpact = pi.toNumber(); + } else { + outputAmount = amountInSmallestUnit; // you want exactly this many quote + const { amountIn, priceImpact: pi } = calculateSwapExactOut({ + exactAmountOut: outputAmount, + reserveIn, + reserveOut, + }); + inputAmount = amountIn; + priceImpact = pi.toNumber(); + } - const maxAmountInValue = formatTokenAmount( - maxAmountIn.toString(), - inputToken.decimals, - ); + // Slippage + const slippagePct = 0.5; + const slipFactorNum = BigInt(Math.floor((100 - slippagePct) * 100)); // e.g. 99.5%→9950 + const slipDenominator = 10000n; + const minAmountOut = exactIn + ? (outputAmount * slipFactorNum) / slipDenominator + : outputAmount; + const maxAmountIn = exactIn + ? inputAmount + : (inputAmount * + (slipDenominator + BigInt(Math.round(slippagePct * 100)))) / + slipDenominator; + + // Format human‐readable + const estimatedIn = formatTokenAmount( + inputAmount.toString(), + inputToken.decimals, + ); + const estimatedOut = formatTokenAmount( + outputAmount.toString(), + outputToken.decimals, + ); + const minOutHuman = formatTokenAmount( + minAmountOut.toString(), + outputToken.decimals, + ); + const maxInHuman = formatTokenAmount( + maxAmountIn.toString(), + inputToken.decimals, + ); - return { - poolAddress, - estimatedAmountIn, - estimatedAmountOut, - minAmountOut: minAmountOutValue, - maxAmountIn: maxAmountInValue, - priceImpact, - inputToken, - outputToken, - // Add raw values for execution - rawAmountIn: inputAmount.toString(), - rawAmountOut: outputAmount.toString(), - rawMinAmountOut: minAmountOut.toString(), - rawMaxAmountIn: maxAmountIn.toString(), - pathAddresses: [ - inputToken.address || `${inputToken.policyId}.${inputToken.assetName}`, - outputToken.address || - `${outputToken.policyId}.${outputToken.assetName}`, - ], - }; - } catch (error) { - logger.error(`Error quoting AMM swap: ${error.message}`); - // Check for insufficient reserves error - if ( - error.message?.includes('INSUFFICIENT_RESERVES') || - error.message?.includes('insufficient') || - error.name === 'InsufficientReservesError' - ) { - throw new Error( - `Insufficient liquidity in pool for ${baseToken.symbol}-${quoteToken.symbol}`, - ); - } - throw error; - } + return { + poolAddress, + estimatedAmountIn: estimatedIn, + estimatedAmountOut: estimatedOut, + minAmountOut: minOutHuman, + maxAmountIn: maxInHuman, + priceImpact, + inputToken, + outputToken, + rawAmountIn: inputAmount.toString(), + rawAmountOut: outputAmount.toString(), + rawMinAmountOut: minAmountOut.toString(), + rawMaxAmountIn: maxAmountIn.toString(), + pathAddresses: [ + inputToken.address || `${inputToken.policyId}.${inputToken.assetName}`, + outputToken.address || `${outputToken.policyId}.${outputToken.assetName}`, + ], + }; } export async function getMinswapAmmQuote( diff --git a/src/connectors/minswap/minswap.routes.ts b/src/connectors/minswap/minswap.routes.ts index ca493450b3..a0ef872f06 100644 --- a/src/connectors/minswap/minswap.routes.ts +++ b/src/connectors/minswap/minswap.routes.ts @@ -2,6 +2,8 @@ import sensible from '@fastify/sensible'; import type { FastifyPluginAsync } from 'fastify'; import { ammPoolInfoRoute } from './amm-routes/poolInfo'; import { quoteSwapRoute as ammQuoteSwapRoute } from './amm-routes/quoteSwap'; +import quoteLiquidityRoute from './amm-routes/quoteLiquidity'; +import { executeSwapRoute as ammExecuteSwapRoute } from './amm-routes/executeSwap'; // AMM routes including swap endpoints const minswapAmmRoutes: FastifyPluginAsync = async (fastify) => { @@ -16,8 +18,8 @@ const minswapAmmRoutes: FastifyPluginAsync = async (fastify) => { await instance.register(ammPoolInfoRoute); await instance.register(ammQuoteSwapRoute); - // await instance.register(quoteLiquidityRoute); - // await instance.register(ammExecuteSwapRoute); + await instance.register(quoteLiquidityRoute); + await instance.register(ammExecuteSwapRoute); // await instance.register(ammAddLiquidityRoute); // await instance.register(ammRemoveLiquidityRoute); }); diff --git a/src/connectors/minswap/minswap.ts b/src/connectors/minswap/minswap.ts index 7c2eb38e3a..068cd7b4a7 100644 --- a/src/connectors/minswap/minswap.ts +++ b/src/connectors/minswap/minswap.ts @@ -1,5 +1,5 @@ import { Cardano } from '../../chains/cardano/cardano'; -import { Data, PrivateKey } from '@vespr-wallet/lucid-cardano'; +import { Data, PrivateKey } from '@aiquant/lucid-cardano'; import { BlockFrostAPI } from '@blockfrost/blockfrost-js'; import { BlockfrostAdapter, NetworkId } from '@aiquant/minswap-sdk'; diff --git a/src/templates/namespace/cardano_mainnet_tokens.json b/src/templates/namespace/cardano_mainnet_tokens.json index 262c8c5be9..01457bbabf 100644 --- a/src/templates/namespace/cardano_mainnet_tokens.json +++ b/src/templates/namespace/cardano_mainnet_tokens.json @@ -7,7 +7,7 @@ { "policyId": "29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6", "assetName": "4d494e", - "decimals": 0, + "decimals": 6, "name": "Minswap Token", "symbol": "MIN", "logoURI": "https://ibb.co/L1Tp0rQ", From 0847cc4ed86581d718810e4e0261ee3720b6d500 Mon Sep 17 00:00:00 2001 From: Aiquant1 Date: Wed, 2 Jul 2025 16:45:44 +0530 Subject: [PATCH 04/12] Written routes to executeSwap, AddLiquidity and removeLiquidity --- package.json | 2 +- pnpm-lock.yaml | 2 +- .../minswap/amm-routes/addLiquidity.ts | 201 ++++++++++++++++++ .../minswap/amm-routes/quoteLiquidity.ts | 22 +- .../minswap/amm-routes/removeLiquidity.ts | 198 +++++++++++++++++ src/connectors/minswap/minswap.routes.ts | 6 +- src/connectors/minswap/minswap.ts | 75 ++++++- src/connectors/minswap/minswap.utils.ts | 14 +- 8 files changed, 498 insertions(+), 22 deletions(-) create mode 100644 src/connectors/minswap/amm-routes/addLiquidity.ts create mode 100644 src/connectors/minswap/amm-routes/removeLiquidity.ts diff --git a/package.json b/package.json index 69b2e5cfdf..e3d5a758e6 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "prepare": "pnpm husky" }, "dependencies": { - "@aiquant/lucid-cardano": "^0.10.10", + "@aiquant/lucid-cardano": "^0.10.11", "@aiquant/minswap-sdk": "^0.0.0", "@blockfrost/blockfrost-js": "^5.7.0", "@coral-xyz/anchor": "^0.29.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4ff1bdf0cf..89620b2c86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,7 +20,7 @@ importers: .: dependencies: '@aiquant/lucid-cardano': - specifier: ^0.10.10 + 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 diff --git a/src/connectors/minswap/amm-routes/addLiquidity.ts b/src/connectors/minswap/amm-routes/addLiquidity.ts new file mode 100644 index 0000000000..9f3d3ae0d0 --- /dev/null +++ b/src/connectors/minswap/amm-routes/addLiquidity.ts @@ -0,0 +1,201 @@ +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync } from 'fastify'; + +import { + AddLiquidityRequestType, + AddLiquidityRequest, + AddLiquidityResponseType, + AddLiquidityResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Minswap } from '../minswap'; +import { formatTokenAmount } from '../minswap.utils'; +import { getMinswapAmmLiquidityQuote } from './quoteLiquidity'; +import { Assets, TxComplete } from '@aiquant/lucid-cardano'; +import { Asset, calculateDeposit, Dex } from '@aiquant/minswap-sdk'; + +async function addLiquidity( + fastify: any, + network: string, + walletAddress: string, + poolAddress: string, + baseToken: string, + quoteToken: string, + baseTokenAmount: number, + quoteTokenAmount: number, + slippagePct?: number, // decimal, e.g. 0.01 for 1% +): 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(); // returns decimal, e.g. 0.005 + + // 5) Fetch on-chain pool state for deposit calculation + const assetA: Asset = { + policyId: quote.baseTokenObj.policyId, + tokenName: quote.baseTokenObj.assetName, + }; + const assetB: Asset = { + policyId: quote.quoteTokenObj.policyId, + tokenName: quote.quoteTokenObj.assetName, + }; + const poolState = await minswap.blockfrostAdapter.getV2PoolByPair( + assetA, + assetB, + ); + if (!poolState) { + throw fastify.httpErrors.internalServerError('Pool state not found'); + } + const { reserveA, reserveB, totalLiquidity } = poolState; + + // 6) Compute necessary amounts and LP tokens + const baseRaw = quote.rawBaseTokenAmount.toBigInt(); + const quoteRaw = quote.rawQuoteTokenAmount.toBigInt(); + const { necessaryAmountA, necessaryAmountB, lpAmount } = calculateDeposit({ + depositedAmountA: baseRaw, + depositedAmountB: quoteRaw, + reserveA, + reserveB, + totalLiquidity, + }); + + // 7) Apply slippage to LP minimum + const minLP = + (lpAmount * BigInt(Math.floor((1 - slippage) * 1e6))) / BigInt(1e6); + + // 8) Build tx + 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, + 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: ['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, + baseToken, + quoteToken, + baseTokenAmount, + quoteTokenAmount, + slippagePct, + walletAddress: reqWallet, + } = request.body; + + if ( + !baseToken || + !quoteToken || + !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'); + } + + const poolAddr = + reqPool || + (await minswap.findDefaultPool(baseToken, quoteToken, 'amm')); + if (!poolAddr) { + throw fastify.httpErrors.notFound( + `Pool not found for ${baseToken}-${quoteToken}`, + ); + } + + return await addLiquidity( + fastify, + network || 'mainnet', + walletAddr, + poolAddr, + 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/quoteLiquidity.ts b/src/connectors/minswap/amm-routes/quoteLiquidity.ts index 303628d3d6..40b8eb1479 100644 --- a/src/connectors/minswap/amm-routes/quoteLiquidity.ts +++ b/src/connectors/minswap/amm-routes/quoteLiquidity.ts @@ -1,6 +1,6 @@ import { BigNumber } from 'ethers'; import { FastifyPluginAsync } from 'fastify'; -import { Cardano } from '../../../chains/cardano/cardano'; +import { Cardano, CardanoTokenInfo } from '../../../chains/cardano/cardano'; import { QuoteLiquidityRequestType, QuoteLiquidityRequest, @@ -26,8 +26,8 @@ export async function getMinswapAmmLiquidityQuote( quoteTokenAmount: number; baseTokenAmountMax: number; quoteTokenAmountMax: number; - baseTokenObj: any; - quoteTokenObj: any; + baseTokenObj: CardanoTokenInfo; + quoteTokenObj: CardanoTokenInfo; poolAddress?: string; rawBaseTokenAmount: BigNumber; rawQuoteTokenAmount: BigNumber; @@ -53,11 +53,15 @@ export async function getMinswapAmmLiquidityQuote( ); } - let poolId = poolAddress; + let poolAddressToUse = poolAddress; let existingPool = true; - if (!poolId) { - poolId = await minswap.findDefaultPool(baseToken, quoteToken, 'amm'); - if (!poolId) { + if (!poolAddressToUse) { + poolAddressToUse = await minswap.findDefaultPool( + baseToken, + quoteToken, + 'amm', + ); + if (!poolAddressToUse) { existingPool = false; logger.info( `No existing pool found for ${baseToken}-${quoteToken}, providing theoretical quote`, @@ -78,7 +82,7 @@ export async function getMinswapAmmLiquidityQuote( ); const poolState = await minswap.blockfrostAdapter.getV2PoolByPair(a, b); if (!poolState) { - throw new Error(`Unable to load pool ${poolId}`); + throw new Error(`Unable to load pool ${poolAddressToUse}`); } // ── 2) Pull reserves as bigints ──────────────────────── @@ -169,7 +173,7 @@ export async function getMinswapAmmLiquidityQuote( quoteTokenAmountMax: quoteTokenAmount ?? quoteTokenAmountOptimal, baseTokenObj, quoteTokenObj, - poolAddress: poolId, + poolAddress: poolAddressToUse, rawBaseTokenAmount, rawQuoteTokenAmount, routerAddress, diff --git a/src/connectors/minswap/amm-routes/removeLiquidity.ts b/src/connectors/minswap/amm-routes/removeLiquidity.ts new file mode 100644 index 0000000000..543a64c953 --- /dev/null +++ b/src/connectors/minswap/amm-routes/removeLiquidity.ts @@ -0,0 +1,198 @@ +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync } from 'fastify'; + +import { Cardano } from '../../../chains/cardano/cardano'; +import { + RemoveLiquidityRequestType, + RemoveLiquidityRequest, + RemoveLiquidityResponseType, + RemoveLiquidityResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Minswap } from '../minswap'; + +import { formatTokenAmount } from '../minswap.utils'; +import { Asset, calculateWithdraw, Dex } from '@aiquant/minswap-sdk'; + +export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { + fastify.post<{ + Body: RemoveLiquidityRequestType; + Reply: RemoveLiquidityResponseType; + }>( + '/remove-liquidity', + { + schema: { + description: 'Remove liquidity from a Minswap pool', + tags: ['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, + baseToken, + quoteToken, + percentageToRemove, + walletAddress: requestedWalletAddress, + } = request.body; + + const networkToUse = network || 'preprod'; + + // Validate essential parameters + if (!baseToken || !quoteToken || !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', + ); + } + + // Get Uniswap and Ethereum instances + const minswap = await Minswap.getInstance(networkToUse); + + // Get wallet address - either from request or first available + 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}`); + } + + // Resolve tokens + const baseTokenObj = minswap.cardano.getTokenBySymbol(baseToken); + const quoteTokenObj = minswap.cardano.getTokenBySymbol(quoteToken); + + if (!baseTokenObj || !quoteTokenObj) { + throw fastify.httpErrors.badRequest( + `Token not found: ${!baseTokenObj ? baseToken : quoteToken}`, + ); + } + + // Find pool address if not provided + let poolAddress = requestedPoolAddress; + if (!poolAddress) { + poolAddress = await minswap.findDefaultPool( + baseToken, + quoteToken, + 'amm', + ); + + if (!poolAddress) { + throw fastify.httpErrors.notFound( + `No AMM pool found for pair ${baseToken}-${quoteToken}`, + ); + } + } + // 5) Fetch on-chain pool state for withdraw calculation + const assetA: Asset = { + policyId: baseTokenObj.policyId, + tokenName: baseTokenObj.assetName, + }; + const assetB: Asset = { + policyId: quoteTokenObj.policyId, + tokenName: quoteTokenObj.assetName, + }; + const { poolState, poolDatum } = await minswap.getPoolData(poolAddress); + + // 6) Fetch wallet UTxOs (this also selects the key in Lucid) + const wallet = + await minswap.cardano.getWalletFromAddress(walletAddress); + minswap.cardano.lucidInstance.selectWalletFromPrivateKey(wallet); + const utxos = + await minswap.cardano.lucidInstance.utxosAt(walletAddress); + + console.log(utxos); + + // 8) Calculate withdrawal amounts + const totalLpInWallet = minswap.calculateAssetAmount( + utxos, + poolState.assetLP, + ); + console.log('totalLpInWallet', totalLpInWallet); + + const withdrawLpAmount = + (totalLpInWallet * BigInt(percentageToRemove)) / 100n; + + console.log('withdrawLpAmount', withdrawLpAmount); + + // 9) Calculate the assets to be received upon withdrawal + const { amountAReceive, amountBReceive } = calculateWithdraw({ + withdrawalLPAmount: withdrawLpAmount, + reserveA: poolState.reserveA, + reserveB: poolState.reserveB, + totalLiquidity: poolDatum.totalLiquidity, + }); + + const lpAsset = Asset.fromString(poolState.assetLP); + // minimums = 0 here; you could tighten via slippage + const dex = new Dex(minswap.cardano.lucidInstance); + const txBuild = await dex.buildWithdrawTx({ + sender: walletAddress, + lpAsset: lpAsset, + lpAmount: withdrawLpAmount, + minimumAssetAReceived: amountAReceive, + minimumAssetBReceived: amountBReceive, + availableUtxos: utxos, + }); + + // 9) Sign & submit + const signed = await txBuild.sign().complete(); + const txHash = await signed.submit(); + const fee = txBuild.fee; + + // 10) Compute how many tokens were removed (roughly) + const baseTokenAmountRemoved = formatTokenAmount( + amountAReceive, + baseTokenObj.decimals, + ); + const quoteTokenAmountRemoved = formatTokenAmount( + amountBReceive, + quoteTokenObj.decimals, + ); + + return { + signature: txHash, + 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.routes.ts b/src/connectors/minswap/minswap.routes.ts index a0ef872f06..2358eb4e09 100644 --- a/src/connectors/minswap/minswap.routes.ts +++ b/src/connectors/minswap/minswap.routes.ts @@ -4,6 +4,8 @@ import { ammPoolInfoRoute } from './amm-routes/poolInfo'; import { quoteSwapRoute as ammQuoteSwapRoute } from './amm-routes/quoteSwap'; import quoteLiquidityRoute from './amm-routes/quoteLiquidity'; import { executeSwapRoute as ammExecuteSwapRoute } from './amm-routes/executeSwap'; +import { addLiquidityRoute as ammAddLiquidityRoute } from './amm-routes/addLiquidity'; +import { removeLiquidityRoute as ammRemoveLiquidityRoute } from './amm-routes/removeLiquidity'; // AMM routes including swap endpoints const minswapAmmRoutes: FastifyPluginAsync = async (fastify) => { @@ -20,8 +22,8 @@ const minswapAmmRoutes: FastifyPluginAsync = async (fastify) => { await instance.register(ammQuoteSwapRoute); await instance.register(quoteLiquidityRoute); await instance.register(ammExecuteSwapRoute); - // await instance.register(ammAddLiquidityRoute); - // await instance.register(ammRemoveLiquidityRoute); + await instance.register(ammAddLiquidityRoute); + await instance.register(ammRemoveLiquidityRoute); }); }; diff --git a/src/connectors/minswap/minswap.ts b/src/connectors/minswap/minswap.ts index 068cd7b4a7..6a5103f77a 100644 --- a/src/connectors/minswap/minswap.ts +++ b/src/connectors/minswap/minswap.ts @@ -1,7 +1,13 @@ import { Cardano } from '../../chains/cardano/cardano'; -import { Data, PrivateKey } from '@aiquant/lucid-cardano'; +import { Data, PrivateKey, TxComplete, UTxO } from '@aiquant/lucid-cardano'; import { BlockFrostAPI } from '@blockfrost/blockfrost-js'; -import { BlockfrostAdapter, NetworkId } from '@aiquant/minswap-sdk'; +import { + ADA, + Asset, + BlockfrostAdapter, + NetworkId, + PoolV1, +} from '@aiquant/minswap-sdk'; import { percentRegexp, @@ -11,17 +17,21 @@ import { logger } from '../../services/logger'; import { MinswapConfig } from './minswap.config'; import { PoolInfo } from '../../schemas/amm-schema'; +import { findPoolAddress, isFractionString } from './minswap.utils'; export class Minswap { private static _instances: { [name: string]: Minswap }; public cardano: Cardano; - public config: MinswapConfig.NetworkConfig; + public config: MinswapConfig.RootConfig; + public rootConfig: MinswapConfig.RootConfig; private owner?: PrivateKey; public blockfrostAdapter: BlockfrostAdapter; + // Network information + private networkName: string; - private constructor() { - this.config = - MinswapConfig.config as unknown as MinswapConfig.NetworkConfig; + private constructor(network: string) { + this.networkName = network; + this.config = MinswapConfig.config as unknown as MinswapConfig.RootConfig; this.cardano = null; } @@ -32,7 +42,7 @@ export class Minswap { } if (!Minswap._instances[network]) { - const instance = new Minswap(); + const instance = new Minswap(network); await instance.init(network); Minswap._instances[network] = instance; } @@ -141,9 +151,58 @@ export class Minswap { quoteTokenAmount: quoteTokenAmount, poolType: 'amm', lpMint: { - address: pool.address, + address: pool.assetLP, decimals: 0, }, }; } + + /** + * 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 index da18811924..8139340dad 100644 --- a/src/connectors/minswap/minswap.utils.ts +++ b/src/connectors/minswap/minswap.utils.ts @@ -38,16 +38,28 @@ export const findPoolAddress = ( * @returns The formatted token amount */ export const formatTokenAmount = ( - amount: string | number, + 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; +} From 05fe4762e21d9e4e5a777f5260a28074388ed5fc Mon Sep 17 00:00:00 2001 From: Aiquant1 Date: Sat, 5 Jul 2025 14:59:40 +0530 Subject: [PATCH 05/12] Written routes for executeSwap, AddLiquidity, and Remove Liquidity for sundaeswap also written test cases for cardano chain and minswap and sundaeswap --- package.json | 3 +- pnpm-lock.yaml | 781 +----------------- src/app.ts | 10 + .../minswap/amm-routes/addLiquidity.ts | 17 +- .../minswap/amm-routes/executeSwap.ts | 7 +- .../minswap/amm-routes/quoteLiquidity.ts | 23 +- .../minswap/amm-routes/quoteSwap.ts | 31 +- .../minswap/amm-routes/removeLiquidity.ts | 2 - src/connectors/minswap/minswap.ts | 5 +- .../sundaeswap/amm-routes/addLiquidity.ts | 187 +++++ .../sundaeswap/amm-routes/executeSwap.ts | 256 ++++++ .../sundaeswap/amm-routes/poolInfo.ts | 82 ++ .../sundaeswap/amm-routes/quoteLiquidity.ts | 246 ++++++ .../sundaeswap/amm-routes/quoteSwap.ts | 404 +++++++++ .../sundaeswap/amm-routes/removeLiquidity.ts | 214 +++++ .../sundaeswap/sundaeswap.routes.ts | 33 + src/connectors/sundaeswap/sundaeswap.ts | 184 +++++ src/connectors/sundaeswap/sundaeswap.utils.ts | 65 ++ src/templates/connectors/sundaeswap.yml | 11 +- test/chains/cardano/cardano.test.js | 184 +++++ test/chains/cardano/mocks/balance.json | 20 + test/chains/cardano/mocks/status.json | 7 + test/chains/cardano/mocks/tokens.json | 22 + test/chains/cardano/wallet.test.ts | 339 ++++++++ test/connectors/minswap/amm.test.js | 545 ++++++++++++ .../minswap/mocks/amm-pool-info-invalid.json | 5 + .../minswap/mocks/amm-pool-info.json | 14 + .../mocks/amm-quote-liquidity-imbalanced.json | 5 + .../mocks/amm-quote-swap-invalid-token.json | 5 + .../minswap/mocks/amm-quote-swap-sell.json | 13 + .../minswap/mocks/amm-quote-swap.json | 13 + .../minswap/mocks/execute-swap.json | 8 + test/connectors/minswap/mocks/quote-swap.json | 12 + test/connectors/sundaeswap/amm.test.js | 541 ++++++++++++ .../mocks/amm-pool-info-invalid.json | 5 + .../sundaeswap/mocks/amm-pool-info.json | 14 + .../mocks/amm-quote-liquidity-imbalanced.json | 5 + .../mocks/amm-quote-swap-invalid-token.json | 5 + .../sundaeswap/mocks/amm-quote-swap-sell.json | 12 + .../sundaeswap/mocks/amm-quote-swap.json | 12 + .../sundaeswap/mocks/execute-swap.json | 8 + .../sundaeswap/mocks/quote-swap.json | 12 + 42 files changed, 3550 insertions(+), 817 deletions(-) create mode 100644 src/connectors/sundaeswap/amm-routes/addLiquidity.ts create mode 100644 src/connectors/sundaeswap/amm-routes/executeSwap.ts create mode 100644 src/connectors/sundaeswap/amm-routes/poolInfo.ts create mode 100644 src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts create mode 100644 src/connectors/sundaeswap/amm-routes/quoteSwap.ts create mode 100644 src/connectors/sundaeswap/amm-routes/removeLiquidity.ts create mode 100644 src/connectors/sundaeswap/sundaeswap.routes.ts create mode 100644 src/connectors/sundaeswap/sundaeswap.ts create mode 100644 src/connectors/sundaeswap/sundaeswap.utils.ts create mode 100644 test/chains/cardano/cardano.test.js create mode 100644 test/chains/cardano/mocks/balance.json create mode 100644 test/chains/cardano/mocks/status.json create mode 100644 test/chains/cardano/mocks/tokens.json create mode 100644 test/chains/cardano/wallet.test.ts create mode 100644 test/connectors/minswap/amm.test.js create mode 100644 test/connectors/minswap/mocks/amm-pool-info-invalid.json create mode 100644 test/connectors/minswap/mocks/amm-pool-info.json create mode 100644 test/connectors/minswap/mocks/amm-quote-liquidity-imbalanced.json create mode 100644 test/connectors/minswap/mocks/amm-quote-swap-invalid-token.json create mode 100644 test/connectors/minswap/mocks/amm-quote-swap-sell.json create mode 100644 test/connectors/minswap/mocks/amm-quote-swap.json create mode 100644 test/connectors/minswap/mocks/execute-swap.json create mode 100644 test/connectors/minswap/mocks/quote-swap.json create mode 100644 test/connectors/sundaeswap/amm.test.js create mode 100644 test/connectors/sundaeswap/mocks/amm-pool-info-invalid.json create mode 100644 test/connectors/sundaeswap/mocks/amm-pool-info.json create mode 100644 test/connectors/sundaeswap/mocks/amm-quote-liquidity-imbalanced.json create mode 100644 test/connectors/sundaeswap/mocks/amm-quote-swap-invalid-token.json create mode 100644 test/connectors/sundaeswap/mocks/amm-quote-swap-sell.json create mode 100644 test/connectors/sundaeswap/mocks/amm-quote-swap.json create mode 100644 test/connectors/sundaeswap/mocks/execute-swap.json create mode 100644 test/connectors/sundaeswap/mocks/quote-swap.json diff --git a/package.json b/package.json index e3d5a758e6..9d872d6f6a 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "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", @@ -76,7 +77,7 @@ "@solflare-wallet/utl-sdk": "^1.4.0", "@uniswap/permit2-sdk": "^1.3.1", "@uniswap/router-sdk": "^2.0.4", - "@sundaeswap/core": "^1.3.48", + "@sundaeswap/asset": "^1.0.10", "@uniswap/sdk": "3.0.3", "@uniswap/sdk-core": "^5.9.0", "@uniswap/smart-order-router": "^3.59.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 89620b2c86..7c55cf7393 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,6 +25,9 @@ importers: '@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 @@ -130,9 +133,9 @@ importers: '@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) - '@sundaeswap/core': - specifier: ^1.3.48 - version: 1.3.48(@blaze-cardano/sdk@0.2.43(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(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)(lucid-cardano@0.10.7(bufferutil@4.0.9)(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) @@ -393,6 +396,15 @@ packages: '@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 + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -717,40 +729,6 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@biglup/is-cid@1.0.3': - resolution: {integrity: sha512-R0XPZ/IQhU2TtetSFI9vI+7kJOJYNiCncn5ixEBW+/LNaZCo2HK37Mq3pRNzrM4FryuAkyeqY7Ujmj3I3e3t9g==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - - '@blaze-cardano/core@0.7.0': - resolution: {integrity: sha512-zVwWKnBfR1pMfAD87cXwTolb39T5n+uFafzUi1soBFzXCnFfqvZaDdxIthWA/Xn9ARZlvDNcvKXZewfskBRXgQ==} - - '@blaze-cardano/data@0.6.4': - resolution: {integrity: sha512-PSG3w9WPfmYMrcbBDCp+Bq2scU1igVHSF1MWScMAy0zGQljTaoZsg08bUkP7j6Pxq4qDjw6EyTyN1hPQAWXcmA==} - - '@blaze-cardano/jest-config@0.0.1': - resolution: {integrity: sha512-q/0BzXoN+PP4kcwmqthJEYrQ1ee3pZ1Y2dV7X7levyccX8yVMxgMUvJjXhZKl0Bb9g8JidoxanVaBW0d0Y0mSw==} - - '@blaze-cardano/ogmios@0.0.7': - resolution: {integrity: sha512-6T5Iz9Qpenp8tj3eogfvjGIxScm01oSrXrnT8oUFxOT4xYGz7PmX69Y80e+1AFAGIzZpHvYZdIQpGBr0Qlyswg==} - - '@blaze-cardano/query@0.5.2': - resolution: {integrity: sha512-GXRkr4LTYUd+Gd9d+05DVUSx1xz8wp9lIqC+n9yf//xSP6wjKUNQDrxB0XmLic1d9OEZZIwJl/gO9YJj/gmHXA==} - - '@blaze-cardano/sdk@0.2.43': - resolution: {integrity: sha512-g4IPG7EDAYW0Idm9KiyG7I9nnUzD1WaPwdPUCpQBoRUbGgBGJ1L/DzsyrQH7z5ZDjP1Q6ITWKowhgeqsIinSBQ==} - - '@blaze-cardano/tx@0.13.4': - resolution: {integrity: sha512-Jj1IzRLMquyl167qwWxtn/yuFI9w8l+8UsweTqMuRS8KVhUBkF/OMJ6D0xBFrnV6YxVtR67YeFbIGzmFokqBmw==} - - '@blaze-cardano/uplc@0.4.1': - resolution: {integrity: sha512-agzJaaK9DNGObCT3TsxS/ppioxJ40esF2ziIt9kk2zbM9H6F8JHmrGcW++v1REKSlmfHYhULUcaCrYzDSapjZQ==} - - '@blaze-cardano/vm@0.2.1': - resolution: {integrity: sha512-jCQMeLwDb7VHrKKUIsVfROKZUrVav5XxTmCa8uZpO/qd0DYjB6Qy4h6iFgLrRS9qKO8X2/7rLs1H4BY3VnULDQ==} - - '@blaze-cardano/wallet@0.4.13': - resolution: {integrity: sha512-mCZ09TYE+3M4d+epEo2FZbep6Oy6EOKGTRp8BrF2QwY8XsFVLbwWOVFRE95FIb/8DBWexhuHZIbZsIVEgiQ7bw==} - '@blockfrost/blockfrost-js@5.7.0': resolution: {integrity: sha512-Rzw+Ya+LlKJNv9k5g7xW0uM33Xf6Lt3MXANtuwtm7+R9xuMFc7iKocwHSgrGUTTZ1EKou4n4Znai18MdvqG2bw==} engines: {node: '>=16'} @@ -764,74 +742,6 @@ packages: deprecated: Bundlr is now Irys - please switch to @irys/sdk - this package will remain compatible with Irys for the foreseeable future. hasBin: true - '@cardano-ogmios/client@6.9.0': - resolution: {integrity: sha512-IsoUVsaMXiYyhWrdVKYOA5PDlX0EZ2gaq4lfk4JelRw6mcWVxemUrMaU2ndvugO9LQ3SCM1nESPgMIU0xe5FWw==} - engines: {node: '>=14'} - - '@cardano-ogmios/schema@6.13.0': - resolution: {integrity: sha512-rw8DaDUDqTJa/EEs3JXYzE9OWkAv7TjgUGPC1dWl0pUEQiPSxNLtSkdaX88ULXetJttb9P/1A7dJo0keZBn4fg==} - engines: {node: '>=14'} - - '@cardano-ogmios/schema@6.9.0': - resolution: {integrity: sha512-e7QVLF+dQMIv9p+p5CWQjMfBmkERYRa2wK2AjyehQZCJnecZ0gvTbRqewdX5VW4mVXf6KUfFyphsxWK46Pg6LA==} - engines: {node: '>=14'} - - '@cardano-sdk/core@0.45.0': - resolution: {integrity: sha512-7bRpbbwsZF5XIGy4Tsm4KErMEnEhTsPjgvjgGDUO+oacXZkdxJRckcsiI7DPRmmJBm/7tAyHUirfXiGw3Gg9DQ==} - engines: {node: '>=16.20.2'} - peerDependencies: - rxjs: ^7.4.0 - peerDependenciesMeta: - rxjs: - optional: true - - '@cardano-sdk/crypto@0.1.32': - resolution: {integrity: sha512-RCKFvkzD32QpKQ0jULADVRNmfBNkCwiZl2nlFbkZ3aCrfIex+6/2CizoagJ161fA7lL5/HGuzWfjOg3GX2ax6w==} - engines: {node: '>=16.20.2'} - peerDependencies: - '@dcspark/cardano-multiplatform-lib-asmjs': ^3.1.1 - '@dcspark/cardano-multiplatform-lib-browser': ^3.1.1 - '@dcspark/cardano-multiplatform-lib-nodejs': ^3.1.1 - peerDependenciesMeta: - '@dcspark/cardano-multiplatform-lib-asmjs': - optional: true - '@dcspark/cardano-multiplatform-lib-browser': - optional: true - '@dcspark/cardano-multiplatform-lib-nodejs': - optional: true - - '@cardano-sdk/crypto@0.2.3': - resolution: {integrity: sha512-jTl8rbocV1XO5DBR6+lGY6Owc/bP+wBg5eO3PttTeKhx/J7o99pyuTa5H36a/XTJwqDwKIXV922QxZR+rfjVbA==} - engines: {node: '>=16.20.2'} - peerDependencies: - '@dcspark/cardano-multiplatform-lib-asmjs': ^3.1.1 - '@dcspark/cardano-multiplatform-lib-browser': ^3.1.1 - '@dcspark/cardano-multiplatform-lib-nodejs': ^3.1.1 - peerDependenciesMeta: - '@dcspark/cardano-multiplatform-lib-asmjs': - optional: true - '@dcspark/cardano-multiplatform-lib-browser': - optional: true - '@dcspark/cardano-multiplatform-lib-nodejs': - optional: true - - '@cardano-sdk/util@0.15.7': - resolution: {integrity: sha512-L0f3gXFujRwSSpjzq2W/OwW23fg0gw5S+9R+91He3LgmyfjNygd939eFPCLhwOscsHcJ4AN27UJSYnx3JMKZ0w==} - engines: {node: '>=16.20.2'} - - '@cardano-sdk/util@0.16.0': - resolution: {integrity: sha512-f0tfX8oiauqAFCyyc/o2Ouezyk83QD4zqLl4DUjZNyCtITL8gBHh25Bkw7RUCGEZ+hf6Qms1n0ui0j3wVY7zRg==} - engines: {node: '>=16.20.2'} - - '@cardanosolutions/json-bigint@1.0.2': - resolution: {integrity: sha512-hRgKDFRR5zW6vv6KoymE1PuhKk8hxA/F5YsH37ghIFIYnWAMbVoQ7xRKAT5AEy9HrqWM6HxNQLIZ3r3omg96/w==} - - '@chainsafe/is-ip@2.1.0': - resolution: {integrity: sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w==} - - '@chainsafe/netmask@2.0.0': - resolution: {integrity: sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==} - '@colors/colors@1.6.0': resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} @@ -872,12 +782,6 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@emurgo/cardano-message-signing-browser@1.1.0': - resolution: {integrity: sha512-LyeiGIqCyZu9DZnKsi4wlBjZA1MN+uy3Cqpb5J6RZWvFXDJnCoxrYB/EixUiGRD/la4WsldBgtPsrIHyGsVkpg==} - - '@emurgo/cardano-message-signing-nodejs@1.1.0': - resolution: {integrity: sha512-PQRc8K8wZshEdmQenNUzVtiI8oJNF/1uAnBhidee5C4o1l2mDLOW+ur46HWHIFKQ6x8mSJTllcjMscHgzju0gQ==} - '@emurgo/cardano-serialization-lib-nodejs@11.5.0': resolution: {integrity: sha512-IlVABlRgo9XaTR1NunwZpWcxnfEv04ba2l1vkUz4S1W7Jt36F4CtffP+jPeqBZGnAe+fnUwo0XjIJC3ZTNToNQ==} @@ -1241,9 +1145,6 @@ packages: peerDependencies: '@sinclair/typebox': '>=0.26 <=0.33' - '@foxglove/crc@0.0.3': - resolution: {integrity: sha512-DjIZsnL3CyP/yQ/vUYA9cjrD0a/8YXejI5ZmsaOiT16cLfZcTwaCxIN01/ys4jsy+dZCQ/9DnWFn7AEFbiMDaA==} - '@graphql-typed-document-node/core@3.2.0': resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: @@ -1431,9 +1332,6 @@ packages: '@ledgerhq/types-live@6.84.0': resolution: {integrity: sha512-0n8p4xlE/Vb2+hQey0tFtOsLJ+QHLgU3/VzrUNyVv2XTDNsOiJB86hHBocATR+fg4UjyNBRE1ff9/fGhqKyEzg==} - '@leichtgewicht/ip-codec@2.0.5': - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - '@lukeed/ms@2.0.2': resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} @@ -1486,15 +1384,6 @@ packages: '@minswap/tiny-invariant@1.2.0': resolution: {integrity: sha512-m4CMTsZ4MDB2WLND6rV0eti+f2WcMPhKvXf9ZHXlQMqvNmgoX1z//84FpEX0D1vVTPfJtNS8XIoIQ9pm6X590A==} - '@multiformats/dns@1.0.9': - resolution: {integrity: sha512-Ja4hevWI9p96ICx11K3suFvFirnMmXILzS7FpsR2KG3FoKF/XJijm8ylf3vY6kRFGr98yfZYM+zIn18KaINs3A==} - - '@multiformats/mafmt@12.1.6': - resolution: {integrity: sha512-tlJRfL21X+AKn9b5i5VnaTD6bNttpSpcqwKVmDmSHLwxoz97fAHaepqFOk/l1fIu94nImIXneNbhsJx/RQNIww==} - - '@multiformats/multiaddr@12.5.1': - resolution: {integrity: sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ==} - '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -1520,9 +1409,6 @@ packages: '@noble/ed25519@1.7.5': resolution: {integrity: sha512-xuS0nwRMQBvSxDa7UxMb61xTiH3MxTgUfhyPUALVIe0FlOAz4sjELwyDRyUvqeEYfRSG9qNjFIycqLZppg4RSA==} - '@noble/ed25519@2.3.0': - resolution: {integrity: sha512-M7dvXL2B92/M7dw9+gzuydL8qn/jiqNHaoR3Q+cb1q1GHV7uwE17WCyFMG+Y+TZb5izcaXk5TdJRrDUxHXL78A==} - '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -1830,9 +1716,6 @@ packages: '@sinclair/typebox@0.33.22': resolution: {integrity: sha512-auUj4k+f4pyrIVf4GW5UKquSZFHJWri06QgARy9C0t9ZTjJLIuNIrr1yl9bWcJWJ1Gz1vOvYN1D+QPaIlNMVkQ==} - '@sinclair/typebox@0.34.41': - resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} - '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -2231,16 +2114,6 @@ packages: '@sundaeswap/bigint-math@0.6.3': resolution: {integrity: sha512-FTXBd8F9LAvZsTZII7SBbZTEnjJc4JOSHp0XM+byAMsIDXglrYKotZT8z4QnYBxq1EcuhONsKdutibTfst4sgg==} - '@sundaeswap/core@1.3.48': - resolution: {integrity: sha512-ArZmTuLU9fTFfNqY83WzkJv9z05lLAh1vj5DHR1saLcIQs6oqunjXZnpzNwmeojYbppOF6Ks3SnWnLv8OEw46Q==} - peerDependencies: - '@blaze-cardano/sdk': ^0.2.20 - '@sundaeswap/asset': ^1.0.3 - '@sundaeswap/bigint-math': ^0.6.3 - '@sundaeswap/cpp': ^1.0.7 - '@sundaeswap/fraction': ^1.0.5 - lucid-cardano: 0.10.7 - '@sundaeswap/cpp@1.0.13': resolution: {integrity: sha512-YxDra67Bqlb0Hjwja7SPq8I+I1rduWXwJXggOQu7n9+ogbAfz8DEIiCXep+K8h2nFa1miLPGVFYbrYC83cEvRw==} peerDependencies: @@ -2352,9 +2225,6 @@ packages: '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - '@types/json-bigint@1.0.4': - resolution: {integrity: sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag==} - '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -2717,9 +2587,6 @@ packages: resolution: {integrity: sha512-hiEivWNztx73s+7iLxsuD1sOJ28xtRix58W7Xnz4XzzA/pF0+aicnWgjOdA10doVDEDZdUuZCIIqG96SFNlDUg==} engines: {node: '>=16'} - '@zxing/text-encoding@0.9.0': - resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} - abitype@1.0.8: resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} peerDependencies: @@ -2746,9 +2613,6 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - abort-error@1.0.1: - resolution: {integrity: sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==} - abstract-level@1.0.4: resolution: {integrity: sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==} engines: {node: '>=12'} @@ -3017,14 +2881,6 @@ packages: axios@1.10.0: resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} - b4a@1.7.1: - resolution: {integrity: sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==} - peerDependencies: - react-native-b4a: '*' - peerDependenciesMeta: - react-native-b4a: - optional: true - babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3092,9 +2948,6 @@ packages: 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==} engines: {node: '>=8'} @@ -3117,15 +2970,9 @@ packages: blake2b-wasm@1.1.7: resolution: {integrity: sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA==} - blake2b-wasm@2.4.0: - resolution: {integrity: sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==} - blake2b@2.1.3: resolution: {integrity: sha512-pkDss4xFVbMb4270aCyGD3qLv92314Et+FsKzilCLxDz5DuZ2/1g3w4nmBbu6nKApPspnjG7JcwTjGZnduB1yg==} - blake2b@2.1.4: - resolution: {integrity: sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==} - blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} @@ -3746,10 +3593,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -4351,9 +4194,6 @@ packages: fp-ts@1.19.3: resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} - fraction.js@4.0.1: - resolution: {integrity: sha512-NQYzZw8MUsxSZFQo6E8tKOlmSd/BlDTNOR4puXFSHSwFwNaIlmbortQy5PDN/KnVQ4xWG2NtN0J0hjPw7eE06A==} - fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -4594,9 +4434,6 @@ packages: hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hashlru@2.3.0: - resolution: {integrity: sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -4608,9 +4445,6 @@ packages: help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} - hex-encoding@2.0.3: - resolution: {integrity: sha512-sSmMo4ij2Vejht+5UkzuzNGiYgIWTSUw0GQqxHIQXsuuXB1ozYnjCZJZ/nwWNYRoU8+92Dp736wqxmiAN6/fcw==} - hi-base32@0.5.1: resolution: {integrity: sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==} @@ -4651,10 +4485,6 @@ packages: engines: {node: '>=18'} hasBin: true - i@0.3.7: - resolution: {integrity: sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==} - engines: {node: '>=0.4'} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -4711,10 +4541,6 @@ packages: io-ts@1.10.4: resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -4938,10 +4764,6 @@ packages: isnumber@1.0.0: resolution: {integrity: sha512-JLiSz/zsZcGFXPrB4I/AGBvtStkt+8QmksyZBZnVXnnK9XdTEyz0tX8CRYljtwYDuIuZzih6DpHQdi+3Q6zHPw==} - iso-url@1.2.1: - resolution: {integrity: sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==} - engines: {node: '>=12'} - isobject@2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} @@ -4955,11 +4777,6 @@ packages: peerDependencies: ws: '*' - isomorphic-ws@5.0.0: - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' - isows@1.0.7: resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} peerDependencies: @@ -5197,9 +5014,6 @@ packages: jsbi@3.2.5: resolution: {integrity: sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==} - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -5302,12 +5116,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libsodium-sumo@0.7.15: - resolution: {integrity: sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==} - - libsodium-wrappers-sumo@0.7.15: - resolution: {integrity: sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==} - light-my-request@5.14.0: resolution: {integrity: sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==} @@ -5385,10 +5193,6 @@ packages: lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} - lucid-cardano@0.10.7: - resolution: {integrity: sha512-hxJRMWj8VH+SGFqsVMG6T3LSRuxzwFbWOQ5DTGQQUyR/20FL7bjiVL+2ivMJF52tAbFKcwqpRD4fddR7LbqcAw==} - engines: {node: '>=14'} - make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -5560,9 +5364,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - multiformats@13.4.1: - resolution: {integrity: sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==} - multistream@4.1.0: resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} @@ -5591,14 +5392,6 @@ packages: nanoassert@1.1.0: resolution: {integrity: sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==} - nanoassert@2.0.0: - resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==} - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - nanomatch@1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -5657,9 +5450,6 @@ packages: node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - node-buffer-encoding@1.0.3: - resolution: {integrity: sha512-9hJZNChhQoCN1rCFScJiEwtzvWEJw2wSnu2nhDLD/YOYl1Ce8GbtnorsnjwwjpSk4sWE7zSp2etX6j7+bO7fVA==} - node-cache@5.1.2: resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} engines: {node: '>= 8.0.0'} @@ -5720,82 +5510,6 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm@9.9.4: - resolution: {integrity: sha512-NzcQiLpqDuLhavdyJ2J3tGJ/ni/ebcqHVFZkv1C4/6lblraUPbPgCJ4Vhb4oa3FFhRa2Yj9gA58jGH/ztKueNQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - bundledDependencies: - - '@isaacs/string-locale-compare' - - '@npmcli/arborist' - - '@npmcli/config' - - '@npmcli/fs' - - '@npmcli/map-workspaces' - - '@npmcli/package-json' - - '@npmcli/promise-spawn' - - '@npmcli/run-script' - - abbrev - - archy - - cacache - - chalk - - ci-info - - cli-columns - - cli-table3 - - columnify - - fastest-levenshtein - - fs-minipass - - glob - - graceful-fs - - hosted-git-info - - ini - - init-package-json - - is-cidr - - json-parse-even-better-errors - - libnpmaccess - - libnpmdiff - - libnpmexec - - libnpmfund - - libnpmhook - - libnpmorg - - libnpmpack - - libnpmpublish - - libnpmsearch - - libnpmteam - - libnpmversion - - make-fetch-happen - - minimatch - - minipass - - minipass-pipeline - - ms - - node-gyp - - nopt - - normalize-package-data - - npm-audit-report - - npm-install-checks - - npm-package-arg - - npm-pick-manifest - - npm-profile - - npm-registry-fetch - - npm-user-validate - - npmlog - - p-map - - pacote - - parse-conflict-json - - proc-log - - qrcode-terminal - - read - - semver - - sigstore - - spdx-expression-parse - - ssri - - supports-color - - tar - - text-table - - tiny-relative-date - - treeverse - - validate-npm-package-name - - which - - write-file-atomic - number-to-bn@1.7.0: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} engines: {node: '>=6.5.0', npm: '>=3'} @@ -5931,14 +5645,6 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} - p-queue@8.1.1: - resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} - engines: {node: '>=18'} - - p-timeout@6.1.4: - resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} - engines: {node: '>=14.16'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -6102,9 +5808,6 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - progress-events@1.0.1: - resolution: {integrity: sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==} - prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -6419,10 +6122,6 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} - serialize-error@8.1.0: - resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} - engines: {node: '>=10'} - serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -6585,9 +6284,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - stable-hash-x@0.1.1: resolution: {integrity: sha512-l0x1D6vhnsNUGPFVDx45eif0y6eedVC8nm5uACTrVFJFtl2mLRW17aWtVyxFCpn5t94VUPkjU8vSLwIuwwqtJQ==} engines: {node: '>=12.0.0'} @@ -6869,10 +6565,6 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-custom-error@3.3.1: - resolution: {integrity: sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==} - engines: {node: '>=14.0.0'} - ts-jest@29.4.0: resolution: {integrity: sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} @@ -6900,9 +6592,6 @@ packages: jest-util: optional: true - ts-log@2.2.7: - resolution: {integrity: sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==} - ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -6973,10 +6662,6 @@ packages: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -7013,18 +6698,6 @@ packages: u3@0.1.1: resolution: {integrity: sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w==} - uint8-encoding@2.0.1: - resolution: {integrity: sha512-xZAjZ+3OvrDtjFLLgojrLmG6T0YwZEo0OTyqCBxFjlFimIKnLtFqyYk6z/jDOUlJFJE52Srtrv4W4x7t4Cn/dA==} - - uint8-varint@2.0.4: - resolution: {integrity: sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==} - - uint8arraylist@2.4.8: - resolution: {integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==} - - uint8arrays@5.1.0: - resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==} - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -7151,9 +6824,6 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-encoding@1.1.5: - resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} - web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -7381,6 +7051,14 @@ snapshots: - bufferutil - utf-8-validate + '@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: + '@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 + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.12 @@ -8043,152 +7721,6 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@biglup/is-cid@1.0.3': - dependencies: - '@multiformats/mafmt': 12.1.6 - '@multiformats/multiaddr': 12.5.1 - iso-url: 1.2.1 - multiformats: 13.4.1 - uint8arrays: 5.1.0 - - '@blaze-cardano/core@0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': - dependencies: - '@cardano-sdk/core': 0.45.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@cardano-sdk/crypto': 0.1.32 - '@cardano-sdk/util': 0.15.7 - '@noble/curves': 1.9.2 - '@noble/ed25519': 2.3.0 - '@noble/hashes': 1.8.0 - '@scure/bip39': 1.6.0 - blakejs: 1.2.1 - transitivePeerDependencies: - - '@dcspark/cardano-multiplatform-lib-asmjs' - - '@dcspark/cardano-multiplatform-lib-browser' - - '@dcspark/cardano-multiplatform-lib-nodejs' - - bufferutil - - encoding - - react-native-b4a - - rxjs - - utf-8-validate - - '@blaze-cardano/data@0.6.4(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': - dependencies: - '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@sinclair/typebox': 0.34.41 - transitivePeerDependencies: - - '@dcspark/cardano-multiplatform-lib-asmjs' - - '@dcspark/cardano-multiplatform-lib-browser' - - '@dcspark/cardano-multiplatform-lib-nodejs' - - bufferutil - - encoding - - react-native-b4a - - rxjs - - utf-8-validate - - '@blaze-cardano/jest-config@0.0.1': {} - - '@blaze-cardano/ogmios@0.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@cardano-ogmios/schema': 6.13.0 - isomorphic-ws: 5.0.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - transitivePeerDependencies: - - ws - - '@blaze-cardano/query@0.5.2(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': - dependencies: - '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@blaze-cardano/jest-config': 0.0.1 - '@blaze-cardano/ogmios': 0.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@cardano-ogmios/schema': 6.13.0 - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - '@dcspark/cardano-multiplatform-lib-asmjs' - - '@dcspark/cardano-multiplatform-lib-browser' - - '@dcspark/cardano-multiplatform-lib-nodejs' - - bufferutil - - encoding - - react-native-b4a - - rxjs - - utf-8-validate - - '@blaze-cardano/sdk@0.2.43(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': - dependencies: - '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@blaze-cardano/query': 0.5.2(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@blaze-cardano/tx': 0.13.4(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@blaze-cardano/uplc': 0.4.1(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@blaze-cardano/wallet': 0.4.13(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - '@dcspark/cardano-multiplatform-lib-asmjs' - - '@dcspark/cardano-multiplatform-lib-browser' - - '@dcspark/cardano-multiplatform-lib-nodejs' - - bufferutil - - encoding - - react-native-b4a - - rxjs - - utf-8-validate - - '@blaze-cardano/tx@0.13.4(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': - dependencies: - '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@blaze-cardano/vm': 0.2.1(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - '@dcspark/cardano-multiplatform-lib-asmjs' - - '@dcspark/cardano-multiplatform-lib-browser' - - '@dcspark/cardano-multiplatform-lib-nodejs' - - bufferutil - - encoding - - react-native-b4a - - rxjs - - utf-8-validate - - '@blaze-cardano/uplc@0.4.1(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': - dependencies: - '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@blaze-cardano/data': 0.6.4(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - hex-encoding: 2.0.3 - transitivePeerDependencies: - - '@dcspark/cardano-multiplatform-lib-asmjs' - - '@dcspark/cardano-multiplatform-lib-browser' - - '@dcspark/cardano-multiplatform-lib-nodejs' - - bufferutil - - encoding - - react-native-b4a - - rxjs - - utf-8-validate - - '@blaze-cardano/vm@0.2.1(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': - dependencies: - '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@blaze-cardano/uplc': 0.4.1(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - '@dcspark/cardano-multiplatform-lib-asmjs' - - '@dcspark/cardano-multiplatform-lib-browser' - - '@dcspark/cardano-multiplatform-lib-nodejs' - - bufferutil - - encoding - - react-native-b4a - - rxjs - - utf-8-validate - - '@blaze-cardano/wallet@0.4.13(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': - dependencies: - '@blaze-cardano/core': 0.7.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@blaze-cardano/jest-config': 0.0.1 - '@blaze-cardano/query': 0.5.2(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@blaze-cardano/tx': 0.13.4(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10) - '@emurgo/cardano-message-signing-browser': 1.1.0 - '@emurgo/cardano-message-signing-nodejs': 1.1.0 - transitivePeerDependencies: - - '@dcspark/cardano-multiplatform-lib-asmjs' - - '@dcspark/cardano-multiplatform-lib-browser' - - '@dcspark/cardano-multiplatform-lib-nodejs' - - bufferutil - - encoding - - react-native-b4a - - rxjs - - utf-8-validate - '@blockfrost/blockfrost-js@5.7.0': dependencies: '@blockfrost/openapi': 0.1.70-beta.0 @@ -8234,109 +7766,6 @@ snapshots: - typescript - utf-8-validate - '@cardano-ogmios/client@6.9.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)': - dependencies: - '@cardano-ogmios/schema': 6.9.0 - '@cardanosolutions/json-bigint': 1.0.2 - '@types/json-bigint': 1.0.4 - bech32: 2.0.0 - cross-fetch: 3.2.0(encoding@0.1.13) - fastq: 1.19.1 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - nanoid: 3.3.11 - ts-custom-error: 3.3.1 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - - '@cardano-ogmios/schema@6.13.0': {} - - '@cardano-ogmios/schema@6.9.0': {} - - '@cardano-sdk/core@0.45.0(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(utf-8-validate@5.0.10)': - dependencies: - '@biglup/is-cid': 1.0.3 - '@cardano-ogmios/client': 6.9.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@cardano-ogmios/schema': 6.9.0 - '@cardano-sdk/crypto': 0.2.3 - '@cardano-sdk/util': 0.15.7 - '@foxglove/crc': 0.0.3 - '@scure/base': 1.2.6 - fraction.js: 4.0.1 - ip-address: 9.0.5 - lodash: 4.17.21 - ts-custom-error: 3.3.1 - ts-log: 2.2.7 - web-encoding: 1.1.5 - optionalDependencies: - rxjs: 7.8.2 - transitivePeerDependencies: - - '@dcspark/cardano-multiplatform-lib-asmjs' - - '@dcspark/cardano-multiplatform-lib-browser' - - '@dcspark/cardano-multiplatform-lib-nodejs' - - bufferutil - - encoding - - react-native-b4a - - utf-8-validate - - '@cardano-sdk/crypto@0.1.32': - dependencies: - '@cardano-sdk/util': 0.15.7 - blake2b: 2.1.4 - i: 0.3.7 - libsodium-wrappers-sumo: 0.7.15 - lodash: 4.17.21 - npm: 9.9.4 - pbkdf2: 3.1.3 - ts-custom-error: 3.3.1 - ts-log: 2.2.7 - transitivePeerDependencies: - - react-native-b4a - - '@cardano-sdk/crypto@0.2.3': - dependencies: - '@cardano-sdk/util': 0.16.0 - blake2b: 2.1.4 - i: 0.3.7 - libsodium-wrappers-sumo: 0.7.15 - lodash: 4.17.21 - npm: 9.9.4 - pbkdf2: 3.1.3 - ts-custom-error: 3.3.1 - ts-log: 2.2.7 - transitivePeerDependencies: - - react-native-b4a - - '@cardano-sdk/util@0.15.7': - dependencies: - bech32: 2.0.0 - lodash: 4.17.21 - serialize-error: 8.1.0 - ts-custom-error: 3.3.1 - ts-log: 2.2.7 - type-fest: 2.19.0 - - '@cardano-sdk/util@0.16.0': - dependencies: - bech32: 2.0.0 - lodash: 4.17.21 - serialize-error: 8.1.0 - ts-custom-error: 3.3.1 - ts-log: 2.2.7 - type-fest: 2.19.0 - - '@cardanosolutions/json-bigint@1.0.2': - dependencies: - bignumber.js: 9.3.1 - - '@chainsafe/is-ip@2.1.0': {} - - '@chainsafe/netmask@2.0.0': - dependencies: - '@chainsafe/is-ip': 2.1.0 - '@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)': @@ -8422,10 +7851,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emurgo/cardano-message-signing-browser@1.1.0': {} - - '@emurgo/cardano-message-signing-nodejs@1.1.0': {} - '@emurgo/cardano-serialization-lib-nodejs@11.5.0': {} '@emurgo/cip14-js@3.0.1': @@ -9019,8 +8444,6 @@ snapshots: dependencies: '@sinclair/typebox': 0.33.22 - '@foxglove/crc@0.0.3': {} - '@graphql-typed-document-node/core@3.2.0(graphql@16.11.0)': dependencies: graphql: 16.11.0 @@ -9391,8 +8814,6 @@ snapshots: bignumber.js: 9.3.0 rxjs: 7.8.2 - '@leichtgewicht/ip-codec@2.0.5': {} - '@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)': @@ -9576,29 +8997,6 @@ snapshots: '@minswap/tiny-invariant@1.2.0': {} - '@multiformats/dns@1.0.9': - dependencies: - buffer: 6.0.3 - dns-packet: 5.6.1 - hashlru: 2.3.0 - p-queue: 8.1.1 - progress-events: 1.0.1 - uint8arrays: 5.1.0 - - '@multiformats/mafmt@12.1.6': - dependencies: - '@multiformats/multiaddr': 12.5.1 - - '@multiformats/multiaddr@12.5.1': - dependencies: - '@chainsafe/is-ip': 2.1.0 - '@chainsafe/netmask': 2.0.0 - '@multiformats/dns': 1.0.9 - abort-error: 1.0.1 - multiformats: 13.4.1 - uint8-varint: 2.0.4 - uint8arrays: 5.1.0 - '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.5.0 @@ -9626,8 +9024,6 @@ snapshots: '@noble/ed25519@1.7.5': {} - '@noble/ed25519@2.3.0': {} - '@noble/hashes@1.2.0': {} '@noble/hashes@1.4.0': {} @@ -10196,8 +9592,6 @@ snapshots: '@sinclair/typebox@0.33.22': {} - '@sinclair/typebox@0.34.41': {} - '@sindresorhus/is@4.6.0': {} '@sinonjs/commons@3.0.1': @@ -10862,15 +10256,6 @@ snapshots: '@sundaeswap/bigint-math@0.6.3': {} - '@sundaeswap/core@1.3.48(@blaze-cardano/sdk@0.2.43(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(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)(lucid-cardano@0.10.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@blaze-cardano/sdk': 0.2.43(bufferutil@4.0.9)(encoding@0.1.13)(rxjs@7.8.2)(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 - lucid-cardano: 0.10.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@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 @@ -11009,8 +10394,6 @@ snapshots: '@types/js-yaml@4.0.9': {} - '@types/json-bigint@1.0.4': {} - '@types/json5@0.0.29': {} '@types/keyv@3.1.4': @@ -11488,9 +10871,6 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 - '@zxing/text-encoding@0.9.0': - optional: true - abitype@1.0.8(typescript@5.8.3)(zod@3.25.76): optionalDependencies: typescript: 5.8.3 @@ -11505,8 +10885,6 @@ snapshots: dependencies: event-target-shim: 5.0.1 - abort-error@1.0.1: {} - abstract-level@1.0.4: dependencies: buffer: 6.0.3 @@ -11826,8 +11204,6 @@ snapshots: transitivePeerDependencies: - debug - b4a@1.7.1: {} - babel-jest@29.7.0(@babel/core@7.28.0): dependencies: '@babel/core': 7.28.0 @@ -11921,8 +11297,6 @@ snapshots: bignumber.js@9.3.0: {} - bignumber.js@9.3.1: {} - binary-extensions@2.3.0: {} bindings@1.5.0: @@ -11953,25 +11327,11 @@ snapshots: dependencies: nanoassert: 1.1.0 - blake2b-wasm@2.4.0: - dependencies: - b4a: 1.7.1 - nanoassert: 2.0.0 - transitivePeerDependencies: - - react-native-b4a - blake2b@2.1.3: dependencies: blake2b-wasm: 1.1.7 nanoassert: 1.1.0 - blake2b@2.1.4: - dependencies: - blake2b-wasm: 2.4.0 - nanoassert: 2.0.0 - transitivePeerDependencies: - - react-native-b4a - blakejs@1.2.1: {} bluebird@3.7.2: {} @@ -12614,10 +11974,6 @@ snapshots: dependencies: path-type: 4.0.0 - dns-packet@5.6.1: - dependencies: - '@leichtgewicht/ip-codec': 2.0.5 - doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -13481,8 +12837,6 @@ snapshots: fp-ts@1.19.3: {} - fraction.js@4.0.1: {} - fraction.js@4.3.7: {} fragment-cache@0.2.1: @@ -13798,8 +13152,6 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - hashlru@2.3.0: {} - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -13808,11 +13160,6 @@ snapshots: help-me@5.0.0: {} - hex-encoding@2.0.3: - dependencies: - node-buffer-encoding: 1.0.3 - uint8-encoding: 2.0.1 - hi-base32@0.5.1: {} hmac-drbg@1.0.1: @@ -13861,8 +13208,6 @@ snapshots: husky@9.1.7: {} - i@0.3.7: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -13929,11 +13274,6 @@ snapshots: dependencies: fp-ts: 1.19.3 - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - ipaddr.js@1.9.1: {} is-accessor-descriptor@1.0.1: @@ -14137,8 +13477,6 @@ snapshots: isnumber@1.0.0: {} - iso-url@1.2.1: {} - isobject@2.1.0: dependencies: isarray: 1.0.0 @@ -14149,10 +13487,6 @@ snapshots: dependencies: ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isomorphic-ws@5.0.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -14624,8 +13958,6 @@ snapshots: jsbi@3.2.5: {} - jsbn@1.1.0: {} - jsesc@3.1.0: {} json-bigint@1.0.0: @@ -14720,12 +14052,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libsodium-sumo@0.7.15: {} - - libsodium-wrappers-sumo@0.7.15: - dependencies: - libsodium-sumo: 0.7.15 - light-my-request@5.14.0: dependencies: cookie: 0.7.2 @@ -14817,15 +14143,6 @@ snapshots: lru_map@0.3.3: {} - lucid-cardano@0.10.7(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 - make-dir@4.0.0: dependencies: semver: 7.7.2 @@ -15005,8 +14322,6 @@ snapshots: ms@2.1.3: {} - multiformats@13.4.1: {} - multistream@4.1.0: dependencies: once: 1.4.0 @@ -15032,10 +14347,6 @@ snapshots: nanoassert@1.1.0: {} - nanoassert@2.0.0: {} - - nanoid@3.3.11: {} - nanomatch@1.2.13: dependencies: arr-diff: 4.0.0 @@ -15113,8 +14424,6 @@ snapshots: node-addon-api@6.1.0: {} - node-buffer-encoding@1.0.3: {} - node-cache@5.1.2: dependencies: clone: 2.1.2 @@ -15162,8 +14471,6 @@ snapshots: dependencies: path-key: 3.1.1 - npm@9.9.4: {} - number-to-bn@1.7.0: dependencies: bn.js: 5.2.1 @@ -15334,13 +14641,6 @@ snapshots: dependencies: aggregate-error: 3.1.0 - p-queue@8.1.1: - dependencies: - eventemitter3: 5.0.1 - p-timeout: 6.1.4 - - p-timeout@6.1.4: {} - p-try@2.2.0: {} package-json-from-dist@1.0.1: {} @@ -15509,8 +14809,6 @@ snapshots: process@0.11.10: {} - progress-events@1.0.1: {} - prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -15849,10 +15147,6 @@ snapshots: transitivePeerDependencies: - supports-color - serialize-error@8.1.0: - dependencies: - type-fest: 0.20.2 - serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -16062,8 +15356,6 @@ snapshots: sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} - stable-hash-x@0.1.1: {} stable-hash-x@0.2.0: {} @@ -16349,8 +15641,6 @@ snapshots: dependencies: typescript: 5.8.3 - ts-custom-error@3.3.1: {} - ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(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.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 @@ -16371,8 +15661,6 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.28.0) jest-util: 29.7.0 - ts-log@2.2.7: {} - ts-node@10.9.2(@types/node@15.14.9)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -16447,8 +15735,6 @@ snapshots: type-fest@0.7.1: {} - type-fest@2.19.0: {} - type-fest@4.41.0: {} type-is@1.6.18: @@ -16495,21 +15781,6 @@ snapshots: u3@0.1.1: {} - uint8-encoding@2.0.1: {} - - uint8-varint@2.0.4: - dependencies: - uint8arraylist: 2.4.8 - uint8arrays: 5.1.0 - - uint8arraylist@2.4.8: - dependencies: - uint8arrays: 5.1.0 - - uint8arrays@5.1.0: - dependencies: - multiformats: 13.4.1 - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -16674,12 +15945,6 @@ snapshots: dependencies: defaults: 1.0.4 - web-encoding@1.1.5: - dependencies: - util: 0.12.5 - optionalDependencies: - '@zxing/text-encoding': 0.9.0 - web-streams-polyfill@3.3.3: {} web3-utils@1.7.3: diff --git a/src/app.ts b/src/app.ts index 2af1db26b9..6b62be09f2 100644 --- a/src/app.ts +++ b/src/app.ts @@ -24,6 +24,7 @@ import { pancakeswapRoutes } from './connectors/pancakeswap/pancakeswap.routes'; import { raydiumRoutes } from './connectors/raydium/raydium.routes'; import { uniswapRoutes } from './connectors/uniswap/uniswap.routes'; import { minswapRoutes } from './connectors/minswap/minswap.routes'; +import { sundaeswapRoutes } from './connectors/sundaeswap/sundaeswap.routes'; import { getHttpsOptions } from './https'; import { poolRoutes } from './pools/pools.routes'; import { ConfigManagerV2 } from './services/config-manager-v2'; @@ -102,6 +103,10 @@ const swaggerOptions = { name: 'minswap/amm', description: 'Minswap pool connector (Cardano)', }, + { + name: 'sundaeswap/amm', + description: 'Sundaeswap pool connector (Cardano)', + }, ], components: { parameters: { @@ -253,6 +258,11 @@ const configureGatewayServer = () => { // 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/connectors/minswap/amm-routes/addLiquidity.ts b/src/connectors/minswap/amm-routes/addLiquidity.ts index 9f3d3ae0d0..68676dd512 100644 --- a/src/connectors/minswap/amm-routes/addLiquidity.ts +++ b/src/connectors/minswap/amm-routes/addLiquidity.ts @@ -53,23 +53,12 @@ async function addLiquidity( const slippage = slippagePct !== undefined ? slippagePct : minswap.getAllowedSlippage(); // returns decimal, e.g. 0.005 - // 5) Fetch on-chain pool state for deposit calculation - const assetA: Asset = { - policyId: quote.baseTokenObj.policyId, - tokenName: quote.baseTokenObj.assetName, - }; - const assetB: Asset = { - policyId: quote.quoteTokenObj.policyId, - tokenName: quote.quoteTokenObj.assetName, - }; - const poolState = await minswap.blockfrostAdapter.getV2PoolByPair( - assetA, - assetB, - ); + const { poolState, poolDatum } = await minswap.getPoolData(poolAddress); if (!poolState) { throw fastify.httpErrors.internalServerError('Pool state not found'); } - const { reserveA, reserveB, totalLiquidity } = poolState; + const { reserveA, reserveB } = poolState; + const { totalLiquidity, assetA, assetB } = poolDatum; // 6) Compute necessary amounts and LP tokens const baseRaw = quote.rawBaseTokenAmount.toBigInt(); diff --git a/src/connectors/minswap/amm-routes/executeSwap.ts b/src/connectors/minswap/amm-routes/executeSwap.ts index d01059a52e..00ad0ce332 100644 --- a/src/connectors/minswap/amm-routes/executeSwap.ts +++ b/src/connectors/minswap/amm-routes/executeSwap.ts @@ -91,10 +91,9 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { }; // On‑chain reserves - const poolState = await minswap.blockfrostAdapter.getV2PoolByPair( - assetA, - assetB, - ); + console.log('working upto here', poolAddr); + + const { poolState, poolDatum } = await minswap.getPoolData(poolAddr); if (!poolState) { throw fastify.httpErrors.notFound('Pool state unavailable'); } diff --git a/src/connectors/minswap/amm-routes/quoteLiquidity.ts b/src/connectors/minswap/amm-routes/quoteLiquidity.ts index 40b8eb1479..63eabc7d1a 100644 --- a/src/connectors/minswap/amm-routes/quoteLiquidity.ts +++ b/src/connectors/minswap/amm-routes/quoteLiquidity.ts @@ -9,7 +9,6 @@ import { } from '../../../schemas/amm-schema'; import { logger } from '../../../services/logger'; import { Minswap } from '../minswap'; -import { Asset, DexV2Constant } from '@aiquant/minswap-sdk'; // ← pull in Asset helper + constants import { formatTokenAmount } from '../minswap.utils'; export async function getMinswapAmmLiquidityQuote( @@ -43,10 +42,9 @@ export async function getMinswapAmmLiquidityQuote( } const minswap = await Minswap.getInstance(networkToUse); - const cardano = await Cardano.getInstance(networkToUse); - const baseTokenObj = cardano.getTokenBySymbol(baseToken); - const quoteTokenObj = cardano.getTokenBySymbol(quoteToken); + const baseTokenObj = minswap.cardano.getTokenBySymbol(baseToken); + const quoteTokenObj = minswap.cardano.getTokenBySymbol(quoteToken); if (!baseTokenObj || !quoteTokenObj) { throw new Error( `Token not found: ${!baseTokenObj ? baseToken : quoteToken}`, @@ -74,13 +72,9 @@ export async function getMinswapAmmLiquidityQuote( let baseLimited = false; if (existingPool) { - // ── 1) Load the on‐chain pool state ───────────────────── - // For a V2 (Constant Product) pool, use the Cardano SDK's V2 "getPoolByPair" - const a = Asset.fromString(baseTokenObj.policyId + baseTokenObj.assetName); - const b = Asset.fromString( - quoteTokenObj.policyId + quoteTokenObj.assetName, - ); - const poolState = await minswap.blockfrostAdapter.getV2PoolByPair(a, b); + const { poolState, poolDatum } = + await minswap.getPoolData(poolAddressToUse); + if (!poolState) { throw new Error(`Unable to load pool ${poolAddressToUse}`); } @@ -160,11 +154,6 @@ export async function getMinswapAmmLiquidityQuote( ).toString(), ); - // ── 6) (Optional) pull router address if you later build txs ───── - const routerAddress = - DexV2Constant.CONFIG[networkToUse === 'mainnet' ? 1 : 0] - .poolCreationAddress; - return { baseLimited, baseTokenAmount: baseTokenAmountOptimal, @@ -176,7 +165,7 @@ export async function getMinswapAmmLiquidityQuote( poolAddress: poolAddressToUse, rawBaseTokenAmount, rawQuoteTokenAmount, - routerAddress, + routerAddress: 'N/A', }; } diff --git a/src/connectors/minswap/amm-routes/quoteSwap.ts b/src/connectors/minswap/amm-routes/quoteSwap.ts index 30ce571499..ef876dc6ce 100644 --- a/src/connectors/minswap/amm-routes/quoteSwap.ts +++ b/src/connectors/minswap/amm-routes/quoteSwap.ts @@ -8,7 +8,7 @@ import { GetSwapQuoteRequest, } from '../../../schemas/swap-schema'; import { logger } from '../../../services/logger'; -import { Minswap } from '../minswap'; // Added DexV2Calculation import +import { Minswap } from '../minswap'; import { formatTokenAmount } from '../minswap.utils'; import { Asset, @@ -23,6 +23,7 @@ async function quoteAmmSwap( quoteToken: CardanoTokenInfo, amount: number, // now always refers to quote‐token units side: 'BUY' | 'SELL', + slippagePct?: number, ): Promise { // BUY: you want to RECEIVE `amount` of quoteToken, paying baseToken // SELL: you want to SPEND `amount` of quoteToken, receiving baseToken @@ -46,28 +47,27 @@ async function quoteAmmSwap( policyId: quoteToken.policyId, tokenName: quoteToken.assetName, }; - const pool = await minswap.blockfrostAdapter.getV2PoolByPair(assetA, assetB); - if (!pool) + const { poolState, poolDatum } = await minswap.getPoolData(poolAddress); + + if (!poolState) throw new Error( `Pool not found for ${baseToken.symbol}-${quoteToken.symbol}`, ); // Figure out reserves & fee depending on input/output - const idA = pool.assetA; - const idB = pool.assetB; + const idA = poolState.assetA; + const idB = poolState.assetB; const assetIdIn = inputToken.symbol === 'ADA' ? 'lovelace' : inputToken.policyId + inputToken.assetName; - let reserveIn: bigint, reserveOut: bigint, feeNum: bigint; + let reserveIn: bigint, reserveOut: bigint; if (assetIdIn === idA) { - reserveIn = pool.reserveA; - reserveOut = pool.reserveB; - feeNum = pool.feeA[0]; + reserveIn = poolState.reserveA; + reserveOut = poolState.reserveB; } else if (assetIdIn === idB) { - reserveIn = pool.reserveB; - reserveOut = pool.reserveA; - feeNum = pool.feeA[1]; + reserveIn = poolState.reserveB; + reserveOut = poolState.reserveA; } else { throw new Error(`Input token not in pool`); } @@ -95,7 +95,6 @@ async function quoteAmmSwap( } // Slippage - const slippagePct = 0.5; const slipFactorNum = BigInt(Math.floor((100 - slippagePct) * 100)); // e.g. 99.5%→9950 const slipDenominator = 10000n; const minAmountOut = exactIn @@ -153,6 +152,7 @@ export async function getMinswapAmmQuote( quoteToken: string, amount: number, side: 'BUY' | 'SELL', + slippagePct?: number, ): Promise<{ quote: any; minswap: any; @@ -198,6 +198,7 @@ export async function getMinswapAmmQuote( quoteTokenObj, amount, side as 'BUY' | 'SELL', + slippagePct, ); if (!quote) { @@ -221,6 +222,7 @@ async function formatSwapQuote( 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}`, @@ -237,6 +239,7 @@ async function formatSwapQuote( quoteToken, amount, side, + slippagePct, ); logger.info( @@ -332,7 +335,6 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { const networkToUse = network || 'mainnet'; - console.log('working upto here'); const minswap = await Minswap.getInstance(networkToUse); let poolAddress = requestedPoolAddress; @@ -359,6 +361,7 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { quoteToken, amount, side as 'BUY' | 'SELL', + slippagePct, ); } catch (e) { logger.error(`Error in quote-swap route: ${e.message}`); diff --git a/src/connectors/minswap/amm-routes/removeLiquidity.ts b/src/connectors/minswap/amm-routes/removeLiquidity.ts index 543a64c953..956193bb0b 100644 --- a/src/connectors/minswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/minswap/amm-routes/removeLiquidity.ts @@ -126,8 +126,6 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const utxos = await minswap.cardano.lucidInstance.utxosAt(walletAddress); - console.log(utxos); - // 8) Calculate withdrawal amounts const totalLpInWallet = minswap.calculateAssetAmount( utxos, diff --git a/src/connectors/minswap/minswap.ts b/src/connectors/minswap/minswap.ts index 6a5103f77a..fe515730c1 100644 --- a/src/connectors/minswap/minswap.ts +++ b/src/connectors/minswap/minswap.ts @@ -23,7 +23,6 @@ export class Minswap { private static _instances: { [name: string]: Minswap }; public cardano: Cardano; public config: MinswapConfig.RootConfig; - public rootConfig: MinswapConfig.RootConfig; private owner?: PrivateKey; public blockfrostAdapter: BlockfrostAdapter; // Network information @@ -31,7 +30,7 @@ export class Minswap { private constructor(network: string) { this.networkName = network; - this.config = MinswapConfig.config as unknown as MinswapConfig.RootConfig; + this.config = MinswapConfig.config as MinswapConfig.RootConfig; this.cardano = null; } @@ -142,7 +141,7 @@ export class Minswap { }); return { - address: pool.address, + address: poolAddress, baseTokenAddress: pool.assetA, quoteTokenAddress: pool.assetB, feePct: 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..ab066aee1f --- /dev/null +++ b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts @@ -0,0 +1,187 @@ +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync } from 'fastify'; + +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'; +import { Assets, TxComplete } from '@aiquant/lucid-cardano'; +import { + EDatumType, + IDepositConfigArgs, + TSupportedNetworks, +} from '@aiquant/sundaeswap-core'; +import { AssetAmount, IAssetAmountMetadata } from '@sundaeswap/asset'; +import { + DatumBuilderLucidV3, + TxBuilderLucidV3, +} from '@aiquant/sundaeswap-core/lucid'; + +async function addLiquidity( + fastify: any, + network: string, + walletAddress: string, + poolAddress: string, + baseToken: string, + quoteToken: string, + baseTokenAmount: number, + quoteTokenAmount: number, + slippagePct?: number, // decimal, e.g. 0.01 for 1% +): 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); + + const depositArgs: IDepositConfigArgs = { + suppliedAssets: [ + new AssetAmount(quote.rawBaseTokenAmount, quote.poolData.assetA), + new AssetAmount(quote.rawQuoteTokenAmount, quote.poolData.assetB), + ] as [AssetAmount, AssetAmount], // Explicit tuple + 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 }); + // console.log(result); + + const builtTx = await result.build(); + // console.log(builtTx); + + const { submit } = await builtTx.sign(); + // console.log(submit); + + const txHash = await submit(); + + return { + signature: txHash, + 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: ['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, + baseToken, + quoteToken, + baseTokenAmount, + quoteTokenAmount, + slippagePct, + walletAddress: reqWallet, + } = request.body; + + if ( + !baseToken || + !quoteToken || + !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'); + } + + const poolAddr = + reqPool || + (await sundaeswap.findDefaultPool(baseToken, quoteToken, 'amm')); + if (!poolAddr) { + throw fastify.httpErrors.notFound( + `Pool not found for ${baseToken}-${quoteToken}`, + ); + } + + return await addLiquidity( + fastify, + network || 'mainnet', + walletAddr, + poolAddr, + 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/sundaeswap/amm-routes/executeSwap.ts b/src/connectors/sundaeswap/amm-routes/executeSwap.ts new file mode 100644 index 0000000000..f8969dfdc2 --- /dev/null +++ b/src/connectors/sundaeswap/amm-routes/executeSwap.ts @@ -0,0 +1,256 @@ +import { FastifyPluginAsync } from 'fastify'; +import { + ExecuteSwapRequestType, + ExecuteSwapRequest, + ExecuteSwapResponseType, + ExecuteSwapResponse, +} from '../../../schemas/swap-schema'; +import { logger } from '../../../services/logger'; +import { Sundaeswap } from '../sundaeswap'; +import { formatTokenAmount } from '../sundaeswap.utils'; +import { + EDatumType, + ESwapType, + ISwapConfigArgs, + TSupportedNetworks, +} from '@aiquant/sundaeswap-core'; +import { + DatumBuilderLucidV3, + TxBuilderLucidV3, +} from '@aiquant/sundaeswap-core/lucid'; +import { AssetAmount, IAssetAmountMetadata } from '@sundaeswap/asset'; +import { BigNumber } from 'ethers'; +import { CardanoTokenInfo } from '../../../chains/cardano/cardano'; + +export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { + await fastify.register(require('@fastify/sensible')); + + fastify.post<{ + Body: ExecuteSwapRequestType; + Reply: ExecuteSwapResponseType; + }>( + '/execute-swap', + { + schema: { + description: 'Execute a swap on Sundaeswap AMM (Cardano)', + tags: ['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 quote amount + side: { type: 'string', enum: ['BUY', 'SELL'] }, + poolAddress: { type: 'string' }, + slippagePct: { type: 'number', examples: [1] }, + }, + }, + response: { 200: ExecuteSwapResponse }, + }, + }, + async (request) => { + try { + const { + network, + walletAddress: reqAddr, + baseToken, + quoteToken, + amount, + side, + slippagePct = 1, + poolAddress: reqPool, + } = 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 = + reqPool || + (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'); + } + + // 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); + + // Determine which token corresponds to which asset in the pool + const baseAssetId = + baseTokenObj.address || + `${baseTokenObj.policyId}.${baseTokenObj.assetName}`; + const quoteAssetId = + quoteTokenObj.address || + `${quoteTokenObj.policyId}.${quoteTokenObj.assetName}`; + + let baseReserve: bigint; + let quoteReserve: bigint; + + // Match tokens to pool reserves + if (baseAssetId.trim() === assetA) { + baseReserve = reserveA; + quoteReserve = reserveB; + } else if (baseAssetId.trim() === assetB) { + baseReserve = reserveB; + quoteReserve = reserveA; + } else { + throw fastify.httpErrors.badRequest( + `Base token ${baseAssetId} not found in pool`, + ); + } + + // Validate quote token is in the pool + const quoteInPool = + quoteAssetId.trim() === assetA || quoteAssetId.trim() === assetB; + if (!quoteInPool) { + throw fastify.httpErrors.badRequest( + `Quote token ${quoteAssetId} not found in pool`, + ); + } + + // Convert amount to smallest units and calculate swap amounts + const fee = poolData.currentFee; // e.g., 0.005 for 0.5% + let inputAmount: bigint; + let outputAmount: bigint; + let inputTokenObj: CardanoTokenInfo; + let outputTokenObj: CardanoTokenInfo; + + if (side === 'SELL') { + // SELL: spending `amount` of quoteToken, receiving baseToken + inputTokenObj = quoteTokenObj; + outputTokenObj = baseTokenObj; + inputAmount = BigInt( + Math.floor(amount * 10 ** quoteTokenObj.decimals), + ); + + // Apply AMM formula for sell (exactIn): dy = (y * dx * (1 - fee)) / (x + dx * (1 - fee)) + const inputAfterFee = + (inputAmount * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; + outputAmount = + (baseReserve * inputAfterFee) / (quoteReserve + inputAfterFee); + } else { + // BUY: wanting to receive `amount` of quoteToken, paying baseToken + inputTokenObj = baseTokenObj; + outputTokenObj = quoteTokenObj; + outputAmount = BigInt( + Math.floor(amount * 10 ** quoteTokenObj.decimals), + ); + + // Check if we have enough liquidity + if (outputAmount >= quoteReserve) { + throw fastify.httpErrors.badRequest( + 'Insufficient liquidity: requested amount exceeds available reserves', + ); + } + + // Apply AMM formula for buy (exactOut): dx = (x * dy) / ((y - dy) * (1 - fee)) + const numerator = baseReserve * outputAmount; + const denominator = + ((quoteReserve - outputAmount) * + BigInt(Math.floor((1 - fee) * 10000))) / + 10000n; + inputAmount = numerator / denominator; + } + + // Prepare asset metadata for the input token + const asset: IAssetAmountMetadata = + inputTokenObj.symbol === 'ADA' + ? { + assetId: 'ada.lovelace', + decimals: 6, + } + : { + assetId: + inputTokenObj.address || + `${inputTokenObj.policyId}.${inputTokenObj.assetName}`, + decimals: inputTokenObj.decimals, + }; + + // Prepare suppliedAsset + let 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 }); + console.log('working upto here', swapResult); + + const builtTx = await swapResult.build(); + console.log('working upto here!', builtTx); + const { submit } = await builtTx.sign(); + + const txHash = await submit(); + + // Format response values - convert back to human readable amounts + const inputAmountHuman = + Number(inputAmount) / 10 ** inputTokenObj.decimals; + const outputAmountHuman = + Number(outputAmount) / 10 ** outputTokenObj.decimals; + + // Calculate balance changes + const baseTokenBalanceChange = + side === 'BUY' ? outputAmountHuman : -inputAmountHuman; + const quoteTokenBalanceChange = + side === 'BUY' ? -inputAmountHuman : outputAmountHuman; + + return { + signature: txHash, + totalInputSwapped: inputAmountHuman, + totalOutputSwapped: 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..b50268fc49 --- /dev/null +++ b/src/connectors/sundaeswap/amm-routes/poolInfo.ts @@ -0,0 +1,82 @@ +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: ['sundaeswap/amm'], + querystring: { + ...GetPoolInfoRequest, + properties: { + network: { type: 'string', examples: ['mainnet'] }, + poolIdent: { + type: 'string', + examples: [ + '2f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773', + ], + }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['SUNDAE'] }, + }, + }, + response: { + 200: PoolInfoSchema, + }, + }, + }, + async (request): Promise => { + try { + const { poolAddress: poolIdent, baseToken, quoteToken } = request.query; + const network = request.query.network || 'mainnet'; + + const sundaeswap = await Sundaeswap.getInstance(network); + + // Check if either poolIdent or both baseToken and quoteToken are provided + if (!poolIdent && (!baseToken || !quoteToken)) { + throw fastify.httpErrors.badRequest( + 'Either poolIdent or both baseToken and quoteToken must be provided', + ); + } + + let poolIdentToUse = poolIdent; + + // If no pool address provided, find default pool using base and quote tokens + if (!poolIdentToUse) { + poolIdentToUse = await sundaeswap.findDefaultPool( + baseToken, + quoteToken, + 'amm', + ); + if (!poolIdentToUse) { + throw fastify.httpErrors.notFound( + `No AMM pool found for pair ${baseToken}-${quoteToken}`, + ); + } + } + + const poolInfo = await sundaeswap.getAmmPoolInfo(poolIdentToUse); + 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..8cc935c780 --- /dev/null +++ b/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts @@ -0,0 +1,246 @@ +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync } from 'fastify'; +import { Cardano, CardanoTokenInfo } from '../../../chains/cardano/cardano'; +import { + QuoteLiquidityRequestType, + QuoteLiquidityRequest, + QuoteLiquidityResponseType, + QuoteLiquidityResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Sundaeswap } from '../sundaeswap'; +import { formatTokenAmount } from '../sundaeswap.utils'; +import { IPoolData } from '@aiquant/sundaeswap-core'; + +export async function getSundaeswapAmmLiquidityQuote( + network: string, + poolAddress?: string, + baseToken?: string, + quoteToken?: string, + baseTokenAmount?: number, + quoteTokenAmount?: number, + _slippagePct?: number, +): Promise<{ + baseLimited: boolean; + baseTokenAmount: number; + quoteTokenAmount: number; + baseTokenAmountMax: number; + quoteTokenAmountMax: number; + baseTokenObj: CardanoTokenInfo; + quoteTokenObj: CardanoTokenInfo; + 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); + + const baseTokenObj = sundaeswap.cardano.getTokenBySymbol(baseToken); + const quoteTokenObj = sundaeswap.cardano.getTokenBySymbol(quoteToken); + if (!baseTokenObj || !quoteTokenObj) { + throw new Error( + `Token not found: ${!baseTokenObj ? baseToken : quoteToken}`, + ); + } + + let poolAddressToUse = poolAddress; + let existingPool = true; + if (!poolAddressToUse) { + poolAddressToUse = await sundaeswap.findDefaultPool( + baseToken, + quoteToken, + '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) { + // Get pool state from Sundaeswap (adjust method name based on their SDK) + poolState = await sundaeswap.getPoolData(poolAddressToUse); + if (!poolState) { + throw new Error(`Unable to load pool ${poolAddressToUse}`); + } + + // ── 2) Pull reserves as bigints ──────────────────────── + // Adjust property names based on Sundaeswap's pool structure + const baseReserve: bigint = poolState.liquidity.aReserve || BigInt(0); + const quoteReserve: bigint = poolState.liquidity.bReserve || BigInt(0); + + // ── 3) Convert user inputs into raw bigints ─────────── + const baseRaw = baseTokenAmount + ? BigInt( + Math.floor(baseTokenAmount * 10 ** baseTokenObj.decimals).toString(), + ) + : null; + const quoteRaw = quoteTokenAmount + ? BigInt( + Math.floor( + quoteTokenAmount * 10 ** quoteTokenObj.decimals, + ).toString(), + ) + : null; + + // ── 4) 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(), quoteTokenObj.decimals), + ); + } else { + baseLimited = false; + const baseOptimal = (quoteRaw * baseReserve) / quoteReserve; + baseTokenAmountOptimal = Number( + formatTokenAmount(baseOptimal.toString(), baseTokenObj.decimals), + ); + } + } else if (baseRaw !== null) { + // only base provided + const quoteOptimal = + baseReserve === BigInt(0) + ? BigInt(0) + : (baseRaw * quoteReserve) / baseReserve; + quoteTokenAmountOptimal = Number( + formatTokenAmount(quoteOptimal.toString(), quoteTokenObj.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(), baseTokenObj.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 + } + + // ── 5) Convert back into Ethers BigNumber for any on‐chain tx ─── + const rawBaseTokenAmount = Math.floor( + baseTokenAmountOptimal * 10 ** baseTokenObj.decimals, + ).toString(); + + const rawQuoteTokenAmount = Math.floor( + quoteTokenAmountOptimal * 10 ** quoteTokenObj.decimals, + ).toString(); + + return { + baseLimited, + baseTokenAmount: baseTokenAmountOptimal, + quoteTokenAmount: quoteTokenAmountOptimal, + baseTokenAmountMax: baseTokenAmount ?? baseTokenAmountOptimal, + quoteTokenAmountMax: quoteTokenAmount ?? quoteTokenAmountOptimal, + baseTokenObj, + quoteTokenObj, + 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: ['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, + baseToken, + quoteToken, + baseTokenAmount, + quoteTokenAmount, + slippagePct, + } = request.query; + + 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..b237e123f8 --- /dev/null +++ b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts @@ -0,0 +1,404 @@ +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync, FastifyInstance } from 'fastify'; +import { CardanoTokenInfo } from '../../../chains/cardano/cardano'; +import { + GetSwapQuoteResponseType, + GetSwapQuoteResponse, + GetSwapQuoteRequestType, + GetSwapQuoteRequest, +} from '../../../schemas/swap-schema'; +import { logger } from '../../../services/logger'; +import { Sundaeswap } from '../sundaeswap'; +import { formatTokenAmount } from '../sundaeswap.utils'; + +export async function quoteAmmSwap( + sundaeswap: Sundaeswap, + poolIdent: string, + baseToken: CardanoTokenInfo, + quoteToken: CardanoTokenInfo, + amount: number, // now always refers to quote‐token units + side: 'BUY' | 'SELL', + slippagePct: number = 1, // Default to 1% if not provided +): Promise { + // BUY: you want to RECEIVE `amount` of quoteToken, paying baseToken + // SELL: you want to SPEND `amount` of quoteToken, receiving baseToken + 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); + + // Determine which token corresponds to which asset in the pool + const baseAssetId = + baseToken.address || `${baseToken.policyId}.${baseToken.assetName}`; + const quoteAssetId = + quoteToken.address || `${quoteToken.policyId}.${quoteToken.assetName}`; + + let baseReserve: bigint; + let quoteReserve: bigint; + + // Match tokens to pool reserves + if (baseAssetId.trim() === assetA) { + baseReserve = reserveA; + quoteReserve = reserveB; + } else if (baseAssetId.trim() === assetB) { + baseReserve = reserveB; + quoteReserve = reserveA; + } else { + throw new Error(`Base token ${baseAssetId} not found in pool`); + } + + // Validate quote token is in the pool + const quoteInPool = + quoteAssetId.trim() === assetA || quoteAssetId.trim() === assetB; + if (!quoteInPool) { + throw new Error(`Quote token ${quoteAssetId} not found in pool`); + } + + // Convert amount to smallest units + const fee = poolData.currentFee; // e.g., 0.005 for 0.5% + let inputAmount: bigint; + let outputAmount: bigint; + + if (side === 'SELL') { + // SELL: spending `amount` of quoteToken, receiving baseToken + // This is exactIn scenario + inputAmount = BigInt(Math.floor(amount * 10 ** quoteToken.decimals)); + + // Apply AMM formula for sell (exactIn): dy = (y * dx * (1 - fee)) / (x + dx * (1 - fee)) + const inputAfterFee = + (inputAmount * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; + outputAmount = + (baseReserve * inputAfterFee) / (quoteReserve + inputAfterFee); + } else { + // BUY: wanting to receive `amount` of quoteToken, paying baseToken + // This is exactOut scenario + outputAmount = BigInt(Math.floor(amount * 10 ** quoteToken.decimals)); + + // Check if we have enough liquidity + if (outputAmount >= quoteReserve) { + throw new Error( + 'Insufficient liquidity: requested amount exceeds available reserves', + ); + } + + // Apply AMM formula for buy (exactOut): dx = (x * dy) / ((y - dy) * (1 - fee)) + const numerator = baseReserve * outputAmount; + const denominator = + ((quoteReserve - outputAmount) * BigInt(Math.floor((1 - fee) * 10000))) / + 10000n; + inputAmount = numerator / denominator; + } + + // Calculate slippage protection amounts + const slippageTolerance = slippagePct / 100; + const slippageMultiplier = BigInt( + Math.floor((1 - slippageTolerance) * 10000), + ); + const slippageDenominator = 10000n; + + const minAmountOut = + side === 'SELL' + ? (outputAmount * slippageMultiplier) / slippageDenominator + : outputAmount; + + const maxAmountIn = + side === 'BUY' + ? (inputAmount * + (slippageDenominator + + BigInt(Math.floor(slippageTolerance * 10000)))) / + slippageDenominator + : inputAmount; + + // Calculate price impact + const midPrice = + Number(baseReserve) / + 10 ** baseToken.decimals / + (Number(quoteReserve) / 10 ** quoteToken.decimals); + + const executionPrice = + Number(inputAmount) / + 10 ** baseToken.decimals / + (Number(outputAmount) / 10 ** quoteToken.decimals); + + const priceImpact = Math.abs((executionPrice - midPrice) / midPrice); + + // Determine which token is input and output based on side + const inputToken = side === 'SELL' ? quoteToken : baseToken; + const outputToken = side === 'SELL' ? baseToken : quoteToken; + + // 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 || `${inputToken.policyId}.${inputToken.assetName}`, + outputToken.address || `${outputToken.policyId}.${outputToken.assetName}`, + ], + }; +} + +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, + }; +} + +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 { + // Use the extracted quote function with slippage percentage + 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}`, + ); + + // Calculate balance changes based on which tokens are being swapped + 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 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 { + estimatedAmountIn: quote.estimatedAmountIn, + estimatedAmountOut: quote.estimatedAmountOut, + minAmountOut: quote.minAmountOut, + maxAmountIn: quote.maxAmountIn, + baseTokenBalanceChange, + quoteTokenBalanceChange, + price, + gasPrice: 0, + gasLimit: 0, + gasCost: 0, + }; + } 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: GetSwapQuoteRequestType; + Reply: GetSwapQuoteResponseType; + }>( + '/quote-swap', + { + schema: { + description: 'Get swap quote for Sundaeswap AMM', + tags: ['sundaeswap/amm'], + querystring: { + ...GetSwapQuoteRequest, + properties: { + ...GetSwapQuoteRequest.properties, + network: { type: 'string', default: 'mainnet' }, + baseToken: { type: 'string', examples: ['ADA'] }, + quoteToken: { type: 'string', examples: ['SUNDAE'] }, + amount: { type: 'number', examples: [0.001] }, + side: { type: 'string', enum: ['BUY', 'SELL'], examples: ['SELL'] }, + poolIdent: { type: 'string', examples: [''] }, + slippagePct: { type: 'number', examples: [1] }, + }, + }, + response: { + 200: { + properties: { + ...GetSwapQuoteResponse.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 + + console.log('working upto here'); + 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..3ac32d2d79 --- /dev/null +++ b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts @@ -0,0 +1,214 @@ +import { BigNumber } from 'ethers'; +import { FastifyPluginAsync } from 'fastify'; + +import { Cardano } from '../../../chains/cardano/cardano'; +import { + RemoveLiquidityRequestType, + RemoveLiquidityRequest, + RemoveLiquidityResponseType, + RemoveLiquidityResponse, +} from '../../../schemas/amm-schema'; +import { logger } from '../../../services/logger'; +import { Sundaeswap } from '../sundaeswap'; + +import { formatTokenAmount } from '../sundaeswap.utils'; +import { AssetAmount } from '@sundaeswap/asset'; +import { + EDatumType, + IWithdrawConfigArgs, + TSupportedNetworks, +} from '@aiquant/sundaeswap-core'; +import { + DatumBuilderLucidV3, + TxBuilderLucidV3, +} from '@aiquant/sundaeswap-core/lucid'; + +export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { + fastify.post<{ + Body: RemoveLiquidityRequestType; + Reply: RemoveLiquidityResponseType; + }>( + '/remove-liquidity', + { + schema: { + description: 'Remove liquidity from a Sundaeswap pool', + tags: ['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, + baseToken, + quoteToken, + percentageToRemove, + walletAddress: requestedWalletAddress, + } = request.body; + + const networkToUse = network || 'mainnet'; + + // Validate essential parameters + if (!baseToken || !quoteToken || !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', + ); + } + + // Get Uniswap and Ethereum instances + const sundaeswap = await Sundaeswap.getInstance(networkToUse); + + // Get wallet address - either from request or first available + 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}`); + } + + // Resolve tokens + const baseTokenObj = sundaeswap.cardano.getTokenBySymbol(baseToken); + const quoteTokenObj = sundaeswap.cardano.getTokenBySymbol(quoteToken); + + if (!baseTokenObj || !quoteTokenObj) { + throw fastify.httpErrors.badRequest( + `Token not found: ${!baseTokenObj ? baseToken : quoteToken}`, + ); + } + + // Find pool address if not provided + let poolAddress = requestedPoolAddress; + if (!poolAddress) { + poolAddress = await sundaeswap.findDefaultPool( + baseToken, + quoteToken, + 'amm', + ); + + if (!poolAddress) { + throw fastify.httpErrors.notFound( + `No AMM pool found for pair ${baseToken}-${quoteToken}`, + ); + } + } + + const poolData = await sundaeswap.getPoolData(poolAddress); + const utxos = + await sundaeswap.cardano.lucidInstance.utxosAt(walletAddress); + + // 8) Calculate withdrawal amounts + const totalLpInWallet = sundaeswap.calculateAssetAmount( + utxos, + poolData.assetLP, + ); + console.log('totalLpInWallet', totalLpInWallet); + // Calculate how much LP token will be withdrawn based on the percentage + const withdrawalAmount = BigInt( + (BigInt(totalLpInWallet) * BigInt(percentageToRemove)) / BigInt(100), + ); + // console.log('withdrawalAmount', withdrawalAmount); + + // Define the LP Token to withdraw + const lpTokenAmount = new AssetAmount( + withdrawalAmount, + poolData.assetLP, + ); // Specify LP token amount + // console.log(lpTokenAmount); + + // Build withdraw arguments (Added `pool` property) + 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(); + // Sign and submit the transaction + const { submit, cbor } = await builtTx.sign(); + const txHash = await submit(); + + // Calculate the proportional amounts that will be received + const totalLpSupply = poolData.liquidity.lpTotal; // Total LP token supply + const lpTokensToWithdraw = withdrawalAmount; // Amount of LP tokens being withdrawn + + // Calculate the proportion of the pool being withdrawn + const withdrawalProportion = + Number(lpTokensToWithdraw) / Number(totalLpSupply); + + // Get current pool reserves + const baseTokenReserve = poolData.liquidity.aReserve; // Base token reserve in the pool + const quoteTokenReserve = poolData.liquidity.bReserve; // Quote token reserve in the pool + + // Calculate the amounts that will be received (proportional to LP tokens withdrawn) + const baseTokenAmountRemoved = Math.floor( + Number(baseTokenReserve) * withdrawalProportion, + ); + + const quoteTokenAmountRemoved = Math.floor( + Number(quoteTokenReserve) * withdrawalProportion, + ); + + return { + signature: txHash, + fee: builtTx.builtTx.fee, + baseTokenAmountRemoved: baseTokenAmountRemoved, + quoteTokenAmountRemoved: 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.routes.ts b/src/connectors/sundaeswap/sundaeswap.routes.ts new file mode 100644 index 0000000000..e143533b5f --- /dev/null +++ b/src/connectors/sundaeswap/sundaeswap.routes.ts @@ -0,0 +1,33 @@ +import sensible from '@fastify/sensible'; +import type { FastifyPluginAsync } from 'fastify'; +import { ammPoolInfoRoute } from './amm-routes/poolInfo'; +import { quoteSwapRoute as ammQuoteSwapRoute } from './amm-routes/quoteSwap'; +import quoteLiquidityRoute from './amm-routes/quoteLiquidity'; +import { executeSwapRoute as ammExecuteSwapRoute } from './amm-routes/executeSwap'; +import { addLiquidityRoute as ammAddLiquidityRoute } from './amm-routes/addLiquidity'; +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 = ['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..27cb5bea99 --- /dev/null +++ b/src/connectors/sundaeswap/sundaeswap.ts @@ -0,0 +1,184 @@ +// 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 { Cardano, CardanoTokenInfo } from '../../chains/cardano/cardano'; +import { PrivateKey, UTxO } from '@aiquant/lucid-cardano'; +import { + IPoolDataAsset, + QueryProviderSundaeSwap, + TSupportedNetworks, +} from '@aiquant/sundaeswap-core'; + +import { + percentRegexp, + ConfigManagerV2, +} from '../../services/config-manager-v2'; +import { logger } from '../../services/logger'; + +import { SundaeswapConfig } from './sundaeswap.config'; +import { PoolInfo } from '../../schemas/amm-schema'; +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 info: PoolInfo = { + address: raw.ident, + baseTokenAddress: raw.assetA.assetId, + quoteTokenAddress: raw.assetB.assetId, + feePct: raw.currentFee * 100, + price: + raw.liquidity.aReserve > 0n + ? Number(raw.liquidity.aReserve) / Number(raw.liquidity.bReserve) + : 0, + baseTokenAmount: Number(raw.liquidity.aReserve), // ← explicit cast + quoteTokenAmount: Number(raw.liquidity.bReserve), // ← explicit cast + poolType: 'amm', + lpMint: { + address: raw.assetLP.assetId, + decimals: raw.assetLP.decimals, + }, + }; + + 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 assetValue = utxo.assets[asset.assetId]; + 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/templates/connectors/sundaeswap.yml b/src/templates/connectors/sundaeswap.yml index 9fe4a45a04..9927720322 100644 --- a/src/templates/connectors/sundaeswap.yml +++ b/src/templates/connectors/sundaeswap.yml @@ -9,11 +9,14 @@ networks: # AMM pools for Cardano mainnet amm: # Format: base-quote: pool_address - ADA-SUNDAE: '2baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3' + ADA-SUNDAE: '2f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773' - # Cardano preprod pools - preprod: + # Cardano preview pools + preview: # AMM pools for Cardano preprod amm: # Format: base-quote: pool_address - ADA-SBERRY: '2f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773' + ADA-SBERRY: '2baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3' + + + 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..5a55f3a4c0 --- /dev/null +++ b/test/chains/cardano/wallet.test.ts @@ -0,0 +1,339 @@ +// 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(), +}; + +beforeAll(async () => { + patch(ConfigManagerCertPassphrase, 'readPassphrase', () => 'a'); + cardano = await Cardano.getInstance('preprod'); + await gatewayApp.ready(); +}); + +beforeEach(() => { + patch(ConfigManagerCertPassphrase, 'readPassphrase', () => 'a'); + + // Clear mock wallets + mockWallets.cardano.clear(); + + // Mock wallet operations to work with in-memory storage + 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 () => { + 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 From 3733a0cf9d65bb349de3c895c9a9eba5162ae445 Mon Sep 17 00:00:00 2001 From: Aiquant1 Date: Wed, 9 Jul 2025 17:26:16 +0530 Subject: [PATCH 06/12] Fixed remove_liquidity action for sundaeswap and remove unnecessary logs --- src/chains/cardano/cardano.ts | 4 - .../minswap/amm-routes/executeSwap.ts | 69 ++++++++++------- .../minswap/amm-routes/quoteSwap.ts | 74 ++++++++++++------- .../minswap/amm-routes/removeLiquidity.ts | 3 - .../sundaeswap/amm-routes/addLiquidity.ts | 6 -- .../sundaeswap/amm-routes/executeSwap.ts | 22 ++++-- .../sundaeswap/amm-routes/quoteSwap.ts | 21 ++++-- .../sundaeswap/amm-routes/removeLiquidity.ts | 14 ++-- src/connectors/sundaeswap/sundaeswap.ts | 10 ++- 9 files changed, 137 insertions(+), 86 deletions(-) diff --git a/src/chains/cardano/cardano.ts b/src/chains/cardano/cardano.ts index 5e64e07aec..39c45e213d 100644 --- a/src/chains/cardano/cardano.ts +++ b/src/chains/cardano/cardano.ts @@ -188,7 +188,6 @@ export class Cardano { } tokenAdress = token.policyId + token.assetName; - // console.log('tokenAdress', tokenAdress); const Lucid = this.getLucid(); Lucid.selectWalletFromPrivateKey(privateKey); @@ -306,7 +305,6 @@ export class Cardano { // Parse the response JSON const tx = await response.json(); - console.log(tx); // Simplify the response for the bot return { @@ -397,10 +395,8 @@ export class Cardano { TOKEN_NOT_SUPPORTED_ERROR_CODE, ); } - // console.log("tokenInfo", tokenInfo); tokenAddress = tokenInfo[0]?.policyId + tokenInfo[0]?.assetName; - // console.log("tokenAdress", tokenAddress); return tokenAddress; } diff --git a/src/connectors/minswap/amm-routes/executeSwap.ts b/src/connectors/minswap/amm-routes/executeSwap.ts index 00ad0ce332..aaa6234d57 100644 --- a/src/connectors/minswap/amm-routes/executeSwap.ts +++ b/src/connectors/minswap/amm-routes/executeSwap.ts @@ -91,7 +91,6 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { }; // On‑chain reserves - console.log('working upto here', poolAddr); const { poolState, poolDatum } = await minswap.getPoolData(poolAddr); if (!poolState) { @@ -100,10 +99,6 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { const baseReserve = poolState.reserveA; const quoteReserve = poolState.reserveB; - // 1) interpret `amount` as quoteUnits - const amountIn = BigInt( - Math.floor(amount * 10 ** quoteInfo.decimals).toString(), - ); const pct = BigInt(slippagePct); // 2) build via SDK @@ -113,17 +108,25 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { const dex = new Dex(minswap.cardano.lucidInstance); let txBuild: TxComplete; - let rawOut: bigint; + let baseAmountChange: number; + let quoteAmountChange: number; + let totalInputSwapped: number; + let totalOutputSwapped: number; if (side === 'SELL') { - // SELL quote → receive base (exact‑in) + // SELL: selling quote tokens to get base tokens + // `amount` is the amount of quote tokens to sell (input) + const amountIn = BigInt( + Math.floor(amount * 10 ** quoteInfo.decimals).toString(), + ); + const { amountOut: idealBaseOut } = calculateSwapExactIn({ amountIn, reserveIn: quoteReserve, reserveOut: baseReserve, }); const minBaseOut = (idealBaseOut * (100n - pct)) / 100n; - rawOut = minBaseOut; + txBuild = await dex.buildSwapExactInTx({ sender: walletAddr, availableUtxos: @@ -134,10 +137,23 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { minimumAmountOut: minBaseOut, isLimitOrder: false, }); + + // SELL: spending quote tokens (-), receiving base tokens (+) + quoteAmountChange = -Number(amount); + baseAmountChange = +Number( + formatTokenAmount(minBaseOut.toString(), baseInfo.decimals), + ); + totalInputSwapped = amount; // quote tokens spent + totalOutputSwapped = Number( + formatTokenAmount(minBaseOut.toString(), baseInfo.decimals), + ); // base tokens received } else { - // BUY quote → means you want exactly `amountIn` quote out, spending base (exact‑out) - const exactQuoteOut = amountIn; - rawOut = exactQuoteOut; + // BUY: buying quote tokens with base tokens + // `amount` is the amount of quote tokens to buy (output) + const exactQuoteOut = BigInt( + Math.floor(amount * 10 ** quoteInfo.decimals).toString(), + ); + const { amountIn: idealBaseIn } = calculateSwapExactOut({ exactAmountOut: exactQuoteOut, reserveIn: baseReserve, @@ -155,6 +171,16 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { assetOut: quoteToken === 'ADA' ? ADA : assetB, expectedAmountOut: exactQuoteOut, }); + + // BUY: spending base tokens (-), receiving quote tokens (+) + baseAmountChange = -Number( + formatTokenAmount(maxBaseIn.toString(), baseInfo.decimals), + ); + quoteAmountChange = +Number(amount); + totalInputSwapped = Number( + formatTokenAmount(maxBaseIn.toString(), baseInfo.decimals), + ); // base tokens spent + totalOutputSwapped = amount; // quote tokens received } // 3) sign & submit @@ -164,24 +190,11 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { return { signature: txHash, - totalInputSwapped: amount, // quote in - totalOutputSwapped: Number( - formatTokenAmount( - rawOut.toString(), - side === 'SELL' ? baseInfo.decimals : quoteInfo.decimals, - ), - ), + totalInputSwapped: totalInputSwapped, + totalOutputSwapped: totalOutputSwapped, fee: txBuild.fee, - // for SELL: base balance goes +, quote goes − - // for BUY: quote goes +, base goes − - baseTokenBalanceChange: - side === 'SELL' - ? +formatTokenAmount(rawOut.toString(), baseInfo.decimals) - : -Number(amount), - quoteTokenBalanceChange: - side === 'SELL' - ? -Number(amount) - : +formatTokenAmount(rawOut.toString(), quoteInfo.decimals), + baseTokenBalanceChange: baseAmountChange, + quoteTokenBalanceChange: quoteAmountChange, }; } catch (err: any) { logger.error('Swap failed:', err); diff --git a/src/connectors/minswap/amm-routes/quoteSwap.ts b/src/connectors/minswap/amm-routes/quoteSwap.ts index ef876dc6ce..83878df97e 100644 --- a/src/connectors/minswap/amm-routes/quoteSwap.ts +++ b/src/connectors/minswap/amm-routes/quoteSwap.ts @@ -15,6 +15,7 @@ import { calculateSwapExactIn, calculateSwapExactOut, } from '@aiquant/minswap-sdk'; +import { BN } from 'bn.js'; async function quoteAmmSwap( minswap: Minswap, @@ -33,20 +34,25 @@ async function quoteAmmSwap( const inputToken = exactIn ? quoteToken : baseToken; const outputToken = exactIn ? baseToken : quoteToken; - // Convert `amount` to smallest‐unit of the input token - const amountInSmallestUnit = BigNumber.from( - Math.floor(amount * 10 ** inputToken.decimals), - ).toBigInt(); + // FIXED: Convert `amount` to smallest‐unit based on what the amount represents + // For BUY: amount = desired quoteToken amount (output) + // For SELL: amount = available quoteToken amount (input) + let amountInSmallestUnit: bigint; + + if (side === 'BUY') { + // For BUY, amount represents the desired quoteToken (output), but we need exactOut calculation + // So convert amount using quoteToken decimals + amountInSmallestUnit = BigNumber.from( + Math.floor(amount * 10 ** quoteToken.decimals), + ).toBigInt(); + } else { + // For SELL, amount represents the quoteToken to spend (input) + // So convert amount using quoteToken decimals + amountInSmallestUnit = BigNumber.from( + Math.floor(amount * 10 ** quoteToken.decimals), + ).toBigInt(); + } - // Fetch the pool - const assetA: Asset = { - policyId: baseToken.policyId, - tokenName: baseToken.assetName, - }; - const assetB: Asset = { - policyId: quoteToken.policyId, - tokenName: quoteToken.assetName, - }; const { poolState, poolDatum } = await minswap.getPoolData(poolAddress); if (!poolState) @@ -75,6 +81,7 @@ async function quoteAmmSwap( // Do the math let inputAmount: bigint, outputAmount: bigint, priceImpact: number; if (exactIn) { + // SELL: spending exact amount of quoteToken inputAmount = amountInSmallestUnit; const { amountOut, priceImpact: pi } = calculateSwapExactIn({ amountIn: inputAmount, @@ -84,7 +91,8 @@ async function quoteAmmSwap( outputAmount = amountOut; priceImpact = pi.toNumber(); } else { - outputAmount = amountInSmallestUnit; // you want exactly this many quote + // BUY: want to receive exact amount of quoteToken + outputAmount = amountInSmallestUnit; const { amountIn, priceImpact: pi } = calculateSwapExactOut({ exactAmountOut: outputAmount, reserveIn, @@ -94,17 +102,22 @@ async function quoteAmmSwap( priceImpact = pi.toNumber(); } - // Slippage - const slipFactorNum = BigInt(Math.floor((100 - slippagePct) * 100)); // e.g. 99.5%→9950 - const slipDenominator = 10000n; + const effectiveSlippage = + slippagePct !== undefined + ? slippagePct / 100 + : minswap.getAllowedSlippage(); + const minAmountOut = exactIn - ? (outputAmount * slipFactorNum) / slipDenominator + ? new BN(outputAmount.toString()) + .mul(new BN(Math.floor((1 - effectiveSlippage) * 10000))) + .div(new BN(10000)) : outputAmount; + const maxAmountIn = exactIn ? inputAmount - : (inputAmount * - (slipDenominator + BigInt(Math.round(slippagePct * 100)))) / - slipDenominator; + : new BN(inputAmount.toString()) + .mul(new BN(Math.floor((1 + effectiveSlippage) * 10000))) + .div(new BN(10000)); // Format human‐readable const estimatedIn = formatTokenAmount( @@ -247,10 +260,21 @@ async function formatSwapQuote( ); // Calculate balance changes based on which tokens are being swapped - const baseTokenBalanceChange = - side === 'BUY' ? quote.estimatedAmountOut : -quote.estimatedAmountIn; - const quoteTokenBalanceChange = - side === 'BUY' ? -quote.estimatedAmountIn : quote.estimatedAmountOut; + // 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}`, diff --git a/src/connectors/minswap/amm-routes/removeLiquidity.ts b/src/connectors/minswap/amm-routes/removeLiquidity.ts index 956193bb0b..596d0affa4 100644 --- a/src/connectors/minswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/minswap/amm-routes/removeLiquidity.ts @@ -131,13 +131,10 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { utxos, poolState.assetLP, ); - console.log('totalLpInWallet', totalLpInWallet); const withdrawLpAmount = (totalLpInWallet * BigInt(percentageToRemove)) / 100n; - console.log('withdrawLpAmount', withdrawLpAmount); - // 9) Calculate the assets to be received upon withdrawal const { amountAReceive, amountBReceive } = calculateWithdraw({ withdrawalLPAmount: withdrawLpAmount, diff --git a/src/connectors/sundaeswap/amm-routes/addLiquidity.ts b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts index ab066aee1f..d571130f05 100644 --- a/src/connectors/sundaeswap/amm-routes/addLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts @@ -80,14 +80,8 @@ async function addLiquidity( ); const result = await txBuilder.deposit({ ...depositArgs }); - // console.log(result); - const builtTx = await result.build(); - // console.log(builtTx); - const { submit } = await builtTx.sign(); - // console.log(submit); - const txHash = await submit(); return { diff --git a/src/connectors/sundaeswap/amm-routes/executeSwap.ts b/src/connectors/sundaeswap/amm-routes/executeSwap.ts index f8969dfdc2..8ececa3ae0 100644 --- a/src/connectors/sundaeswap/amm-routes/executeSwap.ts +++ b/src/connectors/sundaeswap/amm-routes/executeSwap.ts @@ -214,10 +214,8 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { new DatumBuilderLucidV3(net), ); const swapResult = await txBuilder.swap({ ...args }); - console.log('working upto here', swapResult); const builtTx = await swapResult.build(); - console.log('working upto here!', builtTx); const { submit } = await builtTx.sign(); const txHash = await submit(); @@ -228,11 +226,21 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { const outputAmountHuman = Number(outputAmount) / 10 ** outputTokenObj.decimals; - // Calculate balance changes - const baseTokenBalanceChange = - side === 'BUY' ? outputAmountHuman : -inputAmountHuman; - const quoteTokenBalanceChange = - side === 'BUY' ? -inputAmountHuman : outputAmountHuman; + // Calculate balance changes correctly + let baseTokenBalanceChange: number; + let quoteTokenBalanceChange: number; + + if (side === 'BUY') { + // BUY: spending baseToken to get quoteToken + // baseToken decreases (negative), quoteToken increases (positive) + baseTokenBalanceChange = -inputAmountHuman; // spending baseToken + quoteTokenBalanceChange = outputAmountHuman; // receiving quoteToken + } else { + // SELL: spending quoteToken to get baseToken + // quoteToken decreases (negative), baseToken increases (positive) + quoteTokenBalanceChange = -inputAmountHuman; // spending quoteToken + baseTokenBalanceChange = outputAmountHuman; // receiving baseToken + } return { signature: txHash, diff --git a/src/connectors/sundaeswap/amm-routes/quoteSwap.ts b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts index b237e123f8..cf2bc89b69 100644 --- a/src/connectors/sundaeswap/amm-routes/quoteSwap.ts +++ b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts @@ -220,6 +220,7 @@ export async function getSundaeswapAmmQuote( }; } +// Fixed formatSwapQuote function with corrected balance changes async function formatSwapQuote( fastify: FastifyInstance, network: string, @@ -253,10 +254,21 @@ async function formatSwapQuote( ); // Calculate balance changes based on which tokens are being swapped - const baseTokenBalanceChange = - side === 'BUY' ? quote.estimatedAmountOut : -quote.estimatedAmountIn; - const quoteTokenBalanceChange = - side === 'BUY' ? -quote.estimatedAmountIn : quote.estimatedAmountOut; + // 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}`, @@ -341,7 +353,6 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { const networkToUse = network || 'mainnet'; const slippageToUse = slippagePct || 1; // Default to 1% if not provided - console.log('working upto here'); const sundaeswap = await Sundaeswap.getInstance(networkToUse); let poolIdent = requestedpoolIdent; diff --git a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts index 3ac32d2d79..92a27ef998 100644 --- a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts @@ -1,7 +1,6 @@ import { BigNumber } from 'ethers'; import { FastifyPluginAsync } from 'fastify'; -import { Cardano } from '../../../chains/cardano/cardano'; import { RemoveLiquidityRequestType, RemoveLiquidityRequest, @@ -119,6 +118,9 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { } 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); @@ -127,19 +129,17 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { utxos, poolData.assetLP, ); - console.log('totalLpInWallet', totalLpInWallet); + // Calculate how much LP token will be withdrawn based on the percentage const withdrawalAmount = BigInt( (BigInt(totalLpInWallet) * BigInt(percentageToRemove)) / BigInt(100), ); - // console.log('withdrawalAmount', withdrawalAmount); // Define the LP Token to withdraw const lpTokenAmount = new AssetAmount( withdrawalAmount, poolData.assetLP, ); // Specify LP token amount - // console.log(lpTokenAmount); // Build withdraw arguments (Added `pool` property) const withdrawArgs: IWithdrawConfigArgs = { @@ -184,11 +184,13 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { // Calculate the amounts that will be received (proportional to LP tokens withdrawn) const baseTokenAmountRemoved = Math.floor( - Number(baseTokenReserve) * withdrawalProportion, + (Number(baseTokenReserve) * withdrawalProportion) / + baseTokenObj.decimals, ); const quoteTokenAmountRemoved = Math.floor( - Number(quoteTokenReserve) * withdrawalProportion, + (Number(quoteTokenReserve) * withdrawalProportion) / + quoteTokenObj.decimals, ); return { diff --git a/src/connectors/sundaeswap/sundaeswap.ts b/src/connectors/sundaeswap/sundaeswap.ts index 27cb5bea99..88b1e5fd57 100644 --- a/src/connectors/sundaeswap/sundaeswap.ts +++ b/src/connectors/sundaeswap/sundaeswap.ts @@ -118,6 +118,11 @@ export class Sundaeswap { ); 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, @@ -125,7 +130,7 @@ export class Sundaeswap { feePct: raw.currentFee * 100, price: raw.liquidity.aReserve > 0n - ? Number(raw.liquidity.aReserve) / Number(raw.liquidity.bReserve) + ? Number(aReserveSmallest) / Number(bReserveSmallest) : 0, baseTokenAmount: Number(raw.liquidity.aReserve), // ← explicit cast quoteTokenAmount: Number(raw.liquidity.bReserve), // ← explicit cast @@ -163,7 +168,8 @@ export class Sundaeswap { public calculateAssetAmount(utxos: UTxO[], asset: IPoolDataAsset): bigint { return utxos.reduce((acc, utxo) => { - const assetValue = utxo.assets[asset.assetId]; + const [policyId, assetName] = asset.assetId.split('.'); + const assetValue = utxo.assets[policyId + assetName]; if (assetValue) { return acc + BigInt(assetValue); // Ensure addition is performed with BigInt } From 03cbe4ef638408574e9a22f6c8f07b6062d4104b Mon Sep 17 00:00:00 2001 From: Aiquant1 Date: Thu, 10 Jul 2025 12:04:13 +0530 Subject: [PATCH 07/12] updated cardano.yml --- src/templates/chains/cardano.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/templates/chains/cardano.yml b/src/templates/chains/cardano.yml index a80f81331c..8807497748 100644 --- a/src/templates/chains/cardano.yml +++ b/src/templates/chains/cardano.yml @@ -4,17 +4,17 @@ networks: tokenListSource: "/home/gateway/conf/lists/cardano_mainnet_tokens.json" nativeCurrencySymbol: 'ADA' apiurl: 'https://cardano-mainnet.blockfrost.io/api/v0' - projectId: 'mainnetkCD2MvERTpHuh2oojUli0QtGp6zuJyrR' + projectId: 'your_mainnet_api_key' preprod: tokenListType: "FILE" tokenListSource: "/home/gateway/conf/lists/cardano_preprod_tokens.json" nativeCurrencySymbol: 'ADA' apiurl: 'https://cardano-preprod.blockfrost.io/api/v0' - projectId: 'preprodN1EZYj11zL89jJeaAjeRybxYMLp7grmn' + projectId: 'your_preprod_api_key' preview: tokenListType: "FILE" tokenListSource: "/home/gateway/conf/lists/cardano_preview_tokens.json" nativeCurrencySymbol: 'ADA' apiurl: 'https://cardano-preview.blockfrost.io/api/v0' - projectId: 'previewjsuJtAX0Fki1dAewDoWQ1xoHXXgVzg1w' + projectId: 'your_preview_api_key' From 63caeebe07660358ed2898343d3fcb4f2392a5cc Mon Sep 17 00:00:00 2001 From: Aiquant1 Date: Thu, 10 Jul 2025 15:16:21 +0530 Subject: [PATCH 08/12] Fixed lucid instance --- src/chains/cardano/cardano.ts | 19 ++++++++++++++++++- src/chains/cardano/routes/balances.ts | 8 ++++---- src/config/routes/updateConfig.ts | 9 +++++++++ .../minswap/amm-routes/removeLiquidity.ts | 2 +- .../sundaeswap/amm-routes/removeLiquidity.ts | 2 +- src/templates/chains/cardano.yml | 6 +++--- 6 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/chains/cardano/cardano.ts b/src/chains/cardano/cardano.ts index 39c45e213d..4ccab27e06 100644 --- a/src/chains/cardano/cardano.ts +++ b/src/chains/cardano/cardano.ts @@ -69,7 +69,24 @@ export class Cardano { if (!Cardano._instances[network]) { const instance = new Cardano(network); - await instance.init(); + + if ( + instance.projectId && + instance.projectId.toLowerCase().startsWith(network.toLowerCase()) + ) { + try { + await instance.init(); + } catch (err: any) { + logger.warn( + `[Cardano] initial init() skipped for network="${network}": ${err.message}`, + ); + } + } else { + logger.info( + `[Cardano] skipped init() for network="${network}" because projectId is still placeholder`, + ); + } + Cardano._instances[network] = instance; } diff --git a/src/chains/cardano/routes/balances.ts b/src/chains/cardano/routes/balances.ts index e6cb2f4e75..c9ca653851 100644 --- a/src/chains/cardano/routes/balances.ts +++ b/src/chains/cardano/routes/balances.ts @@ -146,12 +146,12 @@ export const balancesRoute: FastifyPluginAsync = async (fastify) => { // Get first wallet address for example const cardano = await Cardano.getInstance('preprod'); - // Default Ethereum address for examples if no wallet is available + // Default Cardano address for examples if no wallet is available let firstWalletAddress = ''; try { - // Try to get user's first Ethereum wallet if available - // getFirstWalletAddress specifically looks in the /ethereum directory + // Try to get user's first Cardano wallet if available + // getFirstWalletAddress specifically looks in the /cardano directory const userWallet = await cardano.getFirstWalletAddress(); if (userWallet) { // Make sure it's a valid Cardano address @@ -166,7 +166,7 @@ export const balancesRoute: FastifyPluginAsync = async (fastify) => { } } } catch (error) { - logger.warn('No Ethereum wallets found for examples in schema'); + logger.warn('No Cardano wallets found for examples in schema'); } BalanceRequestSchema.properties.address.examples = [firstWalletAddress]; diff --git a/src/config/routes/updateConfig.ts b/src/config/routes/updateConfig.ts index a2bbd38b69..944ab53666 100644 --- a/src/config/routes/updateConfig.ts +++ b/src/config/routes/updateConfig.ts @@ -9,6 +9,7 @@ import { ConfigUpdateResponseSchema, } from '../schemas'; import { updateConfig } from '../utils'; +import { Cardano } from '../../chains/cardano/cardano'; export const updateConfigRoute: FastifyPluginAsync = async (fastify) => { fastify.post<{ Body: ConfigUpdateRequest; Reply: ConfigUpdateResponse }>( @@ -84,6 +85,14 @@ export const updateConfigRoute: FastifyPluginAsync = async (fastify) => { // Build descriptive message const description = `'${namespace}.${path}'`; + // If they updated the projectId for one of the Cardano networks: + if (configPath.startsWith('cardano.') && configPath.endsWith('.projectId')) { + const network = configPath.split('.')[2]; // e.g. 'preprod || mainnet || preview' + console.log('network', network); + const cardano = await Cardano.getInstance(network); + cardano.projectId = String(processedValue); // assign the new key as string + await cardano.init(); // re‐init Lucid on the fly + } return { message: `Configuration updated successfully: ${description} set to ${JSON.stringify(processedValue)}`, diff --git a/src/connectors/minswap/amm-routes/removeLiquidity.ts b/src/connectors/minswap/amm-routes/removeLiquidity.ts index 596d0affa4..3a053182fe 100644 --- a/src/connectors/minswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/minswap/amm-routes/removeLiquidity.ts @@ -68,7 +68,7 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { ); } - // Get Uniswap and Ethereum instances + // Get Minswap and Cardano instances const minswap = await Minswap.getInstance(networkToUse); // Get wallet address - either from request or first available diff --git a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts index 92a27ef998..2daf595cda 100644 --- a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts @@ -76,7 +76,7 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { ); } - // Get Uniswap and Ethereum instances + // Get Sundaeswap and Cardano instances const sundaeswap = await Sundaeswap.getInstance(networkToUse); // Get wallet address - either from request or first available diff --git a/src/templates/chains/cardano.yml b/src/templates/chains/cardano.yml index 8807497748..933bebbb6c 100644 --- a/src/templates/chains/cardano.yml +++ b/src/templates/chains/cardano.yml @@ -4,17 +4,17 @@ networks: tokenListSource: "/home/gateway/conf/lists/cardano_mainnet_tokens.json" nativeCurrencySymbol: 'ADA' apiurl: 'https://cardano-mainnet.blockfrost.io/api/v0' - projectId: 'your_mainnet_api_key' + projectId: 'your_api_key' preprod: tokenListType: "FILE" tokenListSource: "/home/gateway/conf/lists/cardano_preprod_tokens.json" nativeCurrencySymbol: 'ADA' apiurl: 'https://cardano-preprod.blockfrost.io/api/v0' - projectId: 'your_preprod_api_key' + projectId: 'your_api_key' preview: tokenListType: "FILE" tokenListSource: "/home/gateway/conf/lists/cardano_preview_tokens.json" nativeCurrencySymbol: 'ADA' apiurl: 'https://cardano-preview.blockfrost.io/api/v0' - projectId: 'your_preview_api_key' + projectId: 'your_api_key' From 2007df0326d09fa76c25542d02ba7f4f42b3a67f Mon Sep 17 00:00:00 2001 From: Aiquant1 Date: Wed, 24 Sep 2025 11:43:44 +0530 Subject: [PATCH 09/12] fixed config routes for cardano and changed api and folder structure for cardano support and fixed tokens routes for cardano and added three network mainnet, preprod and preview for tokens --- pnpm-lock.yaml | 3093 ++++++++--------- src/chains/cardano/cardano.ts | 219 +- src/chains/cardano/routes/status.ts | 7 +- src/config/routes/getChains.ts | 5 +- src/config/routes/getConnectors.ts | 14 + src/config/routes/updateConfig.ts | 18 +- src/config/schemas.ts | 2 +- .../minswap/amm-routes/addLiquidity.ts | 51 +- .../minswap/amm-routes/executeSwap.ts | 88 +- src/connectors/minswap/amm-routes/poolInfo.ts | 43 +- .../minswap/amm-routes/quoteLiquidity.ts | 95 +- .../minswap/amm-routes/quoteSwap.ts | 152 +- .../minswap/amm-routes/removeLiquidity.ts | 81 +- src/connectors/minswap/minswap.config.ts | 11 +- src/connectors/minswap/minswap.ts | 116 +- .../sundaeswap/amm-routes/addLiquidity.ts | 53 +- .../sundaeswap/amm-routes/executeSwap.ts | 136 +- .../sundaeswap/amm-routes/poolInfo.ts | 40 +- .../sundaeswap/amm-routes/quoteLiquidity.ts | 98 +- .../sundaeswap/amm-routes/quoteSwap.ts | 137 +- .../sundaeswap/amm-routes/removeLiquidity.ts | 92 +- .../sundaeswap/sundaeswap.config.ts | 11 +- src/connectors/sundaeswap/sundaeswap.ts | 56 +- src/pools/schemas.ts | 16 +- src/pools/types.ts | 2 + src/services/pool-service.ts | 12 + src/services/token-service.ts | 50 + src/templates/chains/cardano.yml | 22 +- src/templates/chains/cardano/mainnet.yml | 4 + src/templates/chains/cardano/preprod.yml | 4 + src/templates/chains/cardano/preview.yml | 4 + .../namespace/cardano-chain-schema.json | 16 + .../namespace/cardano-network-schema.json | 15 + .../namespace/cardano_mainnet_tokens.json | 53 - .../namespace/cardano_preprod_tokens.json | 44 - .../namespace/cardano_preview_tokens.json | 35 - .../templates}/namespace/minswap-schema.json | 0 .../namespace/sundaeswap-schema.json | 0 src/templates/pools/minswap.json | 23 + src/templates/pools/sundaeswap.json | 16 + src/templates/root.yml | 25 +- src/templates/tokens/cardano/mainnet.json | 42 + src/templates/tokens/cardano/preprod.json | 34 + src/templates/tokens/cardano/preview.json | 26 + src/tokens/schemas.ts | 26 +- src/tokens/types.ts | 7 + src/wallet/utils.ts | 8 +- .../test1/namespace/cardano-schema.json | 31 - 48 files changed, 2408 insertions(+), 2725 deletions(-) create mode 100644 src/templates/chains/cardano/mainnet.yml create mode 100644 src/templates/chains/cardano/preprod.yml create mode 100644 src/templates/chains/cardano/preview.yml create mode 100644 src/templates/namespace/cardano-chain-schema.json create mode 100644 src/templates/namespace/cardano-network-schema.json delete mode 100644 src/templates/namespace/cardano_mainnet_tokens.json delete mode 100644 src/templates/namespace/cardano_preprod_tokens.json delete mode 100644 src/templates/namespace/cardano_preview_tokens.json rename {test/services/data/config-manager-v2/test1 => src/templates}/namespace/minswap-schema.json (100%) rename {test/services/data/config-manager-v2/test1 => src/templates}/namespace/sundaeswap-schema.json (100%) create mode 100644 src/templates/pools/minswap.json create mode 100644 src/templates/pools/sundaeswap.json create mode 100644 src/templates/tokens/cardano/mainnet.json create mode 100644 src/templates/tokens/cardano/preprod.json create mode 100644 src/templates/tokens/cardano/preview.json delete mode 100644 test/services/data/config-manager-v2/test1/namespace/cardano-schema.json diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7c55cf7393..f617692881 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,7 +33,7 @@ importers: 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 @@ -81,28 +81,28 @@ importers: 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.6(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) + 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.17(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) + 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.3(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.15(abitype@1.1.0(typescript@5.8.3)(zod@3.25.76))(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.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + 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.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + 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 @@ -111,37 +111,37 @@ importers: version: 1.0.2 '@pancakeswap/v3-sdk': specifier: ^3.9.5 - version: 3.9.6(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) + 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.25.76) + 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.25.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) @@ -150,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.25.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.7(bufferutil@4.0.9)(hardhat@2.25.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 @@ -165,10 +165,10 @@ importers: version: 1.4.4 '@uniswap/v3-sdk': specifier: ^3.25.2 - version: 3.25.2(hardhat@2.25.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.25.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 @@ -177,7 +177,7 @@ importers: version: 3.1.0 axios: specifier: ^1.8.4 - version: 1.10.0(debug@4.3.4) + version: 1.12.2(debug@4.3.4) bigint-buffer: specifier: 1.1.5 version: 1.1.5 @@ -192,7 +192,7 @@ importers: 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.6.0 @@ -231,7 +231,7 @@ importers: version: 11.3.0 pnpm: specifier: ^10.10.0 - version: 10.13.1 + version: 10.17.0 snake-case: specifier: ^4.0.0 version: 4.0.0 @@ -246,7 +246,7 @@ importers: version: 8.3.2 viem: specifier: ^2.37.1 - version: 2.37.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + 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 @@ -292,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 @@ -301,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 @@ -316,7 +316,7 @@ 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.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) @@ -328,13 +328,13 @@ importers: version: 4.4.3(eslint-plugin-import@2.32.0)(eslint@8.57.1) eslint-plugin-import: specifier: ^2.31.0 - version: 2.32.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.5.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2) + 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) @@ -346,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 @@ -367,10 +367,10 @@ importers: version: 3.0.2 ts-jest: specifier: ^29.3.0 - version: 29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(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.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 @@ -379,7 +379,7 @@ importers: 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) @@ -405,10 +405,6 @@ packages: '@sundaeswap/cpp': ^1.0.3 '@sundaeswap/fraction': ^1.0.3 - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -432,123 +428,123 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.844.0': - resolution: {integrity: sha512-Yhp8+U4KFVQqL6phZ5yrHF5PdCvKWbYtLSS+egAfAW+N5w78amhbZcctervj59uqOZHMGDWXuDBklN+7eVfasg==} + '@aws-sdk/client-s3@3.893.0': + resolution: {integrity: sha512-/P74KDJhOijnIAQR93sq1DQn8vbU3WaPZDyy1XUMRJJIY6iEJnDo1toD9XY6AFDz5TRto8/8NbcXT30AMOUtJQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.844.0': - resolution: {integrity: sha512-FktodSx+pfUfIqMjoNwZ6t1xqq/G3cfT7I4JJ0HKHoIIZdoCHQB52x0OzKDtHDJAnEQPInasdPS8PorZBZtHmg==} + '@aws-sdk/client-sso@3.893.0': + resolution: {integrity: sha512-0+qRGq7H8UNfxI0F02ObyOgOiYxkN4DSlFfwQUQMPfqENDNYOrL++2H9X3EInyc1lUM/+aK8TZqSbh473gdxcg==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.844.0': - resolution: {integrity: sha512-pfpI54bG5Xf2NkqrDBC2REStXlDXNCw/whORhkEs+Tp5exU872D5QKguzjPA6hH+8Pvbq1qgt5zXMbduISTHJw==} + '@aws-sdk/core@3.893.0': + resolution: {integrity: sha512-E1NAWHOprBXIJ9CVb6oTsRD/tNOozrKBD/Sb4t7WZd3dpby6KpYfM6FaEGfRGcJBIcB4245hww8Rmg16qDMJWg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.844.0': - resolution: {integrity: sha512-WB94Ox86MqcZ4CnRjKgopzaSuZH4hMP0GqdOxG4s1it1lRWOIPOHOC1dPiM0Zbj1uqITIhbXUQVXyP/uaJeNkw==} + '@aws-sdk/credential-provider-env@3.893.0': + resolution: {integrity: sha512-h4sYNk1iDrSZQLqFfbuD1GWY6KoVCvourfqPl6JZCYj8Vmnox5y9+7taPxwlU2VVII0hiV8UUbO79P35oPBSyA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.844.0': - resolution: {integrity: sha512-e+efVqfkhpM8zxYeiLNgTUlX+tmtXzVm3bw1A02U9Z9cWBHyQNb8pi90M7QniLoqRURY1B0C2JqkOE61gd4KNg==} + '@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.844.0': - resolution: {integrity: sha512-jc5ArGz2HfAx5QPXD+Ep36+QWyCKzl2TG6Vtl87/vljfLhVD0gEHv8fRsqWEp3Rc6hVfKnCjLW5ayR2HYcow9w==} + '@aws-sdk/credential-provider-ini@3.893.0': + resolution: {integrity: sha512-ZQWOl4jdLhJHHrHsOfNRjgpP98A5kw4YzkMOUoK+TgSQVLi7wjb957V0htvwpi6KmGr3f2F8J06D6u2OtIc62w==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.844.0': - resolution: {integrity: sha512-pUqB0StTNyW0R03XjTA3wrQZcie/7FJKSXlYHue921ZXuhLOZpzyDkLNfdRsZTcEoYYWVPSmyS+Eu/g5yVsBNA==} + '@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.844.0': - resolution: {integrity: sha512-VCI8XvIDt2WBfk5Gi/wXKPcWTS3OkAbovB66oKcNQalllH8ESDg4SfLNhchdnN8A5sDGj6tIBJ19nk+dQ6GaqQ==} + '@aws-sdk/credential-provider-process@3.893.0': + resolution: {integrity: sha512-5XitkZdiQhjWJV71qWqrH7hMXwuK/TvIRwiwKs7Pj0sapGSk3YgD3Ykdlolz7sQOleoKWYYqgoq73fIPpTTmFA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.844.0': - resolution: {integrity: sha512-UNp/uWufGlb5nWa4dpc6uQnDOB/9ysJJFG95ACowNVL9XWfi1LJO7teKrqNkVhq0CzSJS1tCt3FvX4UfM+aN1g==} + '@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.844.0': - resolution: {integrity: sha512-iDmX4pPmatjttIScdspZRagaFnCjpHZIEEwTyKdXxUaU0iAOSXF8ecrCEvutETvImPOC86xdrq+MPacJOnMzUA==} + '@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.840.0': - resolution: {integrity: sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==} + '@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.840.0': - resolution: {integrity: sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw==} + '@aws-sdk/middleware-expect-continue@3.893.0': + resolution: {integrity: sha512-PEZkvD6k0X9sacHkvkVF4t2QyQEAzd35OJ2bIrjWCfc862TwukMMJ1KErRmQ1WqKXHKF4L0ed5vtWaO/8jVLNA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.844.0': - resolution: {integrity: sha512-LCImZd1hpM0cegfdpgZyK6x4on4Ky+c9XCFURfE4wil1J9HXf6OP4KsfHQwt1yIkMEbFqvd/ab2I5fmp7S7aFA==} + '@aws-sdk/middleware-flexible-checksums@3.893.0': + resolution: {integrity: sha512-2swRPpyGK6xpZwIFmmFSFKp10iuyBLZEouhrt1ycBVA8iHGmPkuJSCim6Vb+JoRKqINp5tizWeQwdg9boIxJPw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.840.0': - resolution: {integrity: sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==} + '@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.840.0': - resolution: {integrity: sha512-KVLD0u0YMF3aQkVF8bdyHAGWSUY6N1Du89htTLgqCcIhSxxAJ9qifrosVZ9jkAzqRW99hcufyt2LylcVU2yoKQ==} + '@aws-sdk/middleware-location-constraint@3.893.0': + resolution: {integrity: sha512-MlbBc7Ttb1ekbeeeFBU4DeEZOLb5s0Vl4IokvO17g6yJdLk4dnvZro9zdXl3e7NXK+kFxHRBFZe55p/42mVgDA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.840.0': - resolution: {integrity: sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==} + '@aws-sdk/middleware-logger@3.893.0': + resolution: {integrity: sha512-ZqzMecjju5zkBquSIfVfCORI/3Mge21nUY4nWaGQy+NUXehqCGG4W7AiVpiHGOcY2cGJa7xeEkYcr2E2U9U0AA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.840.0': - resolution: {integrity: sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==} + '@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.844.0': - resolution: {integrity: sha512-vOD5reqZszXBWMbZFN3EUar203o2i8gcoTdrymY4GMsAPDsh0k8yd3VJRNPuxT/017tP6G+rQepOGzna4umung==} + '@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.840.0': - resolution: {integrity: sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q==} + '@aws-sdk/middleware-ssec@3.893.0': + resolution: {integrity: sha512-e4ccCiAnczv9mMPheKjgKxZQN473mcup+3DPLVNnIw5GRbQoDqPSB70nUzfORKZvM7ar7xLMPxNR8qQgo1C8Rg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.844.0': - resolution: {integrity: sha512-SIbDNUL6ZYXPj5Tk0qEz05sW9kNS1Gl3/wNWEmH+AuUACipkyIeKKWzD6z5433MllETh73vtka/JQF3g7AuZww==} + '@aws-sdk/middleware-user-agent@3.893.0': + resolution: {integrity: sha512-n1vHj7bdC4ycIAKkny0rmgvgvGOIgYnGBAqfPAFPR26WuGWmCxH2cT9nQTNA+li8ofxX9F9FIFBTKkW92Pc8iQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.844.0': - resolution: {integrity: sha512-p2XILWc7AcevUSpBg2VtQrk79eWQC4q2JsCSY7HxKpFLZB4mMOfmiTyYkR1gEA6AttK/wpCOtfz+hi1/+z2V1A==} + '@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.840.0': - resolution: {integrity: sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==} + '@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.844.0': - resolution: {integrity: sha512-QC8nocQcZ3Bj7vTnuL47iNhcuUjMC46E2L85mU+sPQo3LN2qBVGSOTF+xSWGvmSFDpkN4ZXUMVeA0cJoJFEDFA==} + '@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.844.0': - resolution: {integrity: sha512-Kh728FEny0fil+LeH8U1offPJCTd/EDh8liBAvLtViLHt2WoX2xC8rk98D38Q5p79aIUhHb3Pf4n9IZfTu/Kog==} + '@aws-sdk/token-providers@3.893.0': + resolution: {integrity: sha512-nkzuE910TxW4pnIwJ+9xDMx5m+A8iXGM16Oa838YKsds07cgkRp7sPnpH9B8NbGK2szskAAkXfj7t1f59EKd1Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.840.0': - resolution: {integrity: sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==} + '@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.844.0': - resolution: {integrity: sha512-1DHh0WTUmxlysz3EereHKtKoxVUG9UC5BsfAw6Bm4/6qDlJiqtY3oa2vebkYN23yltKdfsCK65cwnBRU59mWVg==} + '@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.840.0': - resolution: {integrity: sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==} + '@aws-sdk/util-user-agent-browser@3.893.0': + resolution: {integrity: sha512-PE9NtbDBW6Kgl1bG6A5fF3EPo168tnkj8TgMcT0sg4xYBWsBpq0bpJZRh+Jm5Bkwiw9IgTCLjEU7mR6xWaMB9w==} - '@aws-sdk/util-user-agent-node@3.844.0': - resolution: {integrity: sha512-0eTpURp9Gxbyyeqr78ogARZMSWS5KUMZuN+XMHxNpQLmn2S+J3g+MAyoklCcwhKXlbdQq2aMULEiy0mqIWytuw==} + '@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' @@ -556,24 +552,28 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.821.0': - resolution: {integrity: sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==} + '@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.28.0': - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.0': - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + '@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.28.0': - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.27.2': @@ -588,8 +588,8 @@ packages: resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -610,12 +610,12 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} hasBin: true @@ -710,20 +710,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + '@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.28.0': - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.0': - resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} + '@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': @@ -944,8 +944,8 @@ packages: 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 @@ -1169,6 +1169,15 @@ 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} @@ -1271,18 +1280,21 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@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/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -1406,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==} @@ -1618,8 +1634,8 @@ packages: resolution: {integrity: sha512-5n5cmtBMYo7bnhmxhuwfv4P/MSaeZbvNsqsUjl6UsNnI9ylPx4ttTvj/uxhytnjpSA2wwSZUvwLys/w3rHrWGw==} engines: {node: '>=10'} - '@peculiar/asn1-schema@2.3.15': - resolution: {integrity: sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w==} + '@peculiar/asn1-schema@2.5.0': + resolution: {integrity: sha512-YM/nFfskFJSlHqv59ed6dZlLZqtZQwjRVJ4bBAiWV08Oc+1rSd5lDZcBEx0lGDHfSoH3UziI2pXt2UM33KerPQ==} '@peculiar/json-schema@1.1.12': resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} @@ -1633,8 +1649,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.7': - resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + '@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': @@ -1726,216 +1742,216 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@smithy/abort-controller@4.0.4': - resolution: {integrity: sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==} + '@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.4': - resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} + '@smithy/config-resolver@4.2.2': + resolution: {integrity: sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.7.0': - resolution: {integrity: sha512-7ov8hu/4j0uPZv8b27oeOFtIBtlFmM3ibrPv/Omx1uUdoXvcpJ00U+H/OWWC/keAguLlcqwtyL2/jTlSnApgNQ==} + '@smithy/core@3.11.1': + resolution: {integrity: sha512-REH7crwORgdjSpYs15JBiIWOYjj0hJNC3aCecpJvAlMMaaqL5i2CLb1i6Hc4yevToTKSqslLMI9FKjhugEwALA==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.0.6': - resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} + '@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.4': - resolution: {integrity: sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==} + '@smithy/eventstream-codec@4.1.1': + resolution: {integrity: sha512-PwkQw1hZwHTQB6X5hSUWz2OSeuj5Z6enWuAqke7DgWoP3t6vg3ktPpqPz3Erkn6w+tmsl8Oss6nrgyezoea2Iw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.0.4': - resolution: {integrity: sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==} + '@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.2': - resolution: {integrity: sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==} + '@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.4': - resolution: {integrity: sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==} + '@smithy/eventstream-serde-node@4.1.1': + resolution: {integrity: sha512-tn6vulwf/ScY0vjhzptSJuDJJqlhNtUjkxJ4wiv9E3SPoEqTEKbaq6bfqRO7nvhTG29ALICRcvfFheOUPl8KNA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.0.4': - resolution: {integrity: sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==} + '@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.1.0': - resolution: {integrity: sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==} + '@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.4': - resolution: {integrity: sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==} + '@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.4': - resolution: {integrity: sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==} + '@smithy/hash-node@4.1.1': + resolution: {integrity: sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.0.4': - resolution: {integrity: sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==} + '@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.4': - resolution: {integrity: sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==} + '@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.4': - resolution: {integrity: sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==} + '@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.4': - resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} + '@smithy/middleware-content-length@4.1.1': + resolution: {integrity: sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.1.14': - resolution: {integrity: sha512-+BGLpK5D93gCcSEceaaYhUD/+OCGXM1IDaq/jKUQ+ujB0PTWlWN85noodKw/IPFZhIKFCNEe19PGd/reUMeLSQ==} + '@smithy/middleware-endpoint@4.2.3': + resolution: {integrity: sha512-+1H5A28DeffRVrqmVmtqtRraEjoaC6JVap3xEQdVoBh2EagCVY7noPmcBcG4y7mnr9AJitR1ZAse2l+tEtK5vg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.1.15': - resolution: {integrity: sha512-iKYUJpiyTQ33U2KlOZeUb0GwtzWR3C0soYcKuCnTmJrvt6XwTPQZhMfsjJZNw7PpQ3TU4Ati1qLSrkSJxnnSMQ==} + '@smithy/middleware-retry@4.2.4': + resolution: {integrity: sha512-amyqYQFewnAviX3yy/rI/n1HqAgfvUdkEhc04kDjxsngAUREKuOI24iwqQUirrj6GtodWmR4iO5Zeyl3/3BwWg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.8': - resolution: {integrity: sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==} + '@smithy/middleware-serde@4.1.1': + resolution: {integrity: sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.0.4': - resolution: {integrity: sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==} + '@smithy/middleware-stack@4.1.1': + resolution: {integrity: sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.1.3': - resolution: {integrity: sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==} + '@smithy/node-config-provider@4.2.2': + resolution: {integrity: sha512-SYGTKyPvyCfEzIN5rD8q/bYaOPZprYUPD2f5g9M7OjaYupWOoQFYJ5ho+0wvxIRf471i2SR4GoiZ2r94Jq9h6A==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.1.0': - resolution: {integrity: sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==} + '@smithy/node-http-handler@4.2.1': + resolution: {integrity: sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.0.4': - resolution: {integrity: sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==} + '@smithy/property-provider@4.1.1': + resolution: {integrity: sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.1.2': - resolution: {integrity: sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==} + '@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.4': - resolution: {integrity: sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==} + '@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.4': - resolution: {integrity: sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==} + '@smithy/querystring-parser@4.1.1': + resolution: {integrity: sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.0.6': - resolution: {integrity: sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==} + '@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.4': - resolution: {integrity: sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==} + '@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.2': - resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} + '@smithy/signature-v4@5.2.1': + resolution: {integrity: sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.4.6': - resolution: {integrity: sha512-3wfhywdzB/CFszP6moa5L3lf5/zSfQoH0kvVSdkyK2az5qZet0sn2PAHjcTDiq296Y4RP5yxF7B6S6+3oeBUCQ==} + '@smithy/smithy-client@4.6.3': + resolution: {integrity: sha512-K27LqywsaqKz4jusdUQYJh/YP2VbnbdskZ42zG8xfV+eovbTtMc2/ZatLWCfSkW0PDsTUXlpvlaMyu8925HsOw==} engines: {node: '>=18.0.0'} - '@smithy/types@4.3.1': - resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} + '@smithy/types@4.5.0': + resolution: {integrity: sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.0.4': - resolution: {integrity: sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==} + '@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.22': - resolution: {integrity: sha512-hjElSW18Wq3fUAWVk6nbk7pGrV7ZT14DL1IUobmqhV3lxcsIenr5FUsDe2jlTVaS8OYBI3x+Og9URv5YcKb5QA==} + '@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.22': - resolution: {integrity: sha512-7B8mfQBtwwr2aNRRmU39k/bsRtv9B6/1mTMrGmmdJFKmLAH+KgIiOuhaqfKOBGh9sZ/VkZxbvm94rI4MMYpFjQ==} + '@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.6': - resolution: {integrity: sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==} + '@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.4': - resolution: {integrity: sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==} + '@smithy/util-middleware@4.1.1': + resolution: {integrity: sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.0.6': - resolution: {integrity: sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==} + '@smithy/util-retry@4.1.2': + resolution: {integrity: sha512-NCgr1d0/EdeP6U5PSZ9Uv5SMR5XRRYoVr1kRVtKZxWL3tixEL3UatrPIMFZSKwHlCcp2zPLDvMubVDULRqeunA==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.2.3': - resolution: {integrity: sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==} + '@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.6': - resolution: {integrity: sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg==} + '@smithy/util-waiter@4.1.1': + resolution: {integrity: sha512-PJBmyayrlfxM7nbqjomF4YcT1sApQwZio0NHSsT0EzhJqljRmvhzqZua43TyEs80nJk2Cn2FGPg/N8phH6KeCQ==} engines: {node: '>=18.0.0'} '@solana/buffer-layout-utils@0.2.0': @@ -2097,9 +2113,6 @@ packages: resolution: {integrity: sha512-ZhpZtD+4VArf6RPitsVExvgkF+nGghd1rzPjd97GmBximpnt1rsUxMOEyoIEuH3XBxPyNB6Us7ha7RHWQR+abg==} engines: {node: '>=16'} - '@solana/web3.js@1.98.2': - resolution: {integrity: sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A==} - '@solana/web3.js@1.98.4': resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} @@ -2165,8 +2178,8 @@ 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==} @@ -2243,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. @@ -2256,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==} @@ -2390,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==} @@ -2714,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: @@ -2730,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: @@ -2878,8 +2888,8 @@ packages: resolution: {integrity: sha512-gsDXAS6XVc4Jt+7S92MPX6Noq69bdeXUPEaXd8dk3+yVr629LTDLxNt4j1ycBbrU+AStK2PhKIyNIM+xzWMVOQ==} engines: {node: '>=6'} - axios@1.10.0: - resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + axios@1.12.2: + resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} @@ -2895,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==} @@ -2929,6 +2939,10 @@ 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==} @@ -2945,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==} @@ -2995,8 +3009,8 @@ packages: bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} - bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + bowser@2.12.1: + resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} boxen@5.1.2: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} @@ -3031,8 +3045,8 @@ packages: browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + browserslist@4.26.2: + resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3136,8 +3150,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001727: - resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + caniuse-lite@1.0.30001743: + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} capability@0.2.5: resolution: {integrity: sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==} @@ -3162,16 +3176,16 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + 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==} @@ -3306,10 +3320,6 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - commander@14.0.0: - resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} - engines: {node: '>=20'} - commander@14.0.1: resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} engines: {node: '>=20'} @@ -3411,14 +3421,14 @@ packages: csv-generate@4.5.0: resolution: {integrity: sha512-aQr/vmOKyBSBHNwYhAoXw1+kUsPnMSwmYgpNoo36rIXoG1ecWILnvPGZeQ6oUjzrWknZAD3+jfpqYOBAl4x15A==} - csv-parse@6.0.0: - resolution: {integrity: sha512-6aB9WrymEruVDwQOwa5AuYk4/Gb+HaJgLHGKOA9BXTqgsIFvbdHzQzZOuqNCOooTGciPDaHzTlGkU5P6kYVUYw==} + csv-parse@6.1.0: + resolution: {integrity: sha512-CEE+jwpgLn+MmtCpVcPtiCZpVtB6Z2OKPTr34pycYYoL7sxdOkXDdQ4lRiw6ioC0q6BLqhc6cKweCVvral8yhw==} csv-stringify@6.6.0: resolution: {integrity: sha512-YW32lKOmIBgbxtu3g5SaiqWNwa/9ISQt2EcgOq0+RAIFufFp9is6tqNnKahqE5kuKvrnYAzs28r+s6pXJR8Vcw==} - csv@6.4.0: - resolution: {integrity: sha512-ANuTejMc7MI4L4hc8KBKVNKg8yuwXFTlKAjCFwPRGsrnO63KUDKbDVY7/m/RADeeAmFZmAwRjk9E6LUh32026A==} + csv@6.4.1: + resolution: {integrity: sha512-ajGosmTGnTwYyGl8STqZDu7R6LkDf3xL39XiOmliV/GufQeVUxHzTKIm4NOBCwmEuujK7B6isxs4Uqt9GcRCvA==} engines: {node: '>= 0.1.90'} data-uri-to-buffer@4.0.1: @@ -3440,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==} @@ -3468,8 +3478,8 @@ packages: 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: '*' @@ -3495,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: @@ -3632,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.182: - resolution: {integrity: sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==} + electron-to-chromium@1.5.222: + resolution: {integrity: sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -3667,9 +3672,6 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} @@ -3685,8 +3687,8 @@ 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==} @@ -3758,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' @@ -3845,8 +3847,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.5.1: - resolution: {integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==} + 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' @@ -3993,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'} @@ -4053,8 +4051,8 @@ 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@5.2.5: resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} @@ -4084,8 +4082,9 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -4113,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'} @@ -4154,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: '*' @@ -4175,12 +4171,12 @@ 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.3: - resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} formdata-polyfill@4.0.10: @@ -4364,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.25.0: - resolution: {integrity: sha512-yBiA74Yj3VnTRj7lhnn8GalvBdvsMOqTKRrRATSy/2v0VIR2hR0Jcnmfn4aQBLtGAnr3Q2c8CxL0g3LYegUp+g==} + hardhat@2.26.3: + resolution: {integrity: sha512-gBfjbxCCEaRgMCRgTpjo1CEoJwqNPhyGMMVHYZJxoQ3LLftp2erSVf8ZF6hTQC0r2wst4NcqNmLWqMnHg1quTw==} hasBin: true peerDependencies: ts-node: '*' @@ -4489,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: @@ -4530,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: @@ -4560,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==} @@ -4802,8 +4803,8 @@ 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: @@ -4813,11 +4814,6 @@ packages: resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} - jake@10.9.2: - resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} - engines: {node: '>=10'} - hasBin: true - javascript-natural-sort@0.7.1: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} @@ -5063,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==} @@ -5183,8 +5179,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + lru-cache@11.2.1: + resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -5427,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==} @@ -5488,8 +5487,8 @@ 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==} @@ -5718,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: @@ -5737,8 +5736,8 @@ packages: pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@9.7.0: - resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} + pino@9.11.0: + resolution: {integrity: sha512-+YIodBB9sxcWeR8PrXC2K3gEDyfkUuVEITOcbqrfcj+z5QW4ioIcqZfYFbrLTYLsmAwunbS7nfU/dpBB6PZc1g==} hasBin: true pirates@4.0.7: @@ -5753,8 +5752,8 @@ packages: resolution: {integrity: sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==} engines: {node: '>=12'} - pnpm@10.13.1: - resolution: {integrity: sha512-N+vxpcejDV+r4MXfRO6NpMllygxa89urKMOhaBtwolYhjQXIHJwNz3Z+9rhVHrW5YAQrntQwDFkkIzY3fgHPrQ==} + pnpm@10.17.0: + resolution: {integrity: sha512-/Oij3Smk7S7FZvtT77sE2MRKDwW8bySnMEaRD7nDznr6NaCYBQBmj6NXM0W9ZEZE+pgzj6FoI1yA9KoXqhf77w==} engines: {node: '>=18.12'} hasBin: true @@ -6036,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==} @@ -6199,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==} @@ -6396,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: @@ -6450,8 +6449,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.11.8: - resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} table@6.9.0: @@ -6496,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: @@ -6507,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: @@ -6565,8 +6564,8 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-jest@29.4.0: - resolution: {integrity: sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==} + 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: @@ -6690,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'} @@ -6884,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==} @@ -6981,11 +6988,6 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} - engines: {node: '>= 14.6'} - hasBin: true - yaml@2.8.1: resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} @@ -7059,29 +7061,24 @@ snapshots: '@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 - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.840.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.840.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.840.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 @@ -7090,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.840.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.840.0 + '@aws-sdk/types': 3.893.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -7107,470 +7104,474 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.840.0 + '@aws-sdk/types': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.844.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.844.0 - '@aws-sdk/credential-provider-node': 3.844.0 - '@aws-sdk/middleware-bucket-endpoint': 3.840.0 - '@aws-sdk/middleware-expect-continue': 3.840.0 - '@aws-sdk/middleware-flexible-checksums': 3.844.0 - '@aws-sdk/middleware-host-header': 3.840.0 - '@aws-sdk/middleware-location-constraint': 3.840.0 - '@aws-sdk/middleware-logger': 3.840.0 - '@aws-sdk/middleware-recursion-detection': 3.840.0 - '@aws-sdk/middleware-sdk-s3': 3.844.0 - '@aws-sdk/middleware-ssec': 3.840.0 - '@aws-sdk/middleware-user-agent': 3.844.0 - '@aws-sdk/region-config-resolver': 3.840.0 - '@aws-sdk/signature-v4-multi-region': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@aws-sdk/util-endpoints': 3.844.0 - '@aws-sdk/util-user-agent-browser': 3.840.0 - '@aws-sdk/util-user-agent-node': 3.844.0 - '@aws-sdk/xml-builder': 3.821.0 - '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.0 - '@smithy/eventstream-serde-browser': 4.0.4 - '@smithy/eventstream-serde-config-resolver': 4.1.2 - '@smithy/eventstream-serde-node': 4.0.4 - '@smithy/fetch-http-handler': 5.1.0 - '@smithy/hash-blob-browser': 4.0.4 - '@smithy/hash-node': 4.0.4 - '@smithy/hash-stream-node': 4.0.4 - '@smithy/invalid-dependency': 4.0.4 - '@smithy/md5-js': 4.0.4 - '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.14 - '@smithy/middleware-retry': 4.1.15 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.1.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@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.22 - '@smithy/util-defaults-mode-node': 4.0.22 - '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 - '@smithy/util-stream': 4.2.3 - '@smithy/util-utf8': 4.0.0 - '@smithy/util-waiter': 4.0.6 + '@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.844.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.844.0 - '@aws-sdk/middleware-host-header': 3.840.0 - '@aws-sdk/middleware-logger': 3.840.0 - '@aws-sdk/middleware-recursion-detection': 3.840.0 - '@aws-sdk/middleware-user-agent': 3.844.0 - '@aws-sdk/region-config-resolver': 3.840.0 - '@aws-sdk/types': 3.840.0 - '@aws-sdk/util-endpoints': 3.844.0 - '@aws-sdk/util-user-agent-browser': 3.840.0 - '@aws-sdk/util-user-agent-node': 3.844.0 - '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.0 - '@smithy/fetch-http-handler': 5.1.0 - '@smithy/hash-node': 4.0.4 - '@smithy/invalid-dependency': 4.0.4 - '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.14 - '@smithy/middleware-retry': 4.1.15 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.1.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@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.22 - '@smithy/util-defaults-mode-node': 4.0.22 - '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 - '@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.844.0': - dependencies: - '@aws-sdk/types': 3.840.0 - '@aws-sdk/xml-builder': 3.821.0 - '@smithy/core': 3.7.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-utf8': 4.0.0 + '@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.844.0': + '@aws-sdk/credential-provider-env@3.893.0': dependencies: - '@aws-sdk/core': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 + '@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.844.0': - dependencies: - '@aws-sdk/core': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@smithy/fetch-http-handler': 5.1.0 - '@smithy/node-http-handler': 4.1.0 - '@smithy/property-provider': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/util-stream': 4.2.3 + '@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.844.0': - dependencies: - '@aws-sdk/core': 3.844.0 - '@aws-sdk/credential-provider-env': 3.844.0 - '@aws-sdk/credential-provider-http': 3.844.0 - '@aws-sdk/credential-provider-process': 3.844.0 - '@aws-sdk/credential-provider-sso': 3.844.0 - '@aws-sdk/credential-provider-web-identity': 3.844.0 - '@aws-sdk/nested-clients': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@smithy/credential-provider-imds': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@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.844.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.844.0 - '@aws-sdk/credential-provider-http': 3.844.0 - '@aws-sdk/credential-provider-ini': 3.844.0 - '@aws-sdk/credential-provider-process': 3.844.0 - '@aws-sdk/credential-provider-sso': 3.844.0 - '@aws-sdk/credential-provider-web-identity': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@smithy/credential-provider-imds': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@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.844.0': + '@aws-sdk/credential-provider-process@3.893.0': dependencies: - '@aws-sdk/core': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@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.844.0': + '@aws-sdk/credential-provider-sso@3.893.0': dependencies: - '@aws-sdk/client-sso': 3.844.0 - '@aws-sdk/core': 3.844.0 - '@aws-sdk/token-providers': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@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.844.0': + '@aws-sdk/credential-provider-web-identity@3.893.0': dependencies: - '@aws-sdk/core': 3.844.0 - '@aws-sdk/nested-clients': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 + '@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.840.0': + '@aws-sdk/middleware-bucket-endpoint@3.893.0': dependencies: - '@aws-sdk/types': 3.840.0 - '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@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.840.0': + '@aws-sdk/middleware-expect-continue@3.893.0': dependencies: - '@aws-sdk/types': 3.840.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@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.844.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.844.0 - '@aws-sdk/types': 3.840.0 - '@smithy/is-array-buffer': 4.0.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-stream': 4.2.3 - '@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.840.0': + '@aws-sdk/middleware-host-header@3.893.0': dependencies: - '@aws-sdk/types': 3.840.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@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.840.0': + '@aws-sdk/middleware-location-constraint@3.893.0': dependencies: - '@aws-sdk/types': 3.840.0 - '@smithy/types': 4.3.1 + '@aws-sdk/types': 3.893.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.840.0': + '@aws-sdk/middleware-logger@3.893.0': dependencies: - '@aws-sdk/types': 3.840.0 - '@smithy/types': 4.3.1 + '@aws-sdk/types': 3.893.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.840.0': + '@aws-sdk/middleware-recursion-detection@3.893.0': dependencies: - '@aws-sdk/types': 3.840.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@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.844.0': - dependencies: - '@aws-sdk/core': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/core': 3.7.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/protocol-http': 5.1.2 - '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-stream': 4.2.3 - '@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.840.0': + '@aws-sdk/middleware-ssec@3.893.0': dependencies: - '@aws-sdk/types': 3.840.0 - '@smithy/types': 4.3.1 + '@aws-sdk/types': 3.893.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.844.0': + '@aws-sdk/middleware-user-agent@3.893.0': dependencies: - '@aws-sdk/core': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@aws-sdk/util-endpoints': 3.844.0 - '@smithy/core': 3.7.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@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.844.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.844.0 - '@aws-sdk/middleware-host-header': 3.840.0 - '@aws-sdk/middleware-logger': 3.840.0 - '@aws-sdk/middleware-recursion-detection': 3.840.0 - '@aws-sdk/middleware-user-agent': 3.844.0 - '@aws-sdk/region-config-resolver': 3.840.0 - '@aws-sdk/types': 3.840.0 - '@aws-sdk/util-endpoints': 3.844.0 - '@aws-sdk/util-user-agent-browser': 3.840.0 - '@aws-sdk/util-user-agent-node': 3.844.0 - '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.0 - '@smithy/fetch-http-handler': 5.1.0 - '@smithy/hash-node': 4.0.4 - '@smithy/invalid-dependency': 4.0.4 - '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.14 - '@smithy/middleware-retry': 4.1.15 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.1.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@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.22 - '@smithy/util-defaults-mode-node': 4.0.22 - '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 - '@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.840.0': + '@aws-sdk/region-config-resolver@3.893.0': dependencies: - '@aws-sdk/types': 3.840.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.4 + '@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.844.0': + '@aws-sdk/signature-v4-multi-region@3.893.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/signature-v4': 5.1.2 - '@smithy/types': 4.3.1 + '@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.844.0': + '@aws-sdk/token-providers@3.893.0': dependencies: - '@aws-sdk/core': 3.844.0 - '@aws-sdk/nested-clients': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@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.840.0': + '@aws-sdk/types@3.893.0': dependencies: - '@smithy/types': 4.3.1 + '@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.844.0': + '@aws-sdk/util-endpoints@3.893.0': dependencies: - '@aws-sdk/types': 3.840.0 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-endpoints': 3.0.6 + '@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.840.0': + '@aws-sdk/util-user-agent-browser@3.893.0': dependencies: - '@aws-sdk/types': 3.840.0 - '@smithy/types': 4.3.1 - 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.844.0': + '@aws-sdk/util-user-agent-node@3.893.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.844.0 - '@aws-sdk/types': 3.840.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 + '@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.821.0': + '@aws-sdk/xml-builder@3.893.0': dependencies: - '@smithy/types': 4.3.1 + '@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.28.0': {} + '@babel/compat-data@7.28.4': {} - '@babel/core@7.28.0': + '@babel/core@7.28.4': dependencies: - '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 + '@babel/generator': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.28.0 + '@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.28.0 - '@babel/types': 7.28.0 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) + 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.28.0': + '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@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.28.0 + '@babel/compat-data': 7.28.4 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.1 + browserslist: 4.26.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -7578,17 +7579,17 @@ snapshots: '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.0 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color @@ -7600,121 +7601,121 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.27.6': + '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.0 + '@babel/types': 7.28.4 - '@babel/parser@7.28.0': + '@babel/parser@7.28.4': dependencies: - '@babel/types': 7.28.0 + '@babel/types': 7.28.4 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@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.28.0)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.27.6': {} + '@babel/runtime@7.28.4': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 - '@babel/traverse@7.28.0': + '@babel/traverse@7.28.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 + '@babel/generator': 7.28.3 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/types': 7.28.0 - debug: 4.4.1(supports-color@8.1.1) + '@babel/types': 7.28.4 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/types@7.28.0': + '@babel/types@7.28.4': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -7727,7 +7728,7 @@ snapshots: '@emurgo/cardano-serialization-lib-nodejs': 11.5.0 '@emurgo/cip14-js': 3.0.1 bottleneck: 2.19.5 - form-data: 4.0.3 + form-data: 4.0.4 got: 11.8.6 json-bigint: 1.0.0 @@ -7738,28 +7739,29 @@ snapshots: rimraf: 6.0.1 yaml: 2.8.1 - '@bundlr-network/client@0.7.17(bufferutil@4.0.9)(debug@4.4.1)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@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.27(@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.1)(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.10.0(debug@4.4.1) + 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.4.0 + 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 @@ -7768,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 @@ -7791,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 @@ -7813,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 @@ -7936,7 +7938,7 @@ snapshots: '@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 @@ -7946,7 +7948,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -7991,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 @@ -8006,16 +8008,16 @@ 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 @@ -8428,7 +8430,7 @@ snapshots: fastify-plugin: 4.5.1 openapi-types: 12.1.3 rfdc: 1.4.1 - yaml: 2.8.0 + yaml: 2.8.1 '@fastify/swagger@8.15.0': dependencies: @@ -8436,7 +8438,7 @@ snapshots: json-schema-resolver: 2.0.0 openapi-types: 12.1.3 rfdc: 1.4.1 - yaml: 2.8.0 + yaml: 2.8.1 transitivePeerDependencies: - supports-color @@ -8457,7 +8459,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -8466,6 +8468,13 @@ 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': @@ -8476,7 +8485,7 @@ snapshots: 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 @@ -8506,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 @@ -8520,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 @@ -8584,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.29 + '@jridgewell/trace-mapping': 0.3.31 '@types/node': 15.14.9 chalk: 4.1.2 collect-v8-coverage: 1.0.2 @@ -8595,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 @@ -8618,7 +8627,7 @@ snapshots: '@jest/source-map@29.6.3': dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -8644,9 +8653,9 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -8677,29 +8686,34 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.12': + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.29': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@ledgerhq/cryptoassets-evm-signatures@13.6.2': dependencies: '@ledgerhq/live-env': 2.16.0 - axios: 1.10.0 + axios: 1.12.2 transitivePeerDependencies: - debug @@ -8715,7 +8729,7 @@ snapshots: '@ledgerhq/errors': 6.25.0 '@ledgerhq/logs': 6.13.0 '@ledgerhq/types-live': 6.84.0 - axios: 1.10.0 + axios: 1.12.2 eip55: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8730,7 +8744,7 @@ snapshots: '@ethersproject/hash': 5.8.0 '@ledgerhq/cryptoassets-evm-signatures': 13.6.2 '@ledgerhq/live-env': 2.16.0 - axios: 1.10.0 + axios: 1.12.2 crypto-js: 4.2.0 transitivePeerDependencies: - debug @@ -8748,8 +8762,8 @@ snapshots: '@ledgerhq/hw-transport-mocker': 6.29.10 '@ledgerhq/logs': 6.13.0 '@ledgerhq/types-live': 6.84.0 - axios: 1.10.0 - bignumber.js: 9.3.0 + axios: 1.12.2 + bignumber.js: 9.3.1 semver: 7.7.2 transitivePeerDependencies: - debug @@ -8811,15 +8825,15 @@ snapshots: '@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 @@ -8827,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.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -8840,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.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -8857,7 +8871,7 @@ snapshots: dependencies: ansicolors: 0.3.2 bn.js: 5.2.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8865,7 +8879,7 @@ snapshots: dependencies: ansicolors: 0.3.2 bn.js: 5.2.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8873,7 +8887,7 @@ snapshots: dependencies: ansicolors: 0.3.2 bn.js: 5.2.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8882,35 +8896,36 @@ snapshots: ansicolors: 0.3.2 assert: 2.1.0 bn.js: 5.2.1 - debug: 4.4.1(supports-color@8.1.1) + 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.844.0 - '@bundlr-network/client': 0.7.17(bufferutil@4.0.9)(debug@4.4.1)(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.1(supports-color@8.1.1) + 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 @@ -8919,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 @@ -8935,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 @@ -8949,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 @@ -8959,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.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -8976,13 +8991,13 @@ 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.6.0 express: 4.21.2 @@ -9022,6 +9037,10 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + '@noble/ed25519@1.7.5': {} '@noble/hashes@1.2.0': {} @@ -9105,10 +9124,10 @@ 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) + '@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 @@ -9116,15 +9135,15 @@ snapshots: '@pancakeswap/chains@0.7.0': {} - '@pancakeswap/infinity-sdk@1.0.6(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.7.0 - '@pancakeswap/permit2-sdk': 1.1.6(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/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.6(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 @@ -9133,11 +9152,11 @@ snapshots: - utf-8-validate - zod - '@pancakeswap/multicall@3.7.3(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.7.0 - '@pancakeswap/sdk': 5.8.17(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/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 @@ -9146,12 +9165,12 @@ snapshots: - utf-8-validate - zod - '@pancakeswap/permit2-sdk@1.1.6(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/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.7.0 - '@pancakeswap/sdk': 5.8.17(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) 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 @@ -9160,37 +9179,37 @@ snapshots: - 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.25.76)': + '@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.25.76) - '@pancakeswap/v2-sdk': 1.1.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@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.37.7(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 - typescript - utf-8-validate - zod - '@pancakeswap/sdk@5.8.17(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.7.0 '@pancakeswap/swap-sdk-core': 1.5.0 - '@pancakeswap/swap-sdk-evm': 1.1.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@pancakeswap/swap-sdk-solana': 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) - '@pancakeswap/v2-sdk': 1.1.6(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 @@ -9199,26 +9218,26 @@ snapshots: - utf-8-validate - zod - '@pancakeswap/smart-router@7.5.3(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.7.0 - '@pancakeswap/infinity-sdk': 1.0.6(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)(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)(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.10(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/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.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/v3-sdk': 3.9.6(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' @@ -9232,11 +9251,11 @@ snapshots: - typescript - utf-8-validate - '@pancakeswap/stable-swap-sdk@2.0.10(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.7.0 '@pancakeswap/swap-sdk-core': 1.5.0 - '@pancakeswap/tokens': 0.7.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/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' @@ -9266,38 +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.25.76)': + '@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.7(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 - typescript - utf-8-validate - zod - '@pancakeswap/swap-sdk-evm@1.1.6(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.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.5(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.7.0 '@pancakeswap/swap-sdk-core': 1.5.0 - '@solana/spl-token': 0.4.14(@solana/web3.js@1.98.4(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.4(bufferutil@4.0.9)(encoding@0.1.13)(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) + '@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: @@ -9315,10 +9334,10 @@ snapshots: optionalDependencies: react: 18.3.1 - '@pancakeswap/tokens@0.7.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/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.7.0 - '@pancakeswap/sdk': 5.8.17(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) '@pancakeswap/token-lists': 0.0.16(react@18.3.1) transitivePeerDependencies: - '@reduxjs/toolkit' @@ -9332,18 +9351,18 @@ snapshots: - utf-8-validate - zod - '@pancakeswap/universal-router-sdk@1.4.15(abitype@1.1.0(typescript@5.8.3)(zod@3.25.76))(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.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)': + '@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.7.0 - '@pancakeswap/infinity-sdk': 1.0.6(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/permit2-sdk': 1.1.6(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)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@pancakeswap/smart-router': 7.5.3(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.6(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) - abitype: 1.1.0(typescript@5.8.3)(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) + '@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.7(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: - '@reduxjs/toolkit' - bufferutil @@ -9357,26 +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.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)': 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.25.76) + '@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.37.7(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 - typescript - utf-8-validate - zod - '@pancakeswap/v2-sdk@1.1.6(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.7.0 '@pancakeswap/swap-sdk-core': 1.5.0 - '@pancakeswap/swap-sdk-evm': 1.1.6(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 @@ -9393,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.25.76)': + '@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.25.76) + '@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.7(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 - typescript - utf-8-validate - zod - '@pancakeswap/v3-sdk@3.9.6(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/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.7.0 - '@pancakeswap/sdk': 5.8.17(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) '@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.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 @@ -9429,19 +9448,19 @@ snapshots: - 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.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/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.25.76) + '@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 - viem: 2.37.7(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 - typescript - utf-8-validate - zod - '@peculiar/asn1-schema@2.3.15': + '@peculiar/asn1-schema@2.5.0': dependencies: asn1js: 3.0.6 pvtsutils: 1.3.6 @@ -9453,7 +9472,7 @@ snapshots: '@peculiar/webcrypto@1.5.0': dependencies: - '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-schema': 2.5.0 '@peculiar/json-schema': 1.1.12 pvtsutils: 1.3.6 tslib: 2.8.1 @@ -9462,7 +9481,7 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.7': {} + '@pkgr/core@0.2.9': {} '@randlabs/communication-bridge@1.0.1': {} @@ -9470,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.10.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 @@ -9512,7 +9531,7 @@ 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.6 @@ -9602,252 +9621,255 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@4.0.4': + '@smithy/abort-controller@4.1.1': dependencies: - '@smithy/types': 4.3.1 + '@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.4': + '@smithy/config-resolver@4.2.2': dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.4 + '@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.7.0': + '@smithy/core@3.11.1': dependencies: - '@smithy/middleware-serde': 4.0.8 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-stream': 4.2.3 - '@smithy/util-utf8': 4.0.0 + '@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.6': + '@smithy/credential-provider-imds@4.1.2': dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 + '@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.4': + '@smithy/eventstream-codec@4.1.1': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.3.1 - '@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.4': + '@smithy/eventstream-serde-browser@4.1.1': dependencies: - '@smithy/eventstream-serde-universal': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/eventstream-serde-universal': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.1.2': + '@smithy/eventstream-serde-config-resolver@4.2.1': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.0.4': + '@smithy/eventstream-serde-node@4.1.1': dependencies: - '@smithy/eventstream-serde-universal': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/eventstream-serde-universal': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.0.4': + '@smithy/eventstream-serde-universal@4.1.1': dependencies: - '@smithy/eventstream-codec': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/eventstream-codec': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.1.0': + '@smithy/fetch-http-handler@5.2.1': dependencies: - '@smithy/protocol-http': 5.1.2 - '@smithy/querystring-builder': 4.0.4 - '@smithy/types': 4.3.1 - '@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.4': + '@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.3.1 + '@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.4': + '@smithy/hash-node@4.1.1': dependencies: - '@smithy/types': 4.3.1 - '@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.4': + '@smithy/hash-stream-node@4.1.1': dependencies: - '@smithy/types': 4.3.1 - '@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.4': + '@smithy/invalid-dependency@4.1.1': dependencies: - '@smithy/types': 4.3.1 + '@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.4': + '@smithy/md5-js@4.1.1': dependencies: - '@smithy/types': 4.3.1 - '@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.4': + '@smithy/middleware-content-length@4.1.1': dependencies: - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.1.14': + '@smithy/middleware-endpoint@4.2.3': dependencies: - '@smithy/core': 3.7.0 - '@smithy/middleware-serde': 4.0.8 - '@smithy/node-config-provider': 4.1.3 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-middleware': 4.0.4 + '@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.15': + '@smithy/middleware-retry@4.2.4': dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/protocol-http': 5.1.2 - '@smithy/service-error-classification': 4.0.6 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 + '@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.8': + '@smithy/middleware-serde@4.1.1': dependencies: - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/middleware-stack@4.0.4': + '@smithy/middleware-stack@4.1.1': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.1.3': + '@smithy/node-config-provider@4.2.2': dependencies: - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@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.1.0': + '@smithy/node-http-handler@4.2.1': dependencies: - '@smithy/abort-controller': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/querystring-builder': 4.0.4 - '@smithy/types': 4.3.1 + '@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.4': + '@smithy/property-provider@4.1.1': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/protocol-http@5.1.2': + '@smithy/protocol-http@5.2.1': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/querystring-builder@4.0.4': + '@smithy/querystring-builder@4.1.1': dependencies: - '@smithy/types': 4.3.1 - '@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.4': + '@smithy/querystring-parser@4.1.1': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/service-error-classification@4.0.6': + '@smithy/service-error-classification@4.1.2': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.5.0 - '@smithy/shared-ini-file-loader@4.0.4': + '@smithy/shared-ini-file-loader@4.2.0': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/signature-v4@5.1.2': + '@smithy/signature-v4@5.2.1': dependencies: - '@smithy/is-array-buffer': 4.0.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@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.4.6': + '@smithy/smithy-client@4.6.3': dependencies: - '@smithy/core': 3.7.0 - '@smithy/middleware-endpoint': 4.1.14 - '@smithy/middleware-stack': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-stream': 4.2.3 + '@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.3.1': + '@smithy/types@4.5.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.0.4': + '@smithy/url-parser@4.1.1': dependencies: - '@smithy/querystring-parser': 4.0.4 - '@smithy/types': 4.3.1 + '@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 @@ -9856,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.22': + '@smithy/util-defaults-mode-browser@4.1.3': dependencies: - '@smithy/property-provider': 4.0.4 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - 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.22': + '@smithy/util-defaults-mode-node@4.1.3': dependencies: - '@smithy/config-resolver': 4.1.4 - '@smithy/credential-provider-imds': 4.0.6 - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 + '@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.6': + '@smithy/util-endpoints@3.1.2': dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 + '@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.4': + '@smithy/util-middleware@4.1.1': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-retry@4.0.6': + '@smithy/util-retry@4.1.2': dependencies: - '@smithy/service-error-classification': 4.0.6 - '@smithy/types': 4.3.1 + '@smithy/service-error-classification': 4.1.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-stream@4.2.3': + '@smithy/util-stream@4.3.2': dependencies: - '@smithy/fetch-http-handler': 5.1.0 - '@smithy/node-http-handler': 4.1.0 - '@smithy/types': 4.3.1 - '@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 @@ -9924,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.6': + '@smithy/util-waiter@4.1.1': dependencies: - '@smithy/abort-controller': 4.0.4 - '@smithy/types': 4.3.1 + '@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 @@ -9951,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.3.0(typescript@5.8.3)': + '@solana/codecs-core@2.3.0(typescript@5.9.2)': dependencies: - '@solana/errors': 2.3.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.3.0(typescript@5.8.3)': + '@solana/codecs-numbers@2.3.0(typescript@5.9.2)': dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.8.3) - '@solana/errors': 2.3.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.4.1 + 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.4.1 + chalk: 5.6.2 commander: 12.1.0 - typescript: 5.8.3 + typescript: 5.9.2 - '@solana/errors@2.3.0(typescript@5.8.3)': + '@solana/errors@2.3.0(typescript@5.9.2)': dependencies: - chalk: 5.4.1 - commander: 14.0.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) + '@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-group@0.0.7(@solana/web3.js@1.98.4(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.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.98.4(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 - '@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) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.4(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)': - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) - '@solana/web3.js': 1.98.4(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 @@ -10113,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 @@ -10126,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 @@ -10140,13 +10154,13 @@ snapshots: - typescript - utf-8-validate - '@solana/spl-token@0.4.14(@solana/web3.js@1.98.4(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.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.98.4(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)(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.4(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.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 @@ -10155,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 @@ -10174,10 +10188,10 @@ snapshots: dependencies: buffer: 6.0.3 - '@solana/wallet-adapter-base@0.9.27(@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 @@ -10187,13 +10201,13 @@ snapshots: '@wallet-standard/base': 1.1.0 '@wallet-standard/features': 1.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)': + '@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.6 - '@noble/curves': 1.9.2 + '@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.3.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 @@ -10201,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 @@ -10210,37 +10224,15 @@ snapshots: - typescript - utf-8-validate - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(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: - '@babel/runtime': 7.27.6 - '@noble/curves': 1.9.2 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.8.3) - agentkeepalive: 4.6.0 - 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 - - 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)': - 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.10.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 @@ -10293,24 +10285,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@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.28.0 + '@babel/types': 7.28.4 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@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.28.0 + '@babel/types': 7.28.4 '@types/bn.js@5.1.6': dependencies: @@ -10416,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 @@ -10426,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.3 + form-data: 4.0.4 '@types/node@11.11.6': {} @@ -10494,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.1(supports-color@8.1.1) + 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 @@ -10530,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.1(supports-color@8.1.1) + '@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.1(supports-color@8.1.1) + 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.2 - 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/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 @@ -10581,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 @@ -10589,25 +10579,25 @@ snapshots: - bufferutil - utf-8-validate - '@uniswap/router-sdk@1.23.0(hardhat@2.25.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.25.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.25.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.25.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.25.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.25.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.25.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.25.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 @@ -10650,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.25.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.25.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.25.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.25.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.25.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.25.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.10.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 @@ -10686,51 +10676,51 @@ snapshots: - hardhat - utf-8-validate - '@uniswap/swap-router-contracts@1.3.1(hardhat@2.25.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.25.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.25.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.25.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.25.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.25.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.7(bufferutil@4.0.9)(hardhat@2.25.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.25.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.25.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.25.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 @@ -10777,12 +10767,12 @@ snapshots: '@uniswap/v3-core': 1.0.1 base64-sol: 1.0.1 - '@uniswap/v3-sdk@3.25.2(hardhat@2.25.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.25.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 @@ -10796,11 +10786,11 @@ snapshots: '@uniswap/v3-core': 1.0.0 '@uniswap/v3-periphery': 1.4.4 - '@uniswap/v4-sdk@1.21.4(hardhat@2.25.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.25.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: @@ -10871,14 +10861,14 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.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): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 zod: 3.25.76 - abitype@1.1.0(typescript@5.8.3)(zod@3.25.76): + abitype@1.1.0(typescript@5.9.2)(zod@3.25.76): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 zod: 3.25.76 abort-controller@3.0.0: @@ -10918,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 @@ -10949,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 @@ -10990,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: @@ -11002,7 +10992,7 @@ snapshots: ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} ansicolors@0.3.2: {} @@ -11013,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.1)(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.27(@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.10.0(debug@4.4.1) + 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) @@ -11124,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: @@ -11180,37 +11170,37 @@ snapshots: await-timeout@1.1.1: {} - axios@1.10.0: + axios@1.12.2: dependencies: - follow-redirects: 1.15.9(debug@4.3.4) - form-data: 4.0.3 + follow-redirects: 1.15.11(debug@4.3.4) + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.10.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.3 + follow-redirects: 1.15.11(debug@4.3.4) + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.10.0(debug@4.4.1): + axios@1.12.2(debug@4.4.3): dependencies: - follow-redirects: 1.15.9(debug@4.4.1) - form-data: 4.0.3 + 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.28.0): + babel-jest@29.7.0(@babel/core@7.28.4): dependencies: - '@babel/core': 7.28.0 + '@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.28.0) + babel-preset-jest: 29.6.3(@babel/core@7.28.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -11230,34 +11220,34 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.0 + '@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.28.0): - dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) - - babel-preset-jest@29.6.3(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 + '@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.28.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) balanced-match@1.0.2: {} @@ -11283,6 +11273,8 @@ snapshots: mixin-deep: 1.3.2 pascalcase: 0.1.1 + baseline-browser-mapping@2.8.6: {} + bech32@1.1.4: {} bech32@2.0.0: {} @@ -11295,7 +11287,7 @@ snapshots: dependencies: bindings: 1.5.0 - bignumber.js@9.3.0: {} + bignumber.js@9.3.1: {} binary-extensions@2.3.0: {} @@ -11369,7 +11361,7 @@ snapshots: bottleneck@2.19.5: {} - bowser@2.11.0: {} + bowser@2.12.1: {} boxen@5.1.2: dependencies: @@ -11434,12 +11426,13 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - browserslist@4.25.1: + browserslist@4.26.2: dependencies: - caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.182 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) + 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: @@ -11555,7 +11548,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001727: {} + caniuse-lite@1.0.30001743: {} capability@0.2.5: {} @@ -11586,11 +11579,11 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.4.1: {} + chalk@5.6.2: {} char-regex@1.0.2: {} - chardet@0.7.0: {} + chardet@2.1.0: {} check-error@1.0.3: dependencies: @@ -11707,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: @@ -11729,8 +11722,6 @@ snapshots: commander@12.1.0: {} - commander@14.0.0: {} - commander@14.0.1: {} commander@2.20.3: {} @@ -11801,13 +11792,13 @@ snapshots: safe-buffer: 5.2.1 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: @@ -11822,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 @@ -11840,14 +11831,14 @@ snapshots: csv-generate@4.5.0: {} - csv-parse@6.0.0: {} + csv-parse@6.1.0: {} csv-stringify@6.6.0: {} - csv@6.4.0: + csv@6.4.1: dependencies: csv-generate: 4.5.0 - csv-parse: 6.0.0 + csv-parse: 6.1.0 csv-stringify: 6.6.0 stream-transform: 3.4.0 @@ -11873,7 +11864,7 @@ snapshots: dateformat@4.6.3: {} - dayjs@1.11.13: {} + dayjs@1.11.18: {} debug@2.6.9: dependencies: @@ -11887,7 +11878,7 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.4.1(supports-color@8.1.1): + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 optionalDependencies: @@ -11905,7 +11896,7 @@ snapshots: dependencies: mimic-response: 3.1.0 - dedent@1.6.0: {} + dedent@1.7.0: {} deep-eql@4.1.4: dependencies: @@ -12012,11 +12003,7 @@ snapshots: dependencies: keccak: 3.0.4 - ejs@3.1.10: - dependencies: - jake: 10.9.2 - - electron-to-chromium@1.5.182: {} + electron-to-chromium@1.5.222: {} elliptic@6.6.1: dependencies: @@ -12042,11 +12029,6 @@ snapshots: encodeurl@2.0.0: {} - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -12060,7 +12042,7 @@ snapshots: environment@1.1.0: {} - error-ex@1.3.2: + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -12204,14 +12186,14 @@ snapshots: eslint: 8.57.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.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.32.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) @@ -12237,24 +12219,24 @@ snapshots: 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.11.1) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash-x: 0.1.1 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.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.1(@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.32.0)(eslint@8.57.1) @@ -12263,12 +12245,12 @@ snapshots: 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.32.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.9 @@ -12279,7 +12261,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@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 @@ -12291,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 @@ -12299,7 +12281,7 @@ 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) @@ -12312,14 +12294,14 @@ snapshots: resolve: 1.22.10 semver: 7.7.2 - eslint-plugin-prettier@5.5.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2): + 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.6.2 prettier-linter-helpers: 1.0.0 - synckit: 0.11.8 + 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: @@ -12338,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 @@ -12349,7 +12331,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -12603,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 @@ -12670,7 +12646,7 @@ snapshots: fast-uri@2.4.0: {} - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} fast-xml-parser@5.2.5: dependencies: @@ -12699,7 +12675,7 @@ snapshots: fast-json-stringify: 5.16.1 find-my-way: 8.2.2 light-my-request: 5.14.0 - pino: 9.7.0 + pino: 9.11.0 process-warning: 3.0.0 proxy-addr: 2.0.7 rfdc: 1.4.1 @@ -12715,9 +12691,9 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.4.6(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: {} @@ -12740,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 @@ -12795,13 +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.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: @@ -12814,14 +12786,15 @@ 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.3: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -12852,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: @@ -13019,21 +12992,21 @@ snapshots: 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 @@ -13042,27 +13015,34 @@ snapshots: graphql@16.11.0: {} - hardhat-watcher@2.5.0(hardhat@2.25.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.25.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.25.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.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 @@ -13082,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 @@ -13196,7 +13176,7 @@ snapshots: 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 @@ -13212,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: {} @@ -13246,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 @@ -13263,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: @@ -13293,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: @@ -13499,8 +13480,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.28.0 - '@babel/parser': 7.28.0 + '@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 @@ -13509,8 +13490,8 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.2 @@ -13525,13 +13506,13 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.1(supports-color@8.1.1) + 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 @@ -13546,13 +13527,6 @@ snapshots: dependencies: '@isaacs/cliui': 8.0.2 - jake@10.9.2: - dependencies: - async: 3.2.6 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - javascript-natural-sort@0.7.1: {} jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): @@ -13588,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 @@ -13605,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 @@ -13624,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.28.0 + '@babel/core': 7.28.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.28.0) + babel-jest: 29.7.0(@babel/core@7.28.4) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -13650,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 @@ -13858,15 +13832,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.28.0 - '@babel/generator': 7.28.0 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) - '@babel/types': 7.28.0 + '@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.28.0) + 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 @@ -13917,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 @@ -13962,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: {} @@ -13974,7 +13948,7 @@ snapshots: json-schema-resolver@2.0.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) rfdc: 1.4.1 uri-js: 4.4.1 transitivePeerDependencies: @@ -14000,7 +13974,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -14107,7 +14081,7 @@ snapshots: ansi-escapes: 7.1.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrap-ansi: 9.0.2 logform@2.7.0: @@ -14135,7 +14109,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.1.0: {} + lru-cache@11.2.1: {} lru-cache@5.1.1: dependencies: @@ -14165,7 +14139,7 @@ snapshots: mathjs@10.6.4: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 complex.js: 2.4.2 decimal.js: 10.6.0 escape-latex: 1.2.0 @@ -14193,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 @@ -14294,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 @@ -14374,7 +14348,7 @@ snapshots: 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 @@ -14384,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: @@ -14405,6 +14379,8 @@ snapshots: negotiator@0.6.3: {} + neo-async@2.6.2: {} + no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -14432,11 +14408,9 @@ snapshots: 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: @@ -14454,7 +14428,7 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.19: {} + node-releases@2.0.21: {} nofilter@3.1.0: {} @@ -14589,7 +14563,7 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - 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.1 '@noble/ciphers': 1.3.0 @@ -14597,14 +14571,14 @@ snapshots: '@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.6(typescript@5.8.3)(zod@3.25.76): + ox@0.9.6(typescript@5.9.2)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -14612,10 +14586,10 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.8.3)(zod@3.25.76) + 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 @@ -14654,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 @@ -14677,7 +14651,7 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.1.0 + lru-cache: 11.2.1 minipass: 7.1.2 path-to-regexp@0.1.12: {} @@ -14703,7 +14677,7 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} pidtree@0.6.0: {} @@ -14730,7 +14704,7 @@ snapshots: pino-std-serializers@7.0.0: {} - pino@9.7.0: + pino@9.11.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 @@ -14754,7 +14728,7 @@ snapshots: dependencies: queue-lit: 1.5.2 - pnpm@10.13.1: {} + pnpm@10.17.0: {} posix-character-classes@0.1.1: {} @@ -15038,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 @@ -15251,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: {} @@ -15269,7 +15243,7 @@ snapshots: slice-ansi@7.1.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 snake-case@3.0.4: @@ -15304,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 @@ -15436,18 +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.5.0 get-east-asian-width: 1.4.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string-width@8.1.0: dependencies: get-east-asian-width: 1.4.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string.prototype.trim@1.2.10: dependencies: @@ -15486,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: {} @@ -15524,9 +15498,9 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.11.8: + synckit@0.11.11: dependencies: - '@pkgr/core': 0.2.7 + '@pkgr/core': 0.2.9 table@6.9.0: dependencies: @@ -15580,20 +15554,20 @@ snapshots: tiny-warning@1.0.3: {} - tinyglobby@0.2.14: + tinyglobby@0.2.15: dependencies: - fdir: 6.4.6(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: {} @@ -15637,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.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(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.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)) + 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.2 type-fest: 4.41.0 - typescript: 5.8.3 + typescript: 5.9.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.28.0) + 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 @@ -15675,7 +15649,7 @@ snapshots: 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 @@ -15777,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 @@ -15836,9 +15813,9 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.1.3(browserslist@4.25.1): + update-browserslist-db@1.1.3(browserslist@4.26.2): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -15885,41 +15862,41 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@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.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.7(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): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.8.3)(zod@3.25.76) + 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.6(typescript@5.8.3)(zod@3.25.76) + 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 @@ -15929,7 +15906,7 @@ snapshots: wait-on@7.0.1(debug@4.3.4): dependencies: - axios: 1.10.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 @@ -15959,7 +15936,7 @@ snapshots: webcrypto-core@1.8.1: dependencies: - '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-schema': 2.5.0 '@peculiar/json-schema': 1.1.12 asn1js: 3.0.6 pvtsutils: 1.3.6 @@ -16051,6 +16028,8 @@ snapshots: word-wrap@1.2.5: {} + wordwrap@1.0.0: {} + workerpool@6.5.1: {} wrap-ansi@6.2.0: @@ -16067,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.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: {} @@ -16115,8 +16094,6 @@ snapshots: yallist@3.1.1: {} - yaml@2.8.0: {} - yaml@2.8.1: {} yargs-parser@20.2.9: {} diff --git a/src/chains/cardano/cardano.ts b/src/chains/cardano/cardano.ts index 4ccab27e06..410f812fa3 100644 --- a/src/chains/cardano/cardano.ts +++ b/src/chains/cardano/cardano.ts @@ -1,11 +1,16 @@ -import { Config, getCardanoConfig } from './cardano.config'; -import { Lucid, Blockfrost, C, UTxO } from '@aiquant/lucid-cardano'; -import { TokenListType, TokenValue } from '../../services/base'; +import crypto from 'crypto'; + +import { Lucid, Blockfrost, UTxO } 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 { promises as fs } from 'fs'; -import fse from 'fs-extra'; -import crypto from 'crypto'; + +import { Config, getCardanoConfig } from './cardano.config'; import { NETWORK_ERROR_CODE, NETWORK_ERROR_MESSAGE, @@ -14,27 +19,13 @@ import { TOKEN_NOT_SUPPORTED_ERROR_MESSAGE, TransactionStatus, } from './cardano.utils'; -import { logger } from '../../services/logger'; -import { TokenListResolutionStrategy } from '../../services/token-list-resolution'; - -//import { Cardanoish } from "../../services/common-interfaces"; -export type CardanoTokenInfo = { - policyId: string; - assetName: string; - decimals: number; - name: string; - symbol: string; - logoURI: string; - address: string; -}; export class Cardano { private static _instances: { [name: string]: Cardano }; - public tokenList: CardanoTokenInfo[] = []; + public tokenList: CardanoToken[] = []; public config: Config; - public tokenMap: Record = {}; + public tokenMap: Record = {}; private _tokenListSource: string; - private _tokenListType: TokenListType; public lucidInstance: Lucid | null = null; public network: string; private _chain: string; @@ -45,11 +36,7 @@ export class Cardano { private constructor(network: string) { // Throw error if network is not 'mainnet' or 'preprod' - if ( - network !== 'mainnet' && - network !== 'preprod' && - network !== 'preview' - ) { + if (network !== 'mainnet' && network !== 'preprod' && network !== 'preview') { throw new HttpException(503, NETWORK_ERROR_MESSAGE, NETWORK_ERROR_CODE); } this.config = getCardanoConfig('cardano', network); @@ -59,7 +46,6 @@ export class Cardano { this.network = this.config.network.name; this.nativeTokenSymbol = this.config.network.nativeCurrencySymbol; this._tokenListSource = this.config.network.tokenListSource; - this._tokenListType = this.config.network.tokenListType; this.projectId = this.config.network.projectId; } public static async getInstance(network: string): Promise { @@ -70,21 +56,14 @@ export class Cardano { if (!Cardano._instances[network]) { const instance = new Cardano(network); - if ( - instance.projectId && - instance.projectId.toLowerCase().startsWith(network.toLowerCase()) - ) { + if (instance.projectId && instance.projectId.toLowerCase().startsWith(network.toLowerCase())) { try { await instance.init(); } catch (err: any) { - logger.warn( - `[Cardano] initial init() skipped for network="${network}": ${err.message}`, - ); + logger.warn(`[Cardano] initial init() skipped for network="${network}": ${err.message}`); } } else { - logger.info( - `[Cardano] skipped init() for network="${network}" because projectId is still placeholder`, - ); + logger.info(`[Cardano] skipped init() for network="${network}" because projectId is still placeholder`); } Cardano._instances[network] = instance; @@ -109,18 +88,17 @@ export class Cardano { if (!this.lucidInstance) { this.lucidInstance = await Lucid.new( new Blockfrost(this.apiURL, this.projectId), - this.network === 'preprod' - ? 'Preprod' - : this.network === 'preview' - ? 'Preview' - : 'Mainnet', + this.network === 'preprod' ? 'Preprod' : this.network === 'preview' ? 'Preview' : 'Mainnet', ); } - if (!this._ready) { - // Ensure we only set ready once + try { + await this.loadTokens(); this._ready = true; - await this.loadTokens(this._tokenListSource, this._tokenListType); + logger.info(`Cardano chain initialized for network=${this.network}`); + } catch (e) { + logger.error(`Failed to initialize Cardano chain: ${e}`); + throw e; } } @@ -136,9 +114,7 @@ export class Cardano { address: string; }> { if (!this._ready) { - throw new Error( - 'Cardano instance is not initialized. Call `init` first.', - ); + throw new Error('Cardano instance is not initialized. Call `init` first.'); } try { @@ -149,18 +125,13 @@ export class Cardano { const address = await lucid.wallet.address(); return { address }; } catch (error: any) { - throw new Error( - `Error retrieving wallet from private key: ${error.message}`, - ); + 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 encryptedPrivateKey: string = await fse.readFile(`${path}/${address}.json`, 'utf8'); const passphrase = ConfigManagerCertPassphrase.readPassphrase(); if (!passphrase) { throw new Error('missing passphrase'); @@ -182,10 +153,7 @@ export class Cardano { 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, - ); + 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; @@ -193,18 +161,12 @@ export class Cardano { return balanceInADA.toString(); } // get Asset balance like MIN and LP - async getAssetBalance( - privateKey: string, - token: CardanoTokenInfo, - ): Promise { - let tokenAdress: string; - + 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.`); } - - tokenAdress = token.policyId + token.assetName; + const tokenAddress: string = token.policyId + token.assetName; const Lucid = this.getLucid(); Lucid.selectWalletFromPrivateKey(privateKey); @@ -217,17 +179,15 @@ export class Cardano { // Calculate token balance const calculatedTokenBalance = utxos.reduce((acc, utxo) => { - if (utxo.assets[tokenAdress]) { - return acc + Number(utxo.assets[tokenAdress]); + 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()}`, - ); + logger.debug(`Token balance for ${address}: ${actualTokenBalance.toString()}`); return actualTokenBalance.toString(); } @@ -235,18 +195,8 @@ export class Cardano { 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 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)))), @@ -273,16 +223,10 @@ export class Cardano { const key = crypto.pbkdf2Sync(password, salt, 5000, 32, 'sha512'); - const decipher = crypto.createDecipheriv( - hash.algorithm, - new Uint8Array(key), - iv, - ); + 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.update(new Uint8Array(Buffer.from(hash.encrypted, 'hex')))), new Uint8Array(decipher.final()), ]; const decrypted = Buffer.concat(decryptedBuffers); @@ -342,22 +286,44 @@ export class Cardano { /** * Load tokens from the token list source */ - public async loadTokens( - tokenListSource: string, - tokenListType: TokenListType, - ): Promise { - logger.info( - `Loading tokens for cardano from ${tokenListType} source: ${tokenListSource}`, - ); + public async loadTokens(): Promise { + logger.info(`Loading tokens for cardano/${this.network} using TokenService`); + try { - this.tokenList = await this.getTokenList(tokenListSource, tokenListType); + // 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`); + logger.info(`Loaded ${this.tokenList.length} tokens for cardano/${this.network}`); // Build token map for faster lookups - this.tokenList.forEach( - (token: CardanoTokenInfo) => (this.tokenMap[token.symbol] = token), - ); + this.tokenList.forEach((token: CardanoToken) => (this.tokenMap[token.symbol] = token)); } } catch (error) { logger.error(`Failed to load token list: ${error.message}`); @@ -365,34 +331,17 @@ export class Cardano { } } - /** - * Get token list from source - */ - private async getTokenList( - tokenListSource: string, - tokenListType: TokenListType, - ): Promise { - const tokensList = await new TokenListResolutionStrategy( - tokenListSource, - tokenListType, - ).resolve(); - - // Normalize addresses - return tokensList.tokens; - } - - public get storedTokenList(): CardanoTokenInfo[] { + public get storedTokenList(): CardanoToken[] { return this.tokenList; } /** * Get token info by symbol or address */ - public getTokenBySymbol(tokenSymbol: string): CardanoTokenInfo | undefined { + public getTokenBySymbol(tokenSymbol: string): CardanoToken | undefined { // First try to find token by symbol const tokenBySymbol = this.tokenList.find( - (token: CardanoTokenInfo) => - token.symbol.toUpperCase() === tokenSymbol.toUpperCase(), + (token: CardanoToken) => token.symbol.toUpperCase() === tokenSymbol.toUpperCase(), ); if (tokenBySymbol) { @@ -402,15 +351,11 @@ export class Cardano { public getTokenAddress(symbol: string): string { let tokenAddress: string = ''; - let tokenInfo = this.getTokenBySymbol(symbol); + 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, - ); + throw new HttpException(500, TOKEN_NOT_SUPPORTED_ERROR_MESSAGE, TOKEN_NOT_SUPPORTED_ERROR_CODE); } tokenAddress = tokenInfo[0]?.policyId + tokenInfo[0]?.assetName; @@ -441,9 +386,7 @@ export class Cardano { // Validate it looks like an Cardano address if (!walletAddress.startsWith('addr')) { - logger.warn( - `Invalid Cardano address found in wallet directory: ${walletAddress}`, - ); + logger.warn(`Invalid Cardano address found in wallet directory: ${walletAddress}`); return null; } @@ -474,13 +417,9 @@ export class Cardano { return utxos; } catch (error: any) { // 4) log the failure for debugging - logger.error( - `Cardano.getUtxos failed for address ${address}: ${error.message || error}`, - ); + 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}`, - ); + throw new Error(`Unable to fetch UTxOs for ${address}: ${error.message || error}`); } } diff --git a/src/chains/cardano/routes/status.ts b/src/chains/cardano/routes/status.ts index d31f8a39d1..86e22adb90 100644 --- a/src/chains/cardano/routes/status.ts +++ b/src/chains/cardano/routes/status.ts @@ -9,14 +9,13 @@ import { import { logger } from '../../../services/logger'; import { Cardano } from '../cardano'; -export async function getCardanoStatus( - network: string, -): Promise { +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; @@ -38,6 +37,7 @@ export async function getCardanoStatus( chain, network, rpcUrl, + rpcProvider, currentBlockNumber, nativeCurrency, }; @@ -86,6 +86,7 @@ export const statusRoute: FastifyPluginAsync = async (fastify) => { chain: 'cardano', network, rpcUrl: 'unavailable', + rpcProvider: 'unavailable', currentBlockNumber: 0, nativeCurrency: 'ADA', }; 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 944ab53666..70c5b44f24 100644 --- a/src/config/routes/updateConfig.ts +++ b/src/config/routes/updateConfig.ts @@ -9,7 +9,6 @@ import { ConfigUpdateResponseSchema, } from '../schemas'; import { updateConfig } from '../utils'; -import { Cardano } from '../../chains/cardano/cardano'; export const updateConfigRoute: FastifyPluginAsync = async (fastify) => { fastify.post<{ Body: ConfigUpdateRequest; Reply: ConfigUpdateResponse }>( @@ -85,14 +84,15 @@ export const updateConfigRoute: FastifyPluginAsync = async (fastify) => { // Build descriptive message const description = `'${namespace}.${path}'`; - // If they updated the projectId for one of the Cardano networks: - if (configPath.startsWith('cardano.') && configPath.endsWith('.projectId')) { - const network = configPath.split('.')[2]; // e.g. 'preprod || mainnet || preview' - console.log('network', network); - const cardano = await Cardano.getInstance(network); - cardano.projectId = String(processedValue); // assign the new key as string - await cardano.init(); // re‐init Lucid on the fly - } + + // // If they updated the projectId for one of the Cardano networks: + // if (fullPath.startsWith('cardano.') && fullPath.endsWith('.projectId')) { + // const network = fullPath.split('.')[2]; + // console.log('network', network); + // const cardano = await Cardano.getInstance(network); + // cardano.projectId = String(processedValue); // assign the new key as string + // await cardano.init(); // re‐init Lucid on the fly + // } return { message: `Configuration updated successfully: ${description} set to ${JSON.stringify(processedValue)}`, diff --git a/src/config/schemas.ts b/src/config/schemas.ts index 34491a50d5..dbc3f816ab 100644 --- a/src/config/schemas.ts +++ b/src/config/schemas.ts @@ -80,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 index 68676dd512..97ad382b0b 100644 --- a/src/connectors/minswap/amm-routes/addLiquidity.ts +++ b/src/connectors/minswap/amm-routes/addLiquidity.ts @@ -1,4 +1,5 @@ -import { BigNumber } from 'ethers'; +import { TxComplete } from '@aiquant/lucid-cardano'; +import { calculateDeposit, Dex } from '@aiquant/minswap-sdk'; import { FastifyPluginAsync } from 'fastify'; import { @@ -9,10 +10,8 @@ import { } from '../../../schemas/amm-schema'; import { logger } from '../../../services/logger'; import { Minswap } from '../minswap'; -import { formatTokenAmount } from '../minswap.utils'; + import { getMinswapAmmLiquidityQuote } from './quoteLiquidity'; -import { Assets, TxComplete } from '@aiquant/lucid-cardano'; -import { Asset, calculateDeposit, Dex } from '@aiquant/minswap-sdk'; async function addLiquidity( fastify: any, @@ -50,8 +49,7 @@ async function addLiquidity( cardano.lucidInstance.selectWalletFromPrivateKey(privateKey); // 4) Determine slippage - const slippage = - slippagePct !== undefined ? slippagePct : minswap.getAllowedSlippage(); // returns decimal, e.g. 0.005 + const slippage = slippagePct !== undefined ? slippagePct : minswap.getAllowedSlippage(); // returns decimal, e.g. 0.005 const { poolState, poolDatum } = await minswap.getPoolData(poolAddress); if (!poolState) { @@ -72,8 +70,7 @@ async function addLiquidity( }); // 7) Apply slippage to LP minimum - const minLP = - (lpAmount * BigInt(Math.floor((1 - slippage) * 1e6))) / BigInt(1e6); + const minLP = (lpAmount * BigInt(Math.floor((1 - slippage) * 1e6))) / BigInt(1e6); // 8) Build tx const dex = new Dex(cardano.lucidInstance); @@ -95,9 +92,12 @@ async function addLiquidity( return { signature: txHash, - fee: txBuild.fee, - baseTokenAmountAdded: quote.baseTokenAmount, - quoteTokenAmountAdded: quote.quoteTokenAmount, + status: 1, + data: { + fee: txBuild.fee, + baseTokenAmountAdded: quote.baseTokenAmount, + quoteTokenAmountAdded: quote.quoteTokenAmount, + }, }; } @@ -134,44 +134,37 @@ export const addLiquidityRoute: FastifyPluginAsync = async (fastify) => { const { network, poolAddress: reqPool, - baseToken, - quoteToken, baseTokenAmount, quoteTokenAmount, slippagePct, walletAddress: reqWallet, } = request.body; - if ( - !baseToken || - !quoteToken || - !baseTokenAmount || - !quoteTokenAmount - ) { + if (!baseTokenAmount || !quoteTokenAmount) { throw fastify.httpErrors.badRequest('Missing parameters'); } const minswap = await Minswap.getInstance(network || 'mainnet'); - const walletAddr = - reqWallet || (await minswap.cardano.getFirstWalletAddress()); + const walletAddr = reqWallet || (await minswap.cardano.getFirstWalletAddress()); if (!walletAddr) { throw fastify.httpErrors.badRequest('No wallet address'); } - const poolAddr = - reqPool || - (await minswap.findDefaultPool(baseToken, quoteToken, 'amm')); - if (!poolAddr) { - throw fastify.httpErrors.notFound( - `Pool not found for ${baseToken}-${quoteToken}`, - ); + // Check if poolAddress is provided + if (!reqPool) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); } + const poolInfo = await minswap.getAmmPoolInfo(reqPool); + + const baseToken = poolInfo.baseTokenAddress; + const quoteToken = poolInfo.quoteTokenAddress; + return await addLiquidity( fastify, network || 'mainnet', walletAddr, - poolAddr, + reqPool, baseToken, quoteToken, baseTokenAmount, diff --git a/src/connectors/minswap/amm-routes/executeSwap.ts b/src/connectors/minswap/amm-routes/executeSwap.ts index aaa6234d57..a68f7de77b 100644 --- a/src/connectors/minswap/amm-routes/executeSwap.ts +++ b/src/connectors/minswap/amm-routes/executeSwap.ts @@ -1,28 +1,23 @@ +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, - ExecuteSwapResponseType, - ExecuteSwapResponse, -} from '../../../schemas/swap-schema'; +} from '../../../schemas/router-schema'; import { logger } from '../../../services/logger'; import { Minswap } from '../minswap'; -import { - ADA, - Asset, - Dex, - calculateSwapExactIn, - calculateSwapExactOut, -} from '@aiquant/minswap-sdk'; import { formatTokenAmount } from '../minswap.utils'; -import { Blockfrost, Lucid, TxComplete } from '@aiquant/lucid-cardano'; export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { await fastify.register(require('@fastify/sensible')); fastify.post<{ Body: ExecuteSwapRequestType; - Reply: ExecuteSwapResponseType; + Reply: SwapExecuteResponseType; }>( '/execute-swap', { @@ -43,7 +38,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { slippagePct: { type: 'number', examples: [1] }, }, }, - response: { 200: ExecuteSwapResponse }, + response: { 200: SwapExecuteResponse }, }, }, async (request) => { @@ -56,25 +51,20 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { amount, // this is always quote quantity side, slippagePct = 1, - poolAddress: reqPool, } = request.body; const net = network || 'mainnet'; const minswap = await Minswap.getInstance(net); - const walletAddr = - reqAddr || (await minswap.cardano.getFirstWalletAddress()); + const walletAddr = reqAddr || (await minswap.cardano.getFirstWalletAddress()); if (!walletAddr) { throw fastify.httpErrors.badRequest('No wallet address provided'); } - const poolAddr = - reqPool || - (await minswap.findDefaultPool(baseToken, quoteToken, 'amm')); + const poolAddr = await minswap.findDefaultPool(baseToken, quoteToken, 'amm'); + if (!poolAddr) { - throw fastify.httpErrors.notFound( - `Pool not found for ${baseToken}-${quoteToken}`, - ); + throw fastify.httpErrors.notFound(`Pool not found for ${baseToken}-${quoteToken}`); } const baseInfo = minswap.cardano.getTokenBySymbol(baseToken)!; @@ -92,7 +82,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { // On‑chain reserves - const { poolState, poolDatum } = await minswap.getPoolData(poolAddr); + const { poolState } = await minswap.getPoolData(poolAddr); if (!poolState) { throw fastify.httpErrors.notFound('Pool state unavailable'); } @@ -102,8 +92,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { const pct = BigInt(slippagePct); // 2) build via SDK - const privateKey = - await minswap.cardano.getWalletFromAddress(walletAddr); + const privateKey = await minswap.cardano.getWalletFromAddress(walletAddr); minswap.cardano.lucidInstance.selectWalletFromPrivateKey(privateKey); const dex = new Dex(minswap.cardano.lucidInstance); @@ -116,9 +105,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { if (side === 'SELL') { // SELL: selling quote tokens to get base tokens // `amount` is the amount of quote tokens to sell (input) - const amountIn = BigInt( - Math.floor(amount * 10 ** quoteInfo.decimals).toString(), - ); + const amountIn = BigInt(Math.floor(amount * 10 ** quoteInfo.decimals).toString()); const { amountOut: idealBaseOut } = calculateSwapExactIn({ amountIn, @@ -129,8 +116,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { txBuild = await dex.buildSwapExactInTx({ sender: walletAddr, - availableUtxos: - await minswap.cardano.lucidInstance.utxosAt(walletAddr), + availableUtxos: await minswap.cardano.lucidInstance.utxosAt(walletAddr), assetIn: quoteToken === 'ADA' ? ADA : assetB, amountIn, assetOut: baseToken === 'ADA' ? ADA : assetA, @@ -140,19 +126,13 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { // SELL: spending quote tokens (-), receiving base tokens (+) quoteAmountChange = -Number(amount); - baseAmountChange = +Number( - formatTokenAmount(minBaseOut.toString(), baseInfo.decimals), - ); + baseAmountChange = +Number(formatTokenAmount(minBaseOut.toString(), baseInfo.decimals)); totalInputSwapped = amount; // quote tokens spent - totalOutputSwapped = Number( - formatTokenAmount(minBaseOut.toString(), baseInfo.decimals), - ); // base tokens received + totalOutputSwapped = Number(formatTokenAmount(minBaseOut.toString(), baseInfo.decimals)); // base tokens received } else { // BUY: buying quote tokens with base tokens // `amount` is the amount of quote tokens to buy (output) - const exactQuoteOut = BigInt( - Math.floor(amount * 10 ** quoteInfo.decimals).toString(), - ); + const exactQuoteOut = BigInt(Math.floor(amount * 10 ** quoteInfo.decimals).toString()); const { amountIn: idealBaseIn } = calculateSwapExactOut({ exactAmountOut: exactQuoteOut, @@ -164,8 +144,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { txBuild = await dex.buildSwapExactOutTx({ sender: walletAddr, - availableUtxos: - await minswap.cardano.lucidInstance.utxosAt(walletAddr), + availableUtxos: await minswap.cardano.lucidInstance.utxosAt(walletAddr), assetIn: baseToken === 'ADA' ? ADA : assetA, maximumAmountIn: maxBaseIn, assetOut: quoteToken === 'ADA' ? ADA : assetB, @@ -173,13 +152,9 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { }); // BUY: spending base tokens (-), receiving quote tokens (+) - baseAmountChange = -Number( - formatTokenAmount(maxBaseIn.toString(), baseInfo.decimals), - ); + baseAmountChange = -Number(formatTokenAmount(maxBaseIn.toString(), baseInfo.decimals)); quoteAmountChange = +Number(amount); - totalInputSwapped = Number( - formatTokenAmount(maxBaseIn.toString(), baseInfo.decimals), - ); // base tokens spent + totalInputSwapped = Number(formatTokenAmount(maxBaseIn.toString(), baseInfo.decimals)); // base tokens spent totalOutputSwapped = amount; // quote tokens received } @@ -190,18 +165,21 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { return { signature: txHash, - totalInputSwapped: totalInputSwapped, - totalOutputSwapped: totalOutputSwapped, - fee: txBuild.fee, - baseTokenBalanceChange: baseAmountChange, - quoteTokenBalanceChange: quoteAmountChange, + status: 1, // 1 = CONFIRMED, 0 = PENDING, -1 = FAILED + data: { + tokenIn: side === 'SELL' ? quoteToken : baseToken, + tokenOut: side === 'SELL' ? baseToken : quoteToken, + amountIn: side === 'SELL' ? totalInputSwapped : totalInputSwapped, + amountOut: side === 'SELL' ? totalOutputSwapped : 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}`, - ); + throw fastify.httpErrors.internalServerError(`Swap execution error: ${err.message}`); } }, ); diff --git a/src/connectors/minswap/amm-routes/poolInfo.ts b/src/connectors/minswap/amm-routes/poolInfo.ts index 5bb3a2fed5..d8eabdd8a8 100644 --- a/src/connectors/minswap/amm-routes/poolInfo.ts +++ b/src/connectors/minswap/amm-routes/poolInfo.ts @@ -1,11 +1,6 @@ import { FastifyPluginAsync } from 'fastify'; -import { - GetPoolInfoRequestType, - GetPoolInfoRequest, - PoolInfo, - PoolInfoSchema, -} from '../../../schemas/amm-schema'; +import { GetPoolInfoRequestType, GetPoolInfoRequest, PoolInfo, PoolInfoSchema } from '../../../schemas/amm-schema'; import { logger } from '../../../services/logger'; import { Minswap } from '../minswap'; @@ -25,9 +20,7 @@ export const ammPoolInfoRoute: FastifyPluginAsync = async (fastify) => { network: { type: 'string', examples: ['mainnet'] }, poolAddress: { type: 'string', - examples: [ - '6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2', - ], + examples: ['6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2'], }, baseToken: { type: 'string', examples: ['ADA'] }, quoteToken: { type: 'string', examples: ['MIN'] }, @@ -40,42 +33,22 @@ export const ammPoolInfoRoute: FastifyPluginAsync = async (fastify) => { }, async (request): Promise => { try { - const { poolAddress, baseToken, quoteToken } = request.query; + const { poolAddress } = request.query; const network = request.query.network || 'mainnet'; const minswap = await Minswap.getInstance(network); - // Check if either poolAddress or both baseToken and quoteToken are provided - if (!poolAddress && (!baseToken || !quoteToken)) { - throw fastify.httpErrors.badRequest( - 'Either poolAddress or both baseToken and quoteToken must be provided', - ); + // Check if either poolAddress is provided + if (!poolAddress) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); } - let poolAddressToUse = poolAddress; - - // If no pool address provided, find default pool using base and quote tokens - if (!poolAddressToUse) { - poolAddressToUse = await minswap.findDefaultPool( - baseToken, - quoteToken, - 'amm', - ); - if (!poolAddressToUse) { - throw fastify.httpErrors.notFound( - `No AMM pool found for pair ${baseToken}-${quoteToken}`, - ); - } - } - - const poolInfo = await minswap.getAmmPoolInfo(poolAddressToUse); + 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', - ); + 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 index 63eabc7d1a..3b53c4ef11 100644 --- a/src/connectors/minswap/amm-routes/quoteLiquidity.ts +++ b/src/connectors/minswap/amm-routes/quoteLiquidity.ts @@ -1,6 +1,8 @@ import { BigNumber } from 'ethers'; import { FastifyPluginAsync } from 'fastify'; -import { Cardano, CardanoTokenInfo } from '../../../chains/cardano/cardano'; + +import { CardanoToken } from '#src/tokens/types'; + import { QuoteLiquidityRequestType, QuoteLiquidityRequest, @@ -25,8 +27,8 @@ export async function getMinswapAmmLiquidityQuote( quoteTokenAmount: number; baseTokenAmountMax: number; quoteTokenAmountMax: number; - baseTokenObj: CardanoTokenInfo; - quoteTokenObj: CardanoTokenInfo; + baseTokenObj: CardanoToken; + quoteTokenObj: CardanoToken; poolAddress?: string; rawBaseTokenAmount: BigNumber; rawQuoteTokenAmount: BigNumber; @@ -46,24 +48,16 @@ export async function getMinswapAmmLiquidityQuote( const baseTokenObj = minswap.cardano.getTokenBySymbol(baseToken); const quoteTokenObj = minswap.cardano.getTokenBySymbol(quoteToken); if (!baseTokenObj || !quoteTokenObj) { - throw new Error( - `Token not found: ${!baseTokenObj ? baseToken : quoteToken}`, - ); + throw new Error(`Token not found: ${!baseTokenObj ? baseToken : quoteToken}`); } let poolAddressToUse = poolAddress; let existingPool = true; if (!poolAddressToUse) { - poolAddressToUse = await minswap.findDefaultPool( - baseToken, - quoteToken, - 'amm', - ); + poolAddressToUse = await minswap.findDefaultPool(baseToken, quoteToken, 'amm'); if (!poolAddressToUse) { existingPool = false; - logger.info( - `No existing pool found for ${baseToken}-${quoteToken}, providing theoretical quote`, - ); + logger.info(`No existing pool found for ${baseToken}-${quoteToken}, providing theoretical quote`); } } @@ -72,8 +66,7 @@ export async function getMinswapAmmLiquidityQuote( let baseLimited = false; if (existingPool) { - const { poolState, poolDatum } = - await minswap.getPoolData(poolAddressToUse); + const { poolState, poolDatum } = await minswap.getPoolData(poolAddressToUse); if (!poolState) { throw new Error(`Unable to load pool ${poolAddressToUse}`); @@ -85,16 +78,10 @@ export async function getMinswapAmmLiquidityQuote( // ── 3) Convert user inputs into raw bigints ─────────── const baseRaw = baseTokenAmount - ? BigInt( - Math.floor(baseTokenAmount * 10 ** baseTokenObj.decimals).toString(), - ) + ? BigInt(Math.floor(baseTokenAmount * 10 ** baseTokenObj.decimals).toString()) : null; const quoteRaw = quoteTokenAmount - ? BigInt( - Math.floor( - quoteTokenAmount * 10 ** quoteTokenObj.decimals, - ).toString(), - ) + ? BigInt(Math.floor(quoteTokenAmount * 10 ** quoteTokenObj.decimals).toString()) : null; // ── 4) Compute the “optimal” opposite amount ─────────── @@ -103,43 +90,27 @@ export async function getMinswapAmmLiquidityQuote( const quoteOptimal = (baseRaw * quoteReserve) / baseReserve; if (quoteOptimal <= quoteRaw) { baseLimited = true; - quoteTokenAmountOptimal = Number( - formatTokenAmount(quoteOptimal.toString(), quoteTokenObj.decimals), - ); + quoteTokenAmountOptimal = Number(formatTokenAmount(quoteOptimal.toString(), quoteTokenObj.decimals)); } else { baseLimited = false; const baseOptimal = (quoteRaw * baseReserve) / quoteReserve; - baseTokenAmountOptimal = Number( - formatTokenAmount(baseOptimal.toString(), baseTokenObj.decimals), - ); + baseTokenAmountOptimal = Number(formatTokenAmount(baseOptimal.toString(), baseTokenObj.decimals)); } } else if (baseRaw !== null) { // only base provided - const quoteOptimal = - baseReserve === BigInt(0) - ? BigInt(0) - : (baseRaw * quoteReserve) / baseReserve; - quoteTokenAmountOptimal = Number( - formatTokenAmount(quoteOptimal.toString(), quoteTokenObj.decimals), - ); + const quoteOptimal = baseReserve === BigInt(0) ? BigInt(0) : (baseRaw * quoteReserve) / baseReserve; + quoteTokenAmountOptimal = Number(formatTokenAmount(quoteOptimal.toString(), quoteTokenObj.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(), baseTokenObj.decimals), - ); + const baseOptimal = quoteReserve === BigInt(0) ? BigInt(0) : (quoteRaw * baseReserve) / quoteReserve; + baseTokenAmountOptimal = Number(formatTokenAmount(baseOptimal.toString(), baseTokenObj.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', - ); + throw new Error('For a new pool, you must supply both baseTokenAmount and quoteTokenAmount'); } baseLimited = false; // arbitrary; both get used } @@ -149,9 +120,7 @@ export async function getMinswapAmmLiquidityQuote( Math.floor(baseTokenAmountOptimal * 10 ** baseTokenObj.decimals).toString(), ); const rawQuoteTokenAmount = BigNumber.from( - Math.floor( - quoteTokenAmountOptimal * 10 ** quoteTokenObj.decimals, - ).toString(), + Math.floor(quoteTokenAmountOptimal * 10 ** quoteTokenObj.decimals).toString(), ); return { @@ -203,15 +172,19 @@ export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { }, async (request) => { try { - const { - network, - poolAddress, - baseToken, - quoteToken, - baseTokenAmount, - quoteTokenAmount, - slippagePct, - } = request.query; + 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 baseToken = poolInfo.baseTokenAddress; + const quoteToken = poolInfo.quoteTokenAddress; const quote = await getMinswapAmmLiquidityQuote( network, @@ -235,9 +208,7 @@ export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { if (e.statusCode) { throw e; } - throw fastify.httpErrors.internalServerError( - 'Failed to get liquidity quote', - ); + throw fastify.httpErrors.internalServerError('Failed to get liquidity quote'); } }, ); diff --git a/src/connectors/minswap/amm-routes/quoteSwap.ts b/src/connectors/minswap/amm-routes/quoteSwap.ts index 83878df97e..4ea50a6593 100644 --- a/src/connectors/minswap/amm-routes/quoteSwap.ts +++ b/src/connectors/minswap/amm-routes/quoteSwap.ts @@ -1,27 +1,27 @@ +import { Asset, calculateSwapExactIn, calculateSwapExactOut } from '@aiquant/minswap-sdk'; +import { BN } from 'bn.js'; import { BigNumber } from 'ethers'; import { FastifyPluginAsync, FastifyInstance } from 'fastify'; -import { Cardano, CardanoTokenInfo } from '../../../chains/cardano/cardano'; + +import { CardanoToken } from '#src/tokens/types'; + +import { Cardano } from '../../../chains/cardano/cardano'; +// NEW - v2.8 schema structure import { - GetSwapQuoteResponseType, - GetSwapQuoteResponse, - GetSwapQuoteRequestType, - GetSwapQuoteRequest, -} from '../../../schemas/swap-schema'; + QuoteSwapRequestType, + QuoteSwapResponseType, + QuoteSwapRequest, + QuoteSwapResponse, +} from '../../../schemas/amm-schema'; import { logger } from '../../../services/logger'; import { Minswap } from '../minswap'; import { formatTokenAmount } from '../minswap.utils'; -import { - Asset, - calculateSwapExactIn, - calculateSwapExactOut, -} from '@aiquant/minswap-sdk'; -import { BN } from 'bn.js'; async function quoteAmmSwap( minswap: Minswap, poolAddress: string, - baseToken: CardanoTokenInfo, - quoteToken: CardanoTokenInfo, + baseToken: CardanoToken, + quoteToken: CardanoToken, amount: number, // now always refers to quote‐token units side: 'BUY' | 'SELL', slippagePct?: number, @@ -42,31 +42,21 @@ async function quoteAmmSwap( if (side === 'BUY') { // For BUY, amount represents the desired quoteToken (output), but we need exactOut calculation // So convert amount using quoteToken decimals - amountInSmallestUnit = BigNumber.from( - Math.floor(amount * 10 ** quoteToken.decimals), - ).toBigInt(); + amountInSmallestUnit = BigNumber.from(Math.floor(amount * 10 ** quoteToken.decimals)).toBigInt(); } else { // For SELL, amount represents the quoteToken to spend (input) // So convert amount using quoteToken decimals - amountInSmallestUnit = BigNumber.from( - Math.floor(amount * 10 ** quoteToken.decimals), - ).toBigInt(); + amountInSmallestUnit = BigNumber.from(Math.floor(amount * 10 ** quoteToken.decimals)).toBigInt(); } const { poolState, poolDatum } = await minswap.getPoolData(poolAddress); - if (!poolState) - throw new Error( - `Pool not found for ${baseToken.symbol}-${quoteToken.symbol}`, - ); + if (!poolState) throw new Error(`Pool not found for ${baseToken.symbol}-${quoteToken.symbol}`); // Figure out reserves & fee depending on input/output const idA = poolState.assetA; const idB = poolState.assetB; - const assetIdIn = - inputToken.symbol === 'ADA' - ? 'lovelace' - : inputToken.policyId + inputToken.assetName; + const assetIdIn = inputToken.symbol === 'ADA' ? 'lovelace' : inputToken.policyId + inputToken.assetName; let reserveIn: bigint, reserveOut: bigint; if (assetIdIn === idA) { reserveIn = poolState.reserveA; @@ -102,40 +92,21 @@ async function quoteAmmSwap( priceImpact = pi.toNumber(); } - const effectiveSlippage = - slippagePct !== undefined - ? slippagePct / 100 - : minswap.getAllowedSlippage(); + const effectiveSlippage = slippagePct !== undefined ? slippagePct / 100 : minswap.getAllowedSlippage(); const minAmountOut = exactIn - ? new BN(outputAmount.toString()) - .mul(new BN(Math.floor((1 - effectiveSlippage) * 10000))) - .div(new BN(10000)) + ? new BN(outputAmount.toString()).mul(new BN(Math.floor((1 - effectiveSlippage) * 10000))).div(new BN(10000)) : outputAmount; const maxAmountIn = exactIn ? inputAmount - : new BN(inputAmount.toString()) - .mul(new BN(Math.floor((1 + effectiveSlippage) * 10000))) - .div(new BN(10000)); + : new BN(inputAmount.toString()).mul(new BN(Math.floor((1 + effectiveSlippage) * 10000))).div(new BN(10000)); // Format human‐readable - const estimatedIn = formatTokenAmount( - inputAmount.toString(), - inputToken.decimals, - ); - const estimatedOut = formatTokenAmount( - outputAmount.toString(), - outputToken.decimals, - ); - const minOutHuman = formatTokenAmount( - minAmountOut.toString(), - outputToken.decimals, - ); - const maxInHuman = formatTokenAmount( - maxAmountIn.toString(), - inputToken.decimals, - ); + const estimatedIn = formatTokenAmount(inputAmount.toString(), inputToken.decimals); + const estimatedOut = formatTokenAmount(outputAmount.toString(), outputToken.decimals); + const minOutHuman = formatTokenAmount(minAmountOut.toString(), outputToken.decimals); + const maxInHuman = formatTokenAmount(maxAmountIn.toString(), inputToken.decimals); return { poolAddress, @@ -196,9 +167,7 @@ export async function getMinswapAmmQuote( throw new Error(`Quote token not found: ${quoteToken}`); } - logger.info( - `Base token: ${baseTokenObj.symbol}, address=${baseTokenObj.address}, decimals=${baseTokenObj.decimals}`, - ); + logger.info(`Base token: ${baseTokenObj.symbol}, address=${baseTokenObj.address}, decimals=${baseTokenObj.decimals}`); logger.info( `Quote token: ${quoteTokenObj.symbol}, address=${quoteTokenObj.address}, decimals=${quoteTokenObj.decimals}`, ); @@ -236,24 +205,23 @@ async function formatSwapQuote( amount: number, side: 'BUY' | 'SELL', slippagePct?: number, -): Promise { +): 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, - ); + 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}`, @@ -289,17 +257,18 @@ async function formatSwapQuote( : quote.estimatedAmountIn / quote.estimatedAmountOut; return { + // Base QuoteSwapResponse fields (matching Uniswap structure) poolAddress, - estimatedAmountIn: quote.estimatedAmountIn, - estimatedAmountOut: quote.estimatedAmountOut, + 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, - baseTokenBalanceChange, - quoteTokenBalanceChange, - price, - gasPrice: 0, - gasLimit: 0, - gasCost: 0, + // AMM-specific fields + priceImpactPct: quote.priceImpact, }; } catch (error) { logger.error(`Error formatting swap quote: ${error.message}`); @@ -315,8 +284,8 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { await fastify.register(require('@fastify/sensible')); fastify.get<{ - Querystring: GetSwapQuoteRequestType; - Reply: GetSwapQuoteResponseType; + Querystring: QuoteSwapRequestType; + Reply: QuoteSwapResponseType; }>( '/quote-swap', { @@ -324,9 +293,9 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { description: 'Get swap quote for Minswap AMM', tags: ['minswap/amm'], querystring: { - ...GetSwapQuoteRequest, + ...QuoteSwapRequest, properties: { - ...GetSwapQuoteRequest.properties, + ...QuoteSwapRequest.properties, network: { type: 'string', default: 'mainnet' }, baseToken: { type: 'string', examples: ['ADA'] }, quoteToken: { type: 'string', examples: ['MIN'] }, @@ -339,7 +308,7 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { response: { 200: { properties: { - ...GetSwapQuoteResponse.properties, + ...QuoteSwapResponse.properties, }, }, }, @@ -364,16 +333,10 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { if (!poolAddress) { // Look up the pool from configuration pools dictionary - poolAddress = await minswap.findDefaultPool( - baseToken, - quoteToken, - 'amm', - ); + poolAddress = await minswap.findDefaultPool(baseToken, quoteToken, 'amm'); if (!poolAddress) { - throw fastify.httpErrors.notFound( - `No AMM pool found for pair ${baseToken}-${quoteToken}`, - ); + throw fastify.httpErrors.notFound(`No AMM pool found for pair ${baseToken}-${quoteToken}`); } } @@ -399,10 +362,7 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { 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') - ) { + 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')) { @@ -410,9 +370,7 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { } // Default to internal server error with the actual error message - throw fastify.httpErrors.internalServerError( - `Error getting swap quote: ${e.message || 'Unknown error'}`, - ); + throw fastify.httpErrors.internalServerError(`Error getting swap quote: ${e.message || 'Unknown error'}`); } }, ); diff --git a/src/connectors/minswap/amm-routes/removeLiquidity.ts b/src/connectors/minswap/amm-routes/removeLiquidity.ts index 3a053182fe..6e64f98a60 100644 --- a/src/connectors/minswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/minswap/amm-routes/removeLiquidity.ts @@ -1,7 +1,6 @@ -import { BigNumber } from 'ethers'; +import { Asset, calculateWithdraw, Dex } from '@aiquant/minswap-sdk'; import { FastifyPluginAsync } from 'fastify'; -import { Cardano } from '../../../chains/cardano/cardano'; import { RemoveLiquidityRequestType, RemoveLiquidityRequest, @@ -10,9 +9,7 @@ import { } from '../../../schemas/amm-schema'; import { logger } from '../../../services/logger'; import { Minswap } from '../minswap'; - import { formatTokenAmount } from '../minswap.utils'; -import { Asset, calculateWithdraw, Dex } from '@aiquant/minswap-sdk'; export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { fastify.post<{ @@ -49,23 +46,14 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const { network, poolAddress: requestedPoolAddress, - baseToken, - quoteToken, percentageToRemove, walletAddress: requestedWalletAddress, } = request.body; const networkToUse = network || 'preprod'; - // Validate essential parameters - if (!baseToken || !quoteToken || !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', - ); + throw fastify.httpErrors.badRequest('Percentage to remove must be between 0 and 100'); } // Get Minswap and Cardano instances @@ -76,36 +64,36 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { if (!walletAddress) { walletAddress = await minswap.cardano.getFirstWalletAddress(); if (!walletAddress) { - throw fastify.httpErrors.badRequest( - 'No wallet address provided and no default wallet found', - ); + throw fastify.httpErrors.badRequest('No wallet address provided and no default wallet found'); } logger.info(`Using first available wallet address: ${walletAddress}`); } + // Check if poolAddress is provided + if (!requestedPoolAddress) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); + } + + const poolInfo = await minswap.getAmmPoolInfo(requestedPoolAddress); + + const baseToken = poolInfo.baseTokenAddress; + const quoteToken = poolInfo.quoteTokenAddress; + // Resolve tokens const baseTokenObj = minswap.cardano.getTokenBySymbol(baseToken); const quoteTokenObj = minswap.cardano.getTokenBySymbol(quoteToken); if (!baseTokenObj || !quoteTokenObj) { - throw fastify.httpErrors.badRequest( - `Token not found: ${!baseTokenObj ? baseToken : quoteToken}`, - ); + throw fastify.httpErrors.badRequest(`Token not found: ${!baseTokenObj ? baseToken : quoteToken}`); } // Find pool address if not provided let poolAddress = requestedPoolAddress; if (!poolAddress) { - poolAddress = await minswap.findDefaultPool( - baseToken, - quoteToken, - 'amm', - ); + poolAddress = await minswap.findDefaultPool(baseToken, quoteToken, 'amm'); if (!poolAddress) { - throw fastify.httpErrors.notFound( - `No AMM pool found for pair ${baseToken}-${quoteToken}`, - ); + throw fastify.httpErrors.notFound(`No AMM pool found for pair ${baseToken}-${quoteToken}`); } } // 5) Fetch on-chain pool state for withdraw calculation @@ -120,20 +108,14 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const { poolState, poolDatum } = await minswap.getPoolData(poolAddress); // 6) Fetch wallet UTxOs (this also selects the key in Lucid) - const wallet = - await minswap.cardano.getWalletFromAddress(walletAddress); + const wallet = await minswap.cardano.getWalletFromAddress(walletAddress); minswap.cardano.lucidInstance.selectWalletFromPrivateKey(wallet); - const utxos = - await minswap.cardano.lucidInstance.utxosAt(walletAddress); + const utxos = await minswap.cardano.lucidInstance.utxosAt(walletAddress); // 8) Calculate withdrawal amounts - const totalLpInWallet = minswap.calculateAssetAmount( - utxos, - poolState.assetLP, - ); + const totalLpInWallet = minswap.calculateAssetAmount(utxos, poolState.assetLP); - const withdrawLpAmount = - (totalLpInWallet * BigInt(percentageToRemove)) / 100n; + const withdrawLpAmount = (totalLpInWallet * BigInt(percentageToRemove)) / 100n; // 9) Calculate the assets to be received upon withdrawal const { amountAReceive, amountBReceive } = calculateWithdraw({ @@ -161,20 +143,17 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const fee = txBuild.fee; // 10) Compute how many tokens were removed (roughly) - const baseTokenAmountRemoved = formatTokenAmount( - amountAReceive, - baseTokenObj.decimals, - ); - const quoteTokenAmountRemoved = formatTokenAmount( - amountBReceive, - quoteTokenObj.decimals, - ); + const baseTokenAmountRemoved = formatTokenAmount(amountAReceive, baseTokenObj.decimals); + const quoteTokenAmountRemoved = formatTokenAmount(amountBReceive, quoteTokenObj.decimals); return { signature: txHash, - fee, - baseTokenAmountRemoved, - quoteTokenAmountRemoved, + status: 1, // 1 = CONFIRMED, 0 = PENDING, -1 = FAILED + data: { + fee, + baseTokenAmountRemoved, + quoteTokenAmountRemoved, + }, }; } catch (e) { logger.error(e); @@ -182,9 +161,7 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { throw e; } - throw fastify.httpErrors.internalServerError( - 'Failed to remove liquidity', - ); + throw fastify.httpErrors.internalServerError('Failed to remove liquidity'); } }, ); diff --git a/src/connectors/minswap/minswap.config.ts b/src/connectors/minswap/minswap.config.ts index 455d42316f..dfb400a481 100644 --- a/src/connectors/minswap/minswap.config.ts +++ b/src/connectors/minswap/minswap.config.ts @@ -9,6 +9,8 @@ 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; @@ -37,9 +39,7 @@ export namespace MinswapConfig { export const config: RootConfig = { // Global configuration - allowedSlippage: ConfigManagerV2.getInstance().get( - 'minswap.allowedSlippage', - ), + allowedSlippage: ConfigManagerV2.getInstance().get('minswap.allowedSlippage'), // Network-specific pools networks: ConfigManagerV2.getInstance().get('minswap.networks'), @@ -53,10 +53,7 @@ export namespace MinswapConfig { }; // Helper methods to get pools for a specific network - export const getNetworkPools = ( - network: string, - poolType: 'amm', - ): PoolsConfig => { + export const getNetworkPools = (network: string, poolType: 'amm'): PoolsConfig => { return config.networks[network]?.[poolType] || {}; }; } diff --git a/src/connectors/minswap/minswap.ts b/src/connectors/minswap/minswap.ts index fe515730c1..7849f6a85d 100644 --- a/src/connectors/minswap/minswap.ts +++ b/src/connectors/minswap/minswap.ts @@ -1,22 +1,13 @@ -import { Cardano } from '../../chains/cardano/cardano'; 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 { - ADA, - Asset, - BlockfrostAdapter, - NetworkId, - PoolV1, -} from '@aiquant/minswap-sdk'; - -import { - percentRegexp, - ConfigManagerV2, -} from '../../services/config-manager-v2'; + +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 { PoolInfo } from '../../schemas/amm-schema'; import { findPoolAddress, isFractionString } from './minswap.utils'; export class Minswap { @@ -60,19 +51,13 @@ export class Minswap { this.owner = await this.cardano.getWalletFromAddress(walletAddress); } this.blockfrostAdapter = new BlockfrostAdapter({ - networkId: - this.cardano.network === 'preprod' - ? NetworkId.TESTNET - : NetworkId.MAINNET, + 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'), - ); + logger.info('Minswap initialized' + (walletAddress ? ` with wallet: ${walletAddress}` : 'with no wallet')); } catch (error) { logger.error('Minswap initialization failed:', error); throw error; @@ -95,25 +80,69 @@ export class Minswap { return slippage * 100; } - private getPairKey(baseToken: string, quoteToken: string): string { - return `${baseToken}-${quoteToken}`; - } + // 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 = MinswapConfig.getNetworkPools(network, routeType); + // 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; + // if (!pools) return null; + // // For simplicity, return the first pool in the list + // const firstPoolAddress = Object.values(pools)[0]; + // return firstPoolAddress || null; + // } - const pairKey = this.getPairKey(baseToken, quoteToken); - const reversePairKey = this.getPairKey(quoteToken, baseToken); + /** + * 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; + } - return pools[pairKey] || pools[reversePairKey] || 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 { @@ -148,11 +177,6 @@ export class Minswap { price: price[0], baseTokenAmount: baseTokenAmount, quoteTokenAmount: quoteTokenAmount, - poolType: 'amm', - lpMint: { - address: pool.assetLP, - decimals: 0, - }, }; } @@ -173,9 +197,7 @@ export class Minswap { 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.', - ); + throw new Error('Encountered a malformed percent string in the config for allowed slippage.'); } public calculateAssetAmount(utxos: UTxO[], asset: string): bigint { @@ -195,9 +217,7 @@ export class Minswap { if (!poolState) { throw new Error(`Not found PoolState of ID: ${poolAddress}`); } - const rawPoolDatum = await this.blockfrostAdapter.getDatumByDatumHash( - poolState.datumHash, - ); + const rawPoolDatum = await this.blockfrostAdapter.getDatumByDatumHash(poolState.datumHash); const poolDatum = PoolV1.Datum.fromPlutusData( this.networkName === 'mainnet' ? NetworkId.MAINNET : NetworkId.TESTNET, Data.from(rawPoolDatum), diff --git a/src/connectors/sundaeswap/amm-routes/addLiquidity.ts b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts index d571130f05..327e23997e 100644 --- a/src/connectors/sundaeswap/amm-routes/addLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts @@ -1,3 +1,7 @@ +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'; @@ -10,18 +14,8 @@ import { import { logger } from '../../../services/logger'; import { Sundaeswap } from '../sundaeswap'; import { formatTokenAmount } from '../sundaeswap.utils'; + import { getSundaeswapAmmLiquidityQuote } from './quoteLiquidity'; -import { Assets, TxComplete } from '@aiquant/lucid-cardano'; -import { - EDatumType, - IDepositConfigArgs, - TSupportedNetworks, -} from '@aiquant/sundaeswap-core'; -import { AssetAmount, IAssetAmountMetadata } from '@sundaeswap/asset'; -import { - DatumBuilderLucidV3, - TxBuilderLucidV3, -} from '@aiquant/sundaeswap-core/lucid'; async function addLiquidity( fastify: any, @@ -86,9 +80,12 @@ async function addLiquidity( return { signature: txHash, - fee: builtTx.builtTx.fee, - baseTokenAmountAdded: quote.baseTokenAmount, - quoteTokenAmountAdded: quote.quoteTokenAmount, + status: 1, // 1 = CONFIRMED, 0 = PENDING, -1 = FAILED + data: { + fee: builtTx.builtTx.fee, + baseTokenAmountAdded: quote.baseTokenAmount, + quoteTokenAmountAdded: quote.quoteTokenAmount, + }, }; } @@ -125,44 +122,36 @@ export const addLiquidityRoute: FastifyPluginAsync = async (fastify) => { const { network, poolAddress: reqPool, - baseToken, - quoteToken, baseTokenAmount, quoteTokenAmount, slippagePct, walletAddress: reqWallet, } = request.body; - if ( - !baseToken || - !quoteToken || - !baseTokenAmount || - !quoteTokenAmount - ) { + if (!baseTokenAmount || !quoteTokenAmount) { throw fastify.httpErrors.badRequest('Missing parameters'); } const sundaeswap = await Sundaeswap.getInstance(network || 'mainnet'); - const walletAddr = - reqWallet || (await sundaeswap.cardano.getFirstWalletAddress()); + const walletAddr = reqWallet || (await sundaeswap.cardano.getFirstWalletAddress()); if (!walletAddr) { throw fastify.httpErrors.badRequest('No wallet address'); } - const poolAddr = - reqPool || - (await sundaeswap.findDefaultPool(baseToken, quoteToken, 'amm')); - if (!poolAddr) { - throw fastify.httpErrors.notFound( - `Pool not found for ${baseToken}-${quoteToken}`, - ); + // Check if poolAddress is provided + if (!reqPool) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); } + const poolInfo = await sundaeswap.getAmmPoolInfo(reqPool); + + const baseToken = poolInfo.baseTokenAddress; + const quoteToken = poolInfo.quoteTokenAddress; return await addLiquidity( fastify, network || 'mainnet', walletAddr, - poolAddr, + reqPool, baseToken, quoteToken, baseTokenAmount, diff --git a/src/connectors/sundaeswap/amm-routes/executeSwap.ts b/src/connectors/sundaeswap/amm-routes/executeSwap.ts index 8ececa3ae0..179317da87 100644 --- a/src/connectors/sundaeswap/amm-routes/executeSwap.ts +++ b/src/connectors/sundaeswap/amm-routes/executeSwap.ts @@ -1,33 +1,26 @@ +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, - ExecuteSwapResponseType, - ExecuteSwapResponse, -} from '../../../schemas/swap-schema'; +} from '../../../schemas/router-schema'; import { logger } from '../../../services/logger'; import { Sundaeswap } from '../sundaeswap'; import { formatTokenAmount } from '../sundaeswap.utils'; -import { - EDatumType, - ESwapType, - ISwapConfigArgs, - TSupportedNetworks, -} from '@aiquant/sundaeswap-core'; -import { - DatumBuilderLucidV3, - TxBuilderLucidV3, -} from '@aiquant/sundaeswap-core/lucid'; -import { AssetAmount, IAssetAmountMetadata } from '@sundaeswap/asset'; -import { BigNumber } from 'ethers'; -import { CardanoTokenInfo } from '../../../chains/cardano/cardano'; export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { await fastify.register(require('@fastify/sensible')); fastify.post<{ Body: ExecuteSwapRequestType; - Reply: ExecuteSwapResponseType; + Reply: SwapExecuteResponseType; }>( '/execute-swap', { @@ -48,43 +41,28 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { slippagePct: { type: 'number', examples: [1] }, }, }, - response: { 200: ExecuteSwapResponse }, + response: { 200: SwapExecuteResponse }, }, }, async (request) => { try { - const { - network, - walletAddress: reqAddr, - baseToken, - quoteToken, - amount, - side, - slippagePct = 1, - poolAddress: reqPool, - } = request.body; + 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()); + const walletAddr = reqAddr || (await sundaeswap.cardano.getFirstWalletAddress()); if (!walletAddr) { throw fastify.httpErrors.badRequest('No wallet address provided'); } - const wallet = - await sundaeswap.cardano.getWalletFromAddress(walletAddr); + const wallet = await sundaeswap.cardano.getWalletFromAddress(walletAddr); sundaeswap.cardano.lucidInstance.selectWalletFromPrivateKey(wallet); // determine pool - const poolAddr = - reqPool || - (await sundaeswap.findDefaultPool(baseToken, quoteToken, 'amm')); + const poolAddr = await sundaeswap.findDefaultPool(baseToken, quoteToken, 'amm'); if (!poolAddr) { - throw fastify.httpErrors.notFound( - `Pool not found for ${baseToken}-${quoteToken}`, - ); + throw fastify.httpErrors.notFound(`Pool not found for ${baseToken}-${quoteToken}`); } const poolData = await sundaeswap.getPoolData(poolAddr); @@ -103,12 +81,8 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { const reserveB = BigInt(poolData.liquidity.bReserve); // Determine which token corresponds to which asset in the pool - const baseAssetId = - baseTokenObj.address || - `${baseTokenObj.policyId}.${baseTokenObj.assetName}`; - const quoteAssetId = - quoteTokenObj.address || - `${quoteTokenObj.policyId}.${quoteTokenObj.assetName}`; + const baseAssetId = baseTokenObj.address || `${baseTokenObj.policyId}.${baseTokenObj.assetName}`; + const quoteAssetId = quoteTokenObj.address || `${quoteTokenObj.policyId}.${quoteTokenObj.assetName}`; let baseReserve: bigint; let quoteReserve: bigint; @@ -121,61 +95,45 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { baseReserve = reserveB; quoteReserve = reserveA; } else { - throw fastify.httpErrors.badRequest( - `Base token ${baseAssetId} not found in pool`, - ); + throw fastify.httpErrors.badRequest(`Base token ${baseAssetId} not found in pool`); } // Validate quote token is in the pool - const quoteInPool = - quoteAssetId.trim() === assetA || quoteAssetId.trim() === assetB; + const quoteInPool = quoteAssetId.trim() === assetA || quoteAssetId.trim() === assetB; if (!quoteInPool) { - throw fastify.httpErrors.badRequest( - `Quote token ${quoteAssetId} not found in pool`, - ); + throw fastify.httpErrors.badRequest(`Quote token ${quoteAssetId} not found in pool`); } // Convert amount to smallest units and calculate swap amounts const fee = poolData.currentFee; // e.g., 0.005 for 0.5% let inputAmount: bigint; let outputAmount: bigint; - let inputTokenObj: CardanoTokenInfo; - let outputTokenObj: CardanoTokenInfo; + let inputTokenObj: CardanoToken; + let outputTokenObj: CardanoToken; if (side === 'SELL') { // SELL: spending `amount` of quoteToken, receiving baseToken inputTokenObj = quoteTokenObj; outputTokenObj = baseTokenObj; - inputAmount = BigInt( - Math.floor(amount * 10 ** quoteTokenObj.decimals), - ); + inputAmount = BigInt(Math.floor(amount * 10 ** quoteTokenObj.decimals)); // Apply AMM formula for sell (exactIn): dy = (y * dx * (1 - fee)) / (x + dx * (1 - fee)) - const inputAfterFee = - (inputAmount * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; - outputAmount = - (baseReserve * inputAfterFee) / (quoteReserve + inputAfterFee); + const inputAfterFee = (inputAmount * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; + outputAmount = (baseReserve * inputAfterFee) / (quoteReserve + inputAfterFee); } else { // BUY: wanting to receive `amount` of quoteToken, paying baseToken inputTokenObj = baseTokenObj; outputTokenObj = quoteTokenObj; - outputAmount = BigInt( - Math.floor(amount * 10 ** quoteTokenObj.decimals), - ); + outputAmount = BigInt(Math.floor(amount * 10 ** quoteTokenObj.decimals)); // Check if we have enough liquidity if (outputAmount >= quoteReserve) { - throw fastify.httpErrors.badRequest( - 'Insufficient liquidity: requested amount exceeds available reserves', - ); + throw fastify.httpErrors.badRequest('Insufficient liquidity: requested amount exceeds available reserves'); } // Apply AMM formula for buy (exactOut): dx = (x * dy) / ((y - dy) * (1 - fee)) const numerator = baseReserve * outputAmount; - const denominator = - ((quoteReserve - outputAmount) * - BigInt(Math.floor((1 - fee) * 10000))) / - 10000n; + const denominator = ((quoteReserve - outputAmount) * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; inputAmount = numerator / denominator; } @@ -187,14 +145,12 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { decimals: 6, } : { - assetId: - inputTokenObj.address || - `${inputTokenObj.policyId}.${inputTokenObj.assetName}`, + assetId: inputTokenObj.address || `${inputTokenObj.policyId}.${inputTokenObj.assetName}`, decimals: inputTokenObj.decimals, }; // Prepare suppliedAsset - let suppliedAsset: AssetAmount = new AssetAmount(inputAmount, asset); + const suppliedAsset: AssetAmount = new AssetAmount(inputAmount, asset); // Build swap transaction const args: ISwapConfigArgs = { @@ -209,10 +165,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { suppliedAsset, }; - const txBuilder = new TxBuilderLucidV3( - sundaeswap.cardano.lucidInstance, - new DatumBuilderLucidV3(net), - ); + const txBuilder = new TxBuilderLucidV3(sundaeswap.cardano.lucidInstance, new DatumBuilderLucidV3(net)); const swapResult = await txBuilder.swap({ ...args }); const builtTx = await swapResult.build(); @@ -221,10 +174,8 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { const txHash = await submit(); // Format response values - convert back to human readable amounts - const inputAmountHuman = - Number(inputAmount) / 10 ** inputTokenObj.decimals; - const outputAmountHuman = - Number(outputAmount) / 10 ** outputTokenObj.decimals; + const inputAmountHuman = Number(inputAmount) / 10 ** inputTokenObj.decimals; + const outputAmountHuman = Number(outputAmount) / 10 ** outputTokenObj.decimals; // Calculate balance changes correctly let baseTokenBalanceChange: number; @@ -244,18 +195,21 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { return { signature: txHash, - totalInputSwapped: inputAmountHuman, - totalOutputSwapped: outputAmountHuman, - fee: builtTx.builtTx.fee, - baseTokenBalanceChange, - quoteTokenBalanceChange, + status: 1, // 1 = CONFIRMED, 0 = PENDING, -1 = FAILED + data: { + tokenIn: side === 'SELL' ? quoteToken : baseToken, + tokenOut: side === 'SELL' ? baseToken : quoteToken, + 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}`, - ); + throw fastify.httpErrors.internalServerError(`Swap execution error: ${err.message}`); } }, ); diff --git a/src/connectors/sundaeswap/amm-routes/poolInfo.ts b/src/connectors/sundaeswap/amm-routes/poolInfo.ts index b50268fc49..abdd8a11d4 100644 --- a/src/connectors/sundaeswap/amm-routes/poolInfo.ts +++ b/src/connectors/sundaeswap/amm-routes/poolInfo.ts @@ -1,11 +1,6 @@ import { FastifyPluginAsync } from 'fastify'; -import { - GetPoolInfoRequestType, - GetPoolInfoRequest, - PoolInfo, - PoolInfoSchema, -} from '../../../schemas/amm-schema'; +import { GetPoolInfoRequestType, GetPoolInfoRequest, PoolInfo, PoolInfoSchema } from '../../../schemas/amm-schema'; import { logger } from '../../../services/logger'; import { Sundaeswap } from '../sundaeswap'; @@ -25,9 +20,7 @@ export const ammPoolInfoRoute: FastifyPluginAsync = async (fastify) => { network: { type: 'string', examples: ['mainnet'] }, poolIdent: { type: 'string', - examples: [ - '2f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773', - ], + examples: ['2f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773'], }, baseToken: { type: 'string', examples: ['ADA'] }, quoteToken: { type: 'string', examples: ['SUNDAE'] }, @@ -40,42 +33,23 @@ export const ammPoolInfoRoute: FastifyPluginAsync = async (fastify) => { }, async (request): Promise => { try { - const { poolAddress: poolIdent, baseToken, quoteToken } = request.query; + const { poolAddress: poolIdent } = request.query; const network = request.query.network || 'mainnet'; const sundaeswap = await Sundaeswap.getInstance(network); // Check if either poolIdent or both baseToken and quoteToken are provided - if (!poolIdent && (!baseToken || !quoteToken)) { - throw fastify.httpErrors.badRequest( - 'Either poolIdent or both baseToken and quoteToken must be provided', - ); - } - - let poolIdentToUse = poolIdent; - - // If no pool address provided, find default pool using base and quote tokens - if (!poolIdentToUse) { - poolIdentToUse = await sundaeswap.findDefaultPool( - baseToken, - quoteToken, - 'amm', - ); - if (!poolIdentToUse) { - throw fastify.httpErrors.notFound( - `No AMM pool found for pair ${baseToken}-${quoteToken}`, - ); - } + if (!poolIdent) { + throw fastify.httpErrors.badRequest('poolIdent is required'); } + const poolIdentToUse = poolIdent; const poolInfo = await sundaeswap.getAmmPoolInfo(poolIdentToUse); 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', - ); + 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 index 8cc935c780..6edb0fe710 100644 --- a/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts @@ -1,6 +1,9 @@ +import { IPoolData } from '@aiquant/sundaeswap-core'; import { BigNumber } from 'ethers'; import { FastifyPluginAsync } from 'fastify'; -import { Cardano, CardanoTokenInfo } from '../../../chains/cardano/cardano'; + +import { CardanoToken } from '#src/tokens/types'; + import { QuoteLiquidityRequestType, QuoteLiquidityRequest, @@ -10,7 +13,6 @@ import { import { logger } from '../../../services/logger'; import { Sundaeswap } from '../sundaeswap'; import { formatTokenAmount } from '../sundaeswap.utils'; -import { IPoolData } from '@aiquant/sundaeswap-core'; export async function getSundaeswapAmmLiquidityQuote( network: string, @@ -26,8 +28,8 @@ export async function getSundaeswapAmmLiquidityQuote( quoteTokenAmount: number; baseTokenAmountMax: number; quoteTokenAmountMax: number; - baseTokenObj: CardanoTokenInfo; - quoteTokenObj: CardanoTokenInfo; + baseTokenObj: CardanoToken; + quoteTokenObj: CardanoToken; poolAddress?: string; rawBaseTokenAmount: string; rawQuoteTokenAmount: string; @@ -47,24 +49,16 @@ export async function getSundaeswapAmmLiquidityQuote( const baseTokenObj = sundaeswap.cardano.getTokenBySymbol(baseToken); const quoteTokenObj = sundaeswap.cardano.getTokenBySymbol(quoteToken); if (!baseTokenObj || !quoteTokenObj) { - throw new Error( - `Token not found: ${!baseTokenObj ? baseToken : quoteToken}`, - ); + throw new Error(`Token not found: ${!baseTokenObj ? baseToken : quoteToken}`); } let poolAddressToUse = poolAddress; let existingPool = true; if (!poolAddressToUse) { - poolAddressToUse = await sundaeswap.findDefaultPool( - baseToken, - quoteToken, - 'amm', - ); + poolAddressToUse = await sundaeswap.findDefaultPool(baseToken, quoteToken, 'amm'); if (!poolAddressToUse) { existingPool = false; - logger.info( - `No existing pool found for ${baseToken}-${quoteToken}, providing theoretical quote`, - ); + logger.info(`No existing pool found for ${baseToken}-${quoteToken}, providing theoretical quote`); } } @@ -86,16 +80,10 @@ export async function getSundaeswapAmmLiquidityQuote( // ── 3) Convert user inputs into raw bigints ─────────── const baseRaw = baseTokenAmount - ? BigInt( - Math.floor(baseTokenAmount * 10 ** baseTokenObj.decimals).toString(), - ) + ? BigInt(Math.floor(baseTokenAmount * 10 ** baseTokenObj.decimals).toString()) : null; const quoteRaw = quoteTokenAmount - ? BigInt( - Math.floor( - quoteTokenAmount * 10 ** quoteTokenObj.decimals, - ).toString(), - ) + ? BigInt(Math.floor(quoteTokenAmount * 10 ** quoteTokenObj.decimals).toString()) : null; // ── 4) Compute the "optimal" opposite amount ─────────── @@ -104,55 +92,35 @@ export async function getSundaeswapAmmLiquidityQuote( const quoteOptimal = (baseRaw * quoteReserve) / baseReserve; if (quoteOptimal <= quoteRaw) { baseLimited = true; - quoteTokenAmountOptimal = Number( - formatTokenAmount(quoteOptimal.toString(), quoteTokenObj.decimals), - ); + quoteTokenAmountOptimal = Number(formatTokenAmount(quoteOptimal.toString(), quoteTokenObj.decimals)); } else { baseLimited = false; const baseOptimal = (quoteRaw * baseReserve) / quoteReserve; - baseTokenAmountOptimal = Number( - formatTokenAmount(baseOptimal.toString(), baseTokenObj.decimals), - ); + baseTokenAmountOptimal = Number(formatTokenAmount(baseOptimal.toString(), baseTokenObj.decimals)); } } else if (baseRaw !== null) { // only base provided - const quoteOptimal = - baseReserve === BigInt(0) - ? BigInt(0) - : (baseRaw * quoteReserve) / baseReserve; - quoteTokenAmountOptimal = Number( - formatTokenAmount(quoteOptimal.toString(), quoteTokenObj.decimals), - ); + const quoteOptimal = baseReserve === BigInt(0) ? BigInt(0) : (baseRaw * quoteReserve) / baseReserve; + quoteTokenAmountOptimal = Number(formatTokenAmount(quoteOptimal.toString(), quoteTokenObj.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(), baseTokenObj.decimals), - ); + const baseOptimal = quoteReserve === BigInt(0) ? BigInt(0) : (quoteRaw * baseReserve) / quoteReserve; + baseTokenAmountOptimal = Number(formatTokenAmount(baseOptimal.toString(), baseTokenObj.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', - ); + throw new Error('For a new pool, you must supply both baseTokenAmount and quoteTokenAmount'); } baseLimited = false; // arbitrary; both get used } // ── 5) Convert back into Ethers BigNumber for any on‐chain tx ─── - const rawBaseTokenAmount = Math.floor( - baseTokenAmountOptimal * 10 ** baseTokenObj.decimals, - ).toString(); + const rawBaseTokenAmount = Math.floor(baseTokenAmountOptimal * 10 ** baseTokenObj.decimals).toString(); - const rawQuoteTokenAmount = Math.floor( - quoteTokenAmountOptimal * 10 ** quoteTokenObj.decimals, - ).toString(); + const rawQuoteTokenAmount = Math.floor(quoteTokenAmountOptimal * 10 ** quoteTokenObj.decimals).toString(); return { baseLimited, @@ -203,15 +171,19 @@ export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { }, async (request) => { try { - const { - network, - poolAddress, - baseToken, - quoteToken, - baseTokenAmount, - quoteTokenAmount, - slippagePct, - } = request.query; + const { network, poolAddress, baseTokenAmount, quoteTokenAmount, slippagePct } = request.query; + + const sundaeswap = await Sundaeswap.getInstance(network); + + // Check if poolAddress is provided + if (!poolAddress) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); + } + + const poolInfo = await sundaeswap.getAmmPoolInfo(poolAddress); + + const baseToken = poolInfo.baseTokenAddress; + const quoteToken = poolInfo.quoteTokenAddress; const quote = await getSundaeswapAmmLiquidityQuote( network, @@ -235,9 +207,7 @@ export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { if (e.statusCode) { throw e; } - throw fastify.httpErrors.internalServerError( - 'Failed to get liquidity quote', - ); + throw fastify.httpErrors.internalServerError('Failed to get liquidity quote'); } }, ); diff --git a/src/connectors/sundaeswap/amm-routes/quoteSwap.ts b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts index cf2bc89b69..90cc88d771 100644 --- a/src/connectors/sundaeswap/amm-routes/quoteSwap.ts +++ b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts @@ -1,12 +1,14 @@ import { BigNumber } from 'ethers'; import { FastifyPluginAsync, FastifyInstance } from 'fastify'; -import { CardanoTokenInfo } from '../../../chains/cardano/cardano'; + +import { CardanoToken } from '#src/tokens/types'; + import { - GetSwapQuoteResponseType, - GetSwapQuoteResponse, - GetSwapQuoteRequestType, - GetSwapQuoteRequest, -} from '../../../schemas/swap-schema'; + QuoteSwapRequestType, + QuoteSwapResponseType, + QuoteSwapRequest, + QuoteSwapResponse, +} from '../../../schemas/amm-schema'; import { logger } from '../../../services/logger'; import { Sundaeswap } from '../sundaeswap'; import { formatTokenAmount } from '../sundaeswap.utils'; @@ -14,8 +16,8 @@ import { formatTokenAmount } from '../sundaeswap.utils'; export async function quoteAmmSwap( sundaeswap: Sundaeswap, poolIdent: string, - baseToken: CardanoTokenInfo, - quoteToken: CardanoTokenInfo, + baseToken: CardanoToken, + quoteToken: CardanoToken, amount: number, // now always refers to quote‐token units side: 'BUY' | 'SELL', slippagePct: number = 1, // Default to 1% if not provided @@ -31,10 +33,8 @@ export async function quoteAmmSwap( const reserveB = BigInt(poolData.liquidity.bReserve); // Determine which token corresponds to which asset in the pool - const baseAssetId = - baseToken.address || `${baseToken.policyId}.${baseToken.assetName}`; - const quoteAssetId = - quoteToken.address || `${quoteToken.policyId}.${quoteToken.assetName}`; + const baseAssetId = baseToken.address || `${baseToken.policyId}.${baseToken.assetName}`; + const quoteAssetId = quoteToken.address || `${quoteToken.policyId}.${quoteToken.assetName}`; let baseReserve: bigint; let quoteReserve: bigint; @@ -51,8 +51,7 @@ export async function quoteAmmSwap( } // Validate quote token is in the pool - const quoteInPool = - quoteAssetId.trim() === assetA || quoteAssetId.trim() === assetB; + const quoteInPool = quoteAssetId.trim() === assetA || quoteAssetId.trim() === assetB; if (!quoteInPool) { throw new Error(`Quote token ${quoteAssetId} not found in pool`); } @@ -68,10 +67,8 @@ export async function quoteAmmSwap( inputAmount = BigInt(Math.floor(amount * 10 ** quoteToken.decimals)); // Apply AMM formula for sell (exactIn): dy = (y * dx * (1 - fee)) / (x + dx * (1 - fee)) - const inputAfterFee = - (inputAmount * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; - outputAmount = - (baseReserve * inputAfterFee) / (quoteReserve + inputAfterFee); + const inputAfterFee = (inputAmount * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; + outputAmount = (baseReserve * inputAfterFee) / (quoteReserve + inputAfterFee); } else { // BUY: wanting to receive `amount` of quoteToken, paying baseToken // This is exactOut scenario @@ -79,49 +76,32 @@ export async function quoteAmmSwap( // Check if we have enough liquidity if (outputAmount >= quoteReserve) { - throw new Error( - 'Insufficient liquidity: requested amount exceeds available reserves', - ); + throw new Error('Insufficient liquidity: requested amount exceeds available reserves'); } // Apply AMM formula for buy (exactOut): dx = (x * dy) / ((y - dy) * (1 - fee)) const numerator = baseReserve * outputAmount; - const denominator = - ((quoteReserve - outputAmount) * BigInt(Math.floor((1 - fee) * 10000))) / - 10000n; + const denominator = ((quoteReserve - outputAmount) * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; inputAmount = numerator / denominator; } // Calculate slippage protection amounts const slippageTolerance = slippagePct / 100; - const slippageMultiplier = BigInt( - Math.floor((1 - slippageTolerance) * 10000), - ); + const slippageMultiplier = BigInt(Math.floor((1 - slippageTolerance) * 10000)); const slippageDenominator = 10000n; - const minAmountOut = - side === 'SELL' - ? (outputAmount * slippageMultiplier) / slippageDenominator - : outputAmount; + const minAmountOut = side === 'SELL' ? (outputAmount * slippageMultiplier) / slippageDenominator : outputAmount; const maxAmountIn = side === 'BUY' - ? (inputAmount * - (slippageDenominator + - BigInt(Math.floor(slippageTolerance * 10000)))) / - slippageDenominator + ? (inputAmount * (slippageDenominator + BigInt(Math.floor(slippageTolerance * 10000)))) / slippageDenominator : inputAmount; // Calculate price impact - const midPrice = - Number(baseReserve) / - 10 ** baseToken.decimals / - (Number(quoteReserve) / 10 ** quoteToken.decimals); + const midPrice = Number(baseReserve) / 10 ** baseToken.decimals / (Number(quoteReserve) / 10 ** quoteToken.decimals); const executionPrice = - Number(inputAmount) / - 10 ** baseToken.decimals / - (Number(outputAmount) / 10 ** quoteToken.decimals); + Number(inputAmount) / 10 ** baseToken.decimals / (Number(outputAmount) / 10 ** quoteToken.decimals); const priceImpact = Math.abs((executionPrice - midPrice) / midPrice); @@ -189,9 +169,7 @@ export async function getSundaeswapAmmQuote( throw new Error(`Quote token not found: ${quoteToken}`); } - logger.info( - `Base token: ${baseTokenObj.symbol}, address=${baseTokenObj.address}, decimals=${baseTokenObj.decimals}`, - ); + logger.info(`Base token: ${baseTokenObj.symbol}, address=${baseTokenObj.address}, decimals=${baseTokenObj.decimals}`); logger.info( `Quote token: ${quoteTokenObj.symbol}, address=${quoteTokenObj.address}, decimals=${quoteTokenObj.decimals}`, ); @@ -230,24 +208,23 @@ async function formatSwapQuote( amount: number, side: 'BUY' | 'SELL', slippagePct: number = 1, -): Promise { +): Promise { logger.info( `formatSwapQuote: poolIdent=${poolIdent}, baseToken=${baseToken}, quoteToken=${quoteToken}, amount=${amount}, side=${side}, slippagePct=${slippagePct}, network=${network}`, ); try { // Use the extracted quote function with slippage percentage - const { quote, sundaeswap, cardano, baseTokenObj, quoteTokenObj } = - await getSundaeswapAmmQuote( - fastify, - network, - poolIdent, - baseToken, - quoteToken, - amount, - side, - slippagePct, - ); + 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}`, @@ -283,16 +260,17 @@ async function formatSwapQuote( : quote.estimatedAmountIn / quote.estimatedAmountOut; return { - estimatedAmountIn: quote.estimatedAmountIn, - estimatedAmountOut: quote.estimatedAmountOut, + // + poolAddress: poolIdent, + tokenIn: quoteTokenObj.symbol, + tokenOut: baseTokenObj.symbol, + amountIn: quote.estimatedAmountIn, + amountOut: quote.estimatedAmountOut, + price: price, minAmountOut: quote.minAmountOut, maxAmountIn: quote.maxAmountIn, - baseTokenBalanceChange, - quoteTokenBalanceChange, - price, - gasPrice: 0, - gasLimit: 0, - gasCost: 0, + slippagePct: quote.slippagePct, + priceImpactPct: quote.priceImpactPct, }; } catch (error) { logger.error(`Error formatting swap quote: ${error.message}`); @@ -308,8 +286,8 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { await fastify.register(require('@fastify/sensible')); fastify.get<{ - Querystring: GetSwapQuoteRequestType; - Reply: GetSwapQuoteResponseType; + Querystring: QuoteSwapRequestType; + Reply: QuoteSwapResponseType; }>( '/quote-swap', { @@ -317,9 +295,9 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { description: 'Get swap quote for Sundaeswap AMM', tags: ['sundaeswap/amm'], querystring: { - ...GetSwapQuoteRequest, + ...QuoteSwapRequest, properties: { - ...GetSwapQuoteRequest.properties, + ...QuoteSwapRequest.properties, network: { type: 'string', default: 'mainnet' }, baseToken: { type: 'string', examples: ['ADA'] }, quoteToken: { type: 'string', examples: ['SUNDAE'] }, @@ -332,7 +310,7 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { response: { 200: { properties: { - ...GetSwapQuoteResponse.properties, + ...QuoteSwapResponse.properties, }, }, }, @@ -358,16 +336,10 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { if (!poolIdent) { // Look up the pool from configuration pools dictionary - poolIdent = await sundaeswap.findDefaultPool( - baseToken, - quoteToken, - 'amm', - ); + poolIdent = await sundaeswap.findDefaultPool(baseToken, quoteToken, 'amm'); if (!poolIdent) { - throw fastify.httpErrors.notFound( - `No AMM pool found for pair ${baseToken}-${quoteToken}`, - ); + throw fastify.httpErrors.notFound(`No AMM pool found for pair ${baseToken}-${quoteToken}`); } } @@ -393,10 +365,7 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { 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') - ) { + 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')) { @@ -404,9 +373,7 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { } // Default to internal server error with the actual error message - throw fastify.httpErrors.internalServerError( - `Error getting swap quote: ${e.message || 'Unknown error'}`, - ); + throw fastify.httpErrors.internalServerError(`Error getting swap quote: ${e.message || 'Unknown error'}`); } }, ); diff --git a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts index 2daf595cda..b8f039d41a 100644 --- a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts @@ -1,3 +1,6 @@ +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'; @@ -9,18 +12,7 @@ import { } from '../../../schemas/amm-schema'; import { logger } from '../../../services/logger'; import { Sundaeswap } from '../sundaeswap'; - import { formatTokenAmount } from '../sundaeswap.utils'; -import { AssetAmount } from '@sundaeswap/asset'; -import { - EDatumType, - IWithdrawConfigArgs, - TSupportedNetworks, -} from '@aiquant/sundaeswap-core'; -import { - DatumBuilderLucidV3, - TxBuilderLucidV3, -} from '@aiquant/sundaeswap-core/lucid'; export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { fastify.post<{ @@ -57,8 +49,6 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const { network, poolAddress: requestedPoolAddress, - baseToken, - quoteToken, percentageToRemove, walletAddress: requestedWalletAddress, } = request.body; @@ -66,14 +56,12 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const networkToUse = network || 'mainnet'; // Validate essential parameters - if (!baseToken || !quoteToken || !percentageToRemove) { + 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', - ); + throw fastify.httpErrors.badRequest('Percentage to remove must be between 0 and 100'); } // Get Sundaeswap and Cardano instances @@ -84,62 +72,52 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { if (!walletAddress) { walletAddress = await sundaeswap.cardano.getFirstWalletAddress(); if (!walletAddress) { - throw fastify.httpErrors.badRequest( - 'No wallet address provided and no default wallet found', - ); + throw fastify.httpErrors.badRequest('No wallet address provided and no default wallet found'); } logger.info(`Using first available wallet address: ${walletAddress}`); } + // Check if poolAddress is provided + if (!requestedPoolAddress) { + throw fastify.httpErrors.badRequest('poolAddress must be provided'); + } + + const poolInfo = await sundaeswap.getAmmPoolInfo(requestedPoolAddress); + + const baseToken = poolInfo.baseTokenAddress; + const quoteToken = poolInfo.quoteTokenAddress; + // Resolve tokens const baseTokenObj = sundaeswap.cardano.getTokenBySymbol(baseToken); const quoteTokenObj = sundaeswap.cardano.getTokenBySymbol(quoteToken); if (!baseTokenObj || !quoteTokenObj) { - throw fastify.httpErrors.badRequest( - `Token not found: ${!baseTokenObj ? baseToken : quoteToken}`, - ); + throw fastify.httpErrors.badRequest(`Token not found: ${!baseTokenObj ? baseToken : quoteToken}`); } // Find pool address if not provided let poolAddress = requestedPoolAddress; if (!poolAddress) { - poolAddress = await sundaeswap.findDefaultPool( - baseToken, - quoteToken, - 'amm', - ); + poolAddress = await sundaeswap.findDefaultPool(baseToken, quoteToken, 'amm'); if (!poolAddress) { - throw fastify.httpErrors.notFound( - `No AMM pool found for pair ${baseToken}-${quoteToken}`, - ); + throw fastify.httpErrors.notFound(`No AMM pool found for pair ${baseToken}-${quoteToken}`); } } const poolData = await sundaeswap.getPoolData(poolAddress); - const wallet = - await sundaeswap.cardano.getWalletFromAddress(walletAddress); + const wallet = await sundaeswap.cardano.getWalletFromAddress(walletAddress); sundaeswap.cardano.lucidInstance.selectWalletFromPrivateKey(wallet); - const utxos = - await sundaeswap.cardano.lucidInstance.utxosAt(walletAddress); + const utxos = await sundaeswap.cardano.lucidInstance.utxosAt(walletAddress); // 8) Calculate withdrawal amounts - const totalLpInWallet = sundaeswap.calculateAssetAmount( - utxos, - poolData.assetLP, - ); + const totalLpInWallet = sundaeswap.calculateAssetAmount(utxos, poolData.assetLP); // Calculate how much LP token will be withdrawn based on the percentage - const withdrawalAmount = BigInt( - (BigInt(totalLpInWallet) * BigInt(percentageToRemove)) / BigInt(100), - ); + const withdrawalAmount = BigInt((BigInt(totalLpInWallet) * BigInt(percentageToRemove)) / BigInt(100)); // Define the LP Token to withdraw - const lpTokenAmount = new AssetAmount( - withdrawalAmount, - poolData.assetLP, - ); // Specify LP token amount + const lpTokenAmount = new AssetAmount(withdrawalAmount, poolData.assetLP); // Specify LP token amount // Build withdraw arguments (Added `pool` property) const withdrawArgs: IWithdrawConfigArgs = { @@ -175,8 +153,7 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const lpTokensToWithdraw = withdrawalAmount; // Amount of LP tokens being withdrawn // Calculate the proportion of the pool being withdrawn - const withdrawalProportion = - Number(lpTokensToWithdraw) / Number(totalLpSupply); + const withdrawalProportion = Number(lpTokensToWithdraw) / Number(totalLpSupply); // Get current pool reserves const baseTokenReserve = poolData.liquidity.aReserve; // Base token reserve in the pool @@ -184,20 +161,21 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { // Calculate the amounts that will be received (proportional to LP tokens withdrawn) const baseTokenAmountRemoved = Math.floor( - (Number(baseTokenReserve) * withdrawalProportion) / - baseTokenObj.decimals, + (Number(baseTokenReserve) * withdrawalProportion) / baseTokenObj.decimals, ); const quoteTokenAmountRemoved = Math.floor( - (Number(quoteTokenReserve) * withdrawalProportion) / - quoteTokenObj.decimals, + (Number(quoteTokenReserve) * withdrawalProportion) / quoteTokenObj.decimals, ); return { signature: txHash, - fee: builtTx.builtTx.fee, - baseTokenAmountRemoved: baseTokenAmountRemoved, - quoteTokenAmountRemoved: quoteTokenAmountRemoved, + status: 1, // 1 = CONFIRMED, 0 = PENDING, -1 = FAILED + data: { + fee: builtTx.builtTx.fee, + baseTokenAmountRemoved, + quoteTokenAmountRemoved, + }, }; } catch (e) { logger.error(e); @@ -205,9 +183,7 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { throw e; } - throw fastify.httpErrors.internalServerError( - 'Failed to remove liquidity', - ); + throw fastify.httpErrors.internalServerError('Failed to remove liquidity'); } }, ); diff --git a/src/connectors/sundaeswap/sundaeswap.config.ts b/src/connectors/sundaeswap/sundaeswap.config.ts index f0e2633499..81f1561290 100644 --- a/src/connectors/sundaeswap/sundaeswap.config.ts +++ b/src/connectors/sundaeswap/sundaeswap.config.ts @@ -9,6 +9,8 @@ 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; @@ -37,9 +39,7 @@ export namespace SundaeswapConfig { export const config: RootConfig = { // Global configuration - allowedSlippage: ConfigManagerV2.getInstance().get( - 'sundaeswap.allowedSlippage', - ), + allowedSlippage: ConfigManagerV2.getInstance().get('sundaeswap.allowedSlippage'), // Network-specific pools networks: ConfigManagerV2.getInstance().get('sundaeswap.networks'), @@ -53,10 +53,7 @@ export namespace SundaeswapConfig { }; // Helper methods to get pools for a specific network - export const getNetworkPools = ( - network: string, - poolType: 'amm', - ): PoolsConfig => { + export const getNetworkPools = (network: string, poolType: 'amm'): PoolsConfig => { return config.networks[network]?.[poolType] || {}; }; } diff --git a/src/connectors/sundaeswap/sundaeswap.ts b/src/connectors/sundaeswap/sundaeswap.ts index 88b1e5fd57..8d4e1b0a7e 100644 --- a/src/connectors/sundaeswap/sundaeswap.ts +++ b/src/connectors/sundaeswap/sundaeswap.ts @@ -7,22 +7,15 @@ Math.pow = function (base, exponent) { return originalMathPow(base, exponent); }; -import { Cardano, CardanoTokenInfo } from '../../chains/cardano/cardano'; import { PrivateKey, UTxO } from '@aiquant/lucid-cardano'; -import { - IPoolDataAsset, - QueryProviderSundaeSwap, - TSupportedNetworks, -} from '@aiquant/sundaeswap-core'; - -import { - percentRegexp, - ConfigManagerV2, -} from '../../services/config-manager-v2'; +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 { PoolInfo } from '../../schemas/amm-schema'; import { isFractionString } from './sundaeswap.utils'; export class Sundaeswap { @@ -65,10 +58,7 @@ export class Sundaeswap { this.owner = await this.cardano.getWalletFromAddress(walletAddress); } - logger.info( - 'Sundaeswap initialized' + - (walletAddress ? ` with wallet: ${walletAddress}` : 'with no wallet'), - ); + logger.info('Sundaeswap initialized' + (walletAddress ? ` with wallet: ${walletAddress}` : 'with no wallet')); } catch (error) { logger.error('Sundaeswap initialization failed:', error); throw error; @@ -95,11 +85,7 @@ export class Sundaeswap { return `${baseToken}-${quoteToken}`; } - async findDefaultPool( - baseToken: string, - quoteToken: string, - routeType: 'amm', - ): Promise { + 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); @@ -113,32 +99,20 @@ export class Sundaeswap { } async getAmmPoolInfo(ident: string): Promise { - const queryProvider = new QueryProviderSundaeSwap( - this.networkName as TSupportedNetworks, - ); + 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 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, + price: raw.liquidity.aReserve > 0n ? Number(aReserveSmallest) / Number(bReserveSmallest) : 0, baseTokenAmount: Number(raw.liquidity.aReserve), // ← explicit cast quoteTokenAmount: Number(raw.liquidity.bReserve), // ← explicit cast - poolType: 'amm', - lpMint: { - address: raw.assetLP.assetId, - decimals: raw.assetLP.decimals, - }, }; return info; @@ -161,9 +135,7 @@ export class Sundaeswap { 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.', - ); + throw new Error('Encountered a malformed percent string in the config for allowed slippage.'); } public calculateAssetAmount(utxos: UTxO[], asset: IPoolDataAsset): bigint { @@ -178,9 +150,7 @@ export class Sundaeswap { } async getPoolData(poolIdent: string) { - const queryProvider = new QueryProviderSundaeSwap( - this.networkName as TSupportedNetworks, - ); + const queryProvider = new QueryProviderSundaeSwap(this.networkName as TSupportedNetworks); // 2) Fetch the raw pool data const raw = await queryProvider.findPoolData({ ident: poolIdent }); 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/pool-service.ts b/src/services/pool-service.ts index ff0087fc99..9c975c9b41 100644 --- a/src/services/pool-service.ts +++ b/src/services/pool-service.ts @@ -281,6 +281,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 index 933bebbb6c..727aae04f6 100644 --- a/src/templates/chains/cardano.yml +++ b/src/templates/chains/cardano.yml @@ -1,20 +1,2 @@ -networks: - mainnet: - tokenListType: "FILE" - tokenListSource: "/home/gateway/conf/lists/cardano_mainnet_tokens.json" - nativeCurrencySymbol: 'ADA' - apiurl: 'https://cardano-mainnet.blockfrost.io/api/v0' - projectId: 'your_api_key' - preprod: - tokenListType: "FILE" - tokenListSource: "/home/gateway/conf/lists/cardano_preprod_tokens.json" - nativeCurrencySymbol: 'ADA' - apiurl: 'https://cardano-preprod.blockfrost.io/api/v0' - projectId: 'your_api_key' - preview: - tokenListType: "FILE" - tokenListSource: "/home/gateway/conf/lists/cardano_preview_tokens.json" - nativeCurrencySymbol: 'ADA' - apiurl: 'https://cardano-preview.blockfrost.io/api/v0' - projectId: 'your_api_key' - +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/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/cardano_mainnet_tokens.json b/src/templates/namespace/cardano_mainnet_tokens.json deleted file mode 100644 index 01457bbabf..0000000000 --- a/src/templates/namespace/cardano_mainnet_tokens.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "Cardano Tokenlist", - "logoURI": "https://ibb.co/N1Jmswk", - "keywords": ["cardano", "tokens", "MIN"], - "timestamp": "2024-12-12T12:00:00+00:00", - "tokens": [ - { - "policyId": "29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6", - "assetName": "4d494e", - "decimals": 6, - "name": "Minswap Token", - "symbol": "MIN", - "logoURI": "https://ibb.co/L1Tp0rQ", - "address": "29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6.4d494e" - }, - { - "policyId": "9a9693a9a37912a5097918f97918d15240c92ab729a0b7c4aa144d77", - "assetName": "53554e444145", - "decimals": 6, - "name": "SUNDAE Token", - "symbol": "SUNDAE", - "logoURI": "https://ibb.co/Q31Nv1TK", - "address": "9a9693a9a37912a5097918f97918d15240c92ab729a0b7c4aa144d77.53554e444145" - }, - { - "policyId": "", - "assetName": "", - "decimals": 6, - "name": "Cardano Native Token", - "symbol": "ADA", - "logoURI": "https://ibb.co/N1Jmswk", - "address": "ada.lovelace" - }, - { - "policyId": "e0302560ced2fdcbfcb2602697df970cd0d6a38f94b32703f51c312b", - "assetName": "0014df102f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773", - "decimals": 0, - "name": "SundaeSwap LP Token", - "symbol": "LP-SUNDAE", - "logoURI": "", - "address": "e0302560ced2fdcbfcb2602697df970cd0d6a38f94b32703f51c312b.0014df102f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773" - }, - { - "policyId": "f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c", - "assetName": "82e2b1fd27a7712a1a9cf750dfbea1a5778611b20e06dd6a611df7a643f8cb75", - "decimals": 0, - "name": "Minswap LP Token", - "symbol": "LP-MIN", - "logoURI": "", - "address": "addr1z84q0denmyep98ph3tmzwsmw0j7zau9ljmsqx6a4rvaau66j2c79gy9l76sdg0xwhd7r0c0kna0tycz4y5s6mlenh8pq777e2a.0014df102f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773" - } - ] -} diff --git a/src/templates/namespace/cardano_preprod_tokens.json b/src/templates/namespace/cardano_preprod_tokens.json deleted file mode 100644 index 1964df10e0..0000000000 --- a/src/templates/namespace/cardano_preprod_tokens.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Cardano Tokenlist", - "logoURI": "https://ibb.co/N1Jmswk", - "keywords": ["cardano", "tokens", "MIN"], - "timestamp": "2024-12-12T12:00:00+00:00", - "tokens": [ - { - "policyId": "e16c2dc8ae937e8d3790c7fd7168d7b994621ba14ca11415f39fed72", - "assetName": "4d494e", - "decimals": 0, - "name": "Minswap Token", - "symbol": "MIN", - "logoURI": "https://ibb.co/L1Tp0rQ", - "address": "e16c2dc8ae937e8d3790c7fd7168d7b994621ba14ca11415f39fed72.4d494e" - }, - { - "policyId": "", - "assetName": "", - "decimals": 6, - "name": "Cardano Native Token", - "symbol": "ADA", - "logoURI": "https://ibb.co/N1Jmswk", - "address": "ada.lovelace" - }, - { - "policyId": "e4214b7cce62ac6fbba385d164df48e157eae5863521b4b67ca71d86", - "assetName": "3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d", - "decimals": 0, - "name": "Minswap Liquidity pool token", - "symbol": "LP", - "logoURI": "https://ibb.co/L1Tp0rQ", - "address": "e4214b7cce62ac6fbba385d164df48e157eae5863521b4b67ca71d86.3bb0079303c57812462dec9de8fb867cef8fd3768de7f12c77f6f0dd80381d0d" - }, - { - "policyId": "d4fece6b39f7cd78a3f036b2ae6508c13524b863922da80f68dd9ab7", - "assetName": "5553444d", - "decimals": 6, - "name": "USDM", - "symbol": "USDM", - "logoURI": "", - "address": "d4fece6b39f7cd78a3f036b2ae6508c13524b863922da80f68dd9ab7.5553444d" - } - ] -} diff --git a/src/templates/namespace/cardano_preview_tokens.json b/src/templates/namespace/cardano_preview_tokens.json deleted file mode 100644 index 647f83f783..0000000000 --- a/src/templates/namespace/cardano_preview_tokens.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "Cardano Tokenlist", - "logoURI": "https://ibb.co/N1Jmswk", - "keywords": ["cardano", "tokens", "SUNDAE"], - "timestamp": "2024-12-12T12:00:00+00:00", - "tokens": [ - { - "policyId": "99b071ce8580d6a3a11b4902145adb8bfd0d2a03935af8cf66403e15", - "assetName": "534245525259", - "decimals": 0, - "name": "SBERRY Token", - "symbol": "SBERRY", - "logoURI": "https://ibb.co/hJbVKRJW", - "address": "99b071ce8580d6a3a11b4902145adb8bfd0d2a03935af8cf66403e15.534245525259" - }, - { - "policyId": "", - "assetName": "", - "decimals": 6, - "name": "Cardano Native Token", - "symbol": "ADA", - "logoURI": "https://ibb.co/N1Jmswk", - "address": "ada.lovelace" - }, - { - "policyId": "44a1eb2d9f58add4eb1932bd0048e6a1947e85e3fe4f32956a110414", - "assetName": "0014df102baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3", - "decimals": 0, - "name": "Sundaeswap Liquidity pool token", - "symbol": "LP", - "logoURI": "hhttps://ibb.co/JWr1GWs3", - "address": "44a1eb2d9f58add4eb1932bd0048e6a1947e85e3fe4f32956a110414.0014df102baab4c73a1cd60176f903a29a9c92ed4237c88622da51e9179121a3" - } - ] -} diff --git a/test/services/data/config-manager-v2/test1/namespace/minswap-schema.json b/src/templates/namespace/minswap-schema.json similarity index 100% rename from test/services/data/config-manager-v2/test1/namespace/minswap-schema.json rename to src/templates/namespace/minswap-schema.json diff --git a/test/services/data/config-manager-v2/test1/namespace/sundaeswap-schema.json b/src/templates/namespace/sundaeswap-schema.json similarity index 100% rename from test/services/data/config-manager-v2/test1/namespace/sundaeswap-schema.json rename to src/templates/namespace/sundaeswap-schema.json 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 869338a82e..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,9 +65,6 @@ configurations: configurationPath: connectors/uniswap.yml schemaPath: uniswap-schema.json - $namespace solana: - configurationPath: solana.yml - schemaPath: solana-schema.json $namespace jupiter: configurationPath: connectors/jupiter.yml @@ -97,9 +95,22 @@ configurations: configurationPath: rpc/infura.yml schemaPath: infura-schema.json + # Cardano networks $namespace cardano: configurationPath: chains/cardano.yml - schemaPath: cardano-schema.json + 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 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/utils.ts b/src/wallet/utils.ts index b81063c275..451bf1e51b 100644 --- a/src/wallet/utils.ts +++ b/src/wallet/utils.ts @@ -1,10 +1,10 @@ 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'; -import { Cardano } from '../chains/cardano/cardano'; import { ConfigManagerCertPassphrase } from '../services/config-manager-cert-passphrase'; import { getInitializedChain, @@ -146,9 +146,9 @@ export async function addWallet(fastify: FastifyInstance, req: AddWalletRequest) await fse.writeFile(`${path}/${safeAddress}.json`, encryptedPrivateKey); // Update default wallet if requested - if (req.setDefault) { - updateDefaultWallet(fastify, req.chain, address); - } + // if (req.setDefault) { + // updateDefaultWallet(fastify, req.chain, address); + // } return { address }; } diff --git a/test/services/data/config-manager-v2/test1/namespace/cardano-schema.json b/test/services/data/config-manager-v2/test1/namespace/cardano-schema.json deleted file mode 100644 index 5567f077e4..0000000000 --- a/test/services/data/config-manager-v2/test1/namespace/cardano-schema.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "networks": { - "type": "object", - "patternProperties": { - "^\\w+$": { - "type": "object", - "properties": { - "tokenListType": { "type": "string" }, - "tokenListSource": { "type": "string" }, - "nativeCurrencySymbol": { "type": "string" }, - "apiurl": { "type": "string" }, - "projectId": { "type": "string" } - }, - "required": [ - "tokenListType", - "tokenListSource", - "nativeCurrencySymbol", - "apiurl", - "projectId" - ], - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false -} From cf8a9ae1647c02e6ced130464e7196715226738b Mon Sep 17 00:00:00 2001 From: Aiquant1 Date: Wed, 24 Sep 2025 16:55:38 +0530 Subject: [PATCH 10/12] refactor: implement lazy initialization for Cardano balance routes - Move Cardano.getInstance() from route registration to request handlers - Replace dynamic wallet address examples with static placeholders - Prevent server startup crashes caused by premature blockchain connection - Align Cardano initialization pattern with other chain implementations fixed wallet, chains, pools route for cardano --- src/app.ts | 22 +++-- src/chains/cardano/cardano.config.ts | 39 +++------ src/chains/cardano/cardano.routes.ts | 12 +-- src/chains/cardano/cardano.ts | 80 +++++++++---------- src/chains/cardano/routes/balances.ts | 74 +++-------------- src/chains/cardano/routes/poll.ts | 6 +- src/chains/cardano/routes/status.ts | 2 +- src/chains/cardano/routes/tokens.ts | 9 +-- src/config/routes/updateConfig.ts | 11 +-- .../minswap/amm-routes/addLiquidity.ts | 2 +- .../minswap/amm-routes/executeSwap.ts | 2 +- src/connectors/minswap/amm-routes/poolInfo.ts | 2 +- .../minswap/amm-routes/quoteLiquidity.ts | 2 +- .../minswap/amm-routes/quoteSwap.ts | 4 +- .../minswap/amm-routes/removeLiquidity.ts | 2 +- src/connectors/minswap/minswap.routes.ts | 9 ++- .../sundaeswap/amm-routes/addLiquidity.ts | 2 +- .../sundaeswap/amm-routes/executeSwap.ts | 2 +- .../sundaeswap/amm-routes/poolInfo.ts | 2 +- .../sundaeswap/amm-routes/quoteLiquidity.ts | 2 +- .../sundaeswap/amm-routes/quoteSwap.ts | 2 +- .../sundaeswap/amm-routes/removeLiquidity.ts | 3 +- .../sundaeswap/sundaeswap.routes.ts | 9 ++- src/pools/routes/getPool.ts | 12 +-- src/pools/routes/removePool.ts | 9 ++- src/services/connection-manager.ts | 3 +- src/services/pool-service.ts | 3 + src/wallet/routes/removeWallet.ts | 4 + src/wallet/routes/setDefault.ts | 4 + src/wallet/schemas.ts | 9 ++- src/wallet/utils.ts | 7 +- 31 files changed, 134 insertions(+), 217 deletions(-) diff --git a/src/app.ts b/src/app.ts index 6b62be09f2..9fac9ed4e8 100644 --- a/src/app.ts +++ b/src/app.ts @@ -13,18 +13,18 @@ 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 { cardanoRoutes } from './chains/cardano/cardano.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 { uniswapRoutes } from './connectors/uniswap/uniswap.routes'; -import { minswapRoutes } from './connectors/minswap/minswap.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'; import { ConfigManagerV2 } from './services/config-manager-v2'; @@ -66,12 +66,6 @@ const swaggerOptions = { { name: '/pools', description: 'Pool management endpoints' }, // Chains - { name: 'solana', description: 'Solana chain endpoints' }, - { name: 'ethereum', description: 'Ethereum chain endpoints' }, - { name: 'cardano', description: 'Cardano chain endpoints' }, - - // Connectors - { name: 'jupiter', description: 'Jupiter DEX aggregator (Solana)' }, { name: '/chain/solana', description: 'Solana and SVM-based chain endpoints', @@ -80,6 +74,10 @@ const swaggerOptions = { name: '/chain/ethereum', description: 'Ethereum and EVM-based chain endpoints', }, + { + name: '/chain/cardano', + description: 'Cardano chain endpoints', + }, // Connectors { @@ -100,11 +98,11 @@ const swaggerOptions = { }, { name: '/connector/0x', description: '0x connector endpoints' }, { - name: 'minswap/amm', + name: '/connector/minswap/amm', description: 'Minswap pool connector (Cardano)', }, { - name: 'sundaeswap/amm', + name: '/connector/sundaeswap/amm', description: 'Sundaeswap pool connector (Cardano)', }, ], @@ -233,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 @@ -272,7 +271,6 @@ const configureGatewayServer = () => { }); app.register(pancakeswapRoutes.amm, { prefix: '/connectors/pancakeswap/amm' }); app.register(pancakeswapRoutes.clmm, { prefix: '/connectors/pancakeswap/clmm' }); - app.register(cardanoRoutes, { prefix: '/chains/cardano' }); }; // Register routes on main server diff --git a/src/chains/cardano/cardano.config.ts b/src/chains/cardano/cardano.config.ts index c1499a90a2..816c6fe68b 100644 --- a/src/chains/cardano/cardano.config.ts +++ b/src/chains/cardano/cardano.config.ts @@ -1,40 +1,19 @@ import { ConfigManagerV2 } from '../../services/config-manager-v2'; -interface NetworkConfig { - name: string; - tokenListType: string; - tokenListSource: string; + +export interface Config { + chainID: number; nativeCurrencySymbol: string; apiurl: string; projectId: string; } -export interface Config { - network: NetworkConfig; -} - -export function getCardanoConfig( - chainName: string, - networkName: string, -): Config { +export function getCardanoConfig(networkName: string): Config { + const namespaceId = `cardano-${networkName}`; return { - network: { - name: networkName, - tokenListType: ConfigManagerV2.getInstance().get( - chainName + '.networks.' + networkName + '.tokenListType', - ), - tokenListSource: ConfigManagerV2.getInstance().get( - chainName + '.networks.' + networkName + '.tokenListSource', - ), - nativeCurrencySymbol: ConfigManagerV2.getInstance().get( - chainName + '.networks.' + networkName + '.nativeCurrencySymbol', - ), - apiurl: ConfigManagerV2.getInstance().get( - chainName + '.networks.' + networkName + '.apiurl', - ), - projectId: ConfigManagerV2.getInstance().get( - chainName + '.networks.' + networkName + '.projectId', - ), - }, + 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 index 4e683d6d2a..d7200ddf26 100644 --- a/src/chains/cardano/cardano.routes.ts +++ b/src/chains/cardano/cardano.routes.ts @@ -1,17 +1,9 @@ import { FastifyPluginAsync } from 'fastify'; -import { statusRoute } from './routes/status'; -import { tokensRoute } from './routes/tokens'; import { balancesRoute } from './routes/balances'; import { pollRoute } from './routes/poll'; - -// Register the type declaration needed for Fastify schema tags -declare module 'fastify' { - interface FastifySchema { - tags?: readonly string[]; - description?: string; - } -} +import { statusRoute } from './routes/status'; +import { tokensRoute } from './routes/tokens'; export const cardanoRoutes: FastifyPluginAsync = async (fastify) => { // Register all the route handlers diff --git a/src/chains/cardano/cardano.ts b/src/chains/cardano/cardano.ts index 410f812fa3..f9e4d53bdc 100644 --- a/src/chains/cardano/cardano.ts +++ b/src/chains/cardano/cardano.ts @@ -1,6 +1,6 @@ import crypto from 'crypto'; -import { Lucid, Blockfrost, UTxO } from '@aiquant/lucid-cardano'; +import { Lucid, Blockfrost, UTxO, Network } from '@aiquant/lucid-cardano'; import fse from 'fs-extra'; import { TokenService } from '#src/services/token-service'; @@ -25,7 +25,6 @@ export class Cardano { public tokenList: CardanoToken[] = []; public config: Config; public tokenMap: Record = {}; - private _tokenListSource: string; public lucidInstance: Lucid | null = null; public network: string; private _chain: string; @@ -35,43 +34,54 @@ export class Cardano { public projectId: string; private constructor(network: string) { - // Throw error if network is not 'mainnet' or 'preprod' - if (network !== 'mainnet' && network !== 'preprod' && network !== 'preview') { - throw new HttpException(503, NETWORK_ERROR_MESSAGE, NETWORK_ERROR_CODE); - } - this.config = getCardanoConfig('cardano', network); + this.config = getCardanoConfig(network); this._chain = 'cardano'; // Determine the appropriate Blockfrost Project ID and API URL - this.apiURL = this.config.network.apiurl; - this.network = this.config.network.name; - this.nativeTokenSymbol = this.config.network.nativeCurrencySymbol; - this._tokenListSource = this.config.network.tokenListSource; - this.projectId = this.config.network.projectId; + 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 { - if (Cardano._instances === undefined) { + // 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); - - if (instance.projectId && instance.projectId.toLowerCase().startsWith(network.toLowerCase())) { - try { - await instance.init(); - } catch (err: any) { - logger.warn(`[Cardano] initial init() skipped for network="${network}": ${err.message}`); - } - } else { - logger.info(`[Cardano] skipped init() for network="${network}" because projectId is still placeholder`); - } - + 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; } @@ -84,24 +94,6 @@ export class Cardano { return this._ready; } - public async init(): Promise { - if (!this.lucidInstance) { - this.lucidInstance = await Lucid.new( - new Blockfrost(this.apiURL, this.projectId), - this.network === 'preprod' ? 'Preprod' : this.network === 'preview' ? 'Preview' : 'Mainnet', - ); - } - - try { - await this.loadTokens(); - this._ready = true; - logger.info(`Cardano chain initialized for network=${this.network}`); - } catch (e) { - logger.error(`Failed to initialize Cardano chain: ${e}`); - throw e; - } - } - private getLucid(): Lucid { if (!this.lucidInstance) { // Use instance-specific Lucid diff --git a/src/chains/cardano/routes/balances.ts b/src/chains/cardano/routes/balances.ts index c9ca653851..6be7e280f4 100644 --- a/src/chains/cardano/routes/balances.ts +++ b/src/chains/cardano/routes/balances.ts @@ -18,7 +18,7 @@ export async function getCardanoBalances( ): Promise { try { const cardano = await Cardano.getInstance(network); - await cardano.init(); + // await cardano.init(); let wallet: string; const balances: Record = {}; @@ -33,23 +33,17 @@ export async function getCardanoBalances( 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}`, - ); + 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), - ); + 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`, - ); + 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 @@ -62,24 +56,18 @@ export async function getCardanoBalances( const startTime = Date.now(); let timeExceeded = false; - logger.info( - `Processing ${totalTokens} tokens in batches of ${batchSize} with ${maxScanTimeMs}ms time limit`, - ); + 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.`, - ); + 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)}`, - ); + logger.debug(`Processing batch ${Math.floor(i / batchSize) + 1}/${Math.ceil(totalTokens / batchSize)}`); // Process batch in parallel with timeout await Promise.all( @@ -92,15 +80,11 @@ export async function getCardanoBalances( // Only add tokens with non-zero balances if (balanceNum > 0) { balances[token.symbol] = balanceNum; - logger.debug( - `Found non-zero balance for ${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}`, - ); + logger.warn(`Error getting balance for ${token.symbol}: ${err.message}`); } }), ); @@ -125,9 +109,7 @@ export async function getCardanoBalances( } if (!Object.keys(balances).length) { - throw fastify.httpErrors.badRequest( - 'No token balances found for the given wallet', - ); + throw fastify.httpErrors.badRequest('No token balances found for the given wallet'); } return { balances }; @@ -136,41 +118,11 @@ export async function getCardanoBalances( 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}`, - ); + throw fastify.httpErrors.internalServerError(`Failed to get balances: ${error.message}`); } } export const balancesRoute: FastifyPluginAsync = async (fastify) => { - // Get first wallet address for example - const cardano = await Cardano.getInstance('preprod'); - - // Default Cardano address for examples if no wallet is available - let firstWalletAddress = ''; - - try { - // Try to get user's first Cardano wallet if available - // getFirstWalletAddress specifically looks in the /cardano directory - const userWallet = await cardano.getFirstWalletAddress(); - if (userWallet) { - // Make sure it's a valid Cardano address - const isValidCardanoAddress = /^(addr|addr_test)[0-9a-zA-Z]{1,}$/i.test( - userWallet, - ); - if (isValidCardanoAddress) { - firstWalletAddress = userWallet; - logger.info( - `Using user's Cardano wallet for examples: ${firstWalletAddress}`, - ); - } - } - } catch (error) { - logger.warn('No Cardano wallets found for examples in schema'); - } - - BalanceRequestSchema.properties.address.examples = [firstWalletAddress]; - fastify.post<{ Body: BalanceRequestType; Reply: BalanceResponseType; @@ -180,7 +132,7 @@ export const balancesRoute: FastifyPluginAsync = async (fastify) => { 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: ['cardano'], + tags: ['/chain/cardano'], body: { ...BalanceRequestSchema, properties: { @@ -189,7 +141,7 @@ export const balancesRoute: FastifyPluginAsync = async (fastify) => { type: 'string', examples: ['mainnet', 'preprod', 'preview'], }, - address: { type: 'string', examples: [firstWalletAddress] }, + address: { type: 'string', examples: ['address'] }, tokens: { type: 'array', items: { type: 'string' }, diff --git a/src/chains/cardano/routes/poll.ts b/src/chains/cardano/routes/poll.ts index 2ecb0d5907..88b93e7848 100644 --- a/src/chains/cardano/routes/poll.ts +++ b/src/chains/cardano/routes/poll.ts @@ -76,7 +76,7 @@ export const pollRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Poll for the status of a Cardano transaction', - tags: ['cardano'], + tags: ['/chain/cardano'], body: { ...PollRequestSchema, properties: { @@ -87,9 +87,7 @@ export const pollRoute: FastifyPluginAsync = async (fastify) => { }, signature: { type: 'string', - examples: [ - '66f5f15d15124a77418cfa3ec0e72cc1d2295647e528a9ecb4636f9ed5342d06', - ], + examples: ['66f5f15d15124a77418cfa3ec0e72cc1d2295647e528a9ecb4636f9ed5342d06'], }, }, }, diff --git a/src/chains/cardano/routes/status.ts b/src/chains/cardano/routes/status.ts index 86e22adb90..add4e3a38f 100644 --- a/src/chains/cardano/routes/status.ts +++ b/src/chains/cardano/routes/status.ts @@ -56,7 +56,7 @@ export const statusRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Get Cardano chain status', - tags: ['cardano'], + tags: ['/chain/cardano'], querystring: { ...StatusRequestSchema, properties: { diff --git a/src/chains/cardano/routes/tokens.ts b/src/chains/cardano/routes/tokens.ts index eae5372bee..57cd35799d 100644 --- a/src/chains/cardano/routes/tokens.ts +++ b/src/chains/cardano/routes/tokens.ts @@ -36,9 +36,7 @@ export async function getCardanoTokens( return { tokens }; } catch (error) { logger.error(`Error getting tokens: ${error.message}`); - throw fastify.httpErrors.internalServerError( - `Failed to get tokens: ${error.message}`, - ); + throw fastify.httpErrors.internalServerError(`Failed to get tokens: ${error.message}`); } } @@ -50,9 +48,8 @@ export const tokensRoute: FastifyPluginAsync = async (fastify) => { '/tokens', { schema: { - description: - 'Get list of supported Cardano tokens with their addresses and decimals', - tags: ['cardano'], + description: 'Get list of supported Cardano tokens with their addresses and decimals', + tags: ['/chain/cardano'], querystring: { ...TokensRequestSchema, properties: { diff --git a/src/config/routes/updateConfig.ts b/src/config/routes/updateConfig.ts index 70c5b44f24..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 { @@ -85,15 +87,6 @@ export const updateConfigRoute: FastifyPluginAsync = async (fastify) => { // Build descriptive message const description = `'${namespace}.${path}'`; - // // If they updated the projectId for one of the Cardano networks: - // if (fullPath.startsWith('cardano.') && fullPath.endsWith('.projectId')) { - // const network = fullPath.split('.')[2]; - // console.log('network', network); - // const cardano = await Cardano.getInstance(network); - // cardano.projectId = String(processedValue); // assign the new key as string - // await cardano.init(); // re‐init Lucid on the fly - // } - return { message: `Configuration updated successfully: ${description} set to ${JSON.stringify(processedValue)}`, }; diff --git a/src/connectors/minswap/amm-routes/addLiquidity.ts b/src/connectors/minswap/amm-routes/addLiquidity.ts index 97ad382b0b..4991a846e6 100644 --- a/src/connectors/minswap/amm-routes/addLiquidity.ts +++ b/src/connectors/minswap/amm-routes/addLiquidity.ts @@ -111,7 +111,7 @@ export const addLiquidityRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Add liquidity to a Minswap pool', - tags: ['minswap/amm'], + tags: ['/connector/minswap/amm'], body: { ...AddLiquidityRequest, properties: { diff --git a/src/connectors/minswap/amm-routes/executeSwap.ts b/src/connectors/minswap/amm-routes/executeSwap.ts index a68f7de77b..56d151527c 100644 --- a/src/connectors/minswap/amm-routes/executeSwap.ts +++ b/src/connectors/minswap/amm-routes/executeSwap.ts @@ -23,7 +23,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Execute a swap on Minswap AMM (Cardano)', - tags: ['minswap/amm'], + tags: ['/connector/minswap/amm'], body: { ...ExecuteSwapRequest, properties: { diff --git a/src/connectors/minswap/amm-routes/poolInfo.ts b/src/connectors/minswap/amm-routes/poolInfo.ts index d8eabdd8a8..ed196b28a3 100644 --- a/src/connectors/minswap/amm-routes/poolInfo.ts +++ b/src/connectors/minswap/amm-routes/poolInfo.ts @@ -13,7 +13,7 @@ export const ammPoolInfoRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Get AMM pool information from Minswap', - tags: ['minswap/amm'], + tags: ['/connector/minswap/amm'], querystring: { ...GetPoolInfoRequest, properties: { diff --git a/src/connectors/minswap/amm-routes/quoteLiquidity.ts b/src/connectors/minswap/amm-routes/quoteLiquidity.ts index 3b53c4ef11..4a5a8032f8 100644 --- a/src/connectors/minswap/amm-routes/quoteLiquidity.ts +++ b/src/connectors/minswap/amm-routes/quoteLiquidity.ts @@ -148,7 +148,7 @@ export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Get liquidity quote for Minswap', - tags: ['minswap/amm'], + tags: ['/connector/minswap/amm'], querystring: { ...QuoteLiquidityRequest, properties: { diff --git a/src/connectors/minswap/amm-routes/quoteSwap.ts b/src/connectors/minswap/amm-routes/quoteSwap.ts index 4ea50a6593..fc64fe914e 100644 --- a/src/connectors/minswap/amm-routes/quoteSwap.ts +++ b/src/connectors/minswap/amm-routes/quoteSwap.ts @@ -150,7 +150,7 @@ export async function getMinswapAmmQuote( if (!cardano.ready()) { logger.info('Cardano instance not ready, initializing...'); - await cardano.init(); + // await cardano.init(); } // Resolve tokens @@ -291,7 +291,7 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Get swap quote for Minswap AMM', - tags: ['minswap/amm'], + tags: ['/connector/minswap/amm'], querystring: { ...QuoteSwapRequest, properties: { diff --git a/src/connectors/minswap/amm-routes/removeLiquidity.ts b/src/connectors/minswap/amm-routes/removeLiquidity.ts index 6e64f98a60..e08b051f4b 100644 --- a/src/connectors/minswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/minswap/amm-routes/removeLiquidity.ts @@ -20,7 +20,7 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Remove liquidity from a Minswap pool', - tags: ['minswap/amm'], + tags: ['/connector/minswap/amm'], body: { ...RemoveLiquidityRequest, properties: { diff --git a/src/connectors/minswap/minswap.routes.ts b/src/connectors/minswap/minswap.routes.ts index 2358eb4e09..2eb90099bf 100644 --- a/src/connectors/minswap/minswap.routes.ts +++ b/src/connectors/minswap/minswap.routes.ts @@ -1,10 +1,11 @@ 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 { quoteSwapRoute as ammQuoteSwapRoute } from './amm-routes/quoteSwap'; import quoteLiquidityRoute from './amm-routes/quoteLiquidity'; -import { executeSwapRoute as ammExecuteSwapRoute } from './amm-routes/executeSwap'; -import { addLiquidityRoute as ammAddLiquidityRoute } from './amm-routes/addLiquidity'; +import { quoteSwapRoute as ammQuoteSwapRoute } from './amm-routes/quoteSwap'; import { removeLiquidityRoute as ammRemoveLiquidityRoute } from './amm-routes/removeLiquidity'; // AMM routes including swap endpoints @@ -14,7 +15,7 @@ const minswapAmmRoutes: FastifyPluginAsync = async (fastify) => { await fastify.register(async (instance) => { instance.addHook('onRoute', (routeOptions) => { if (routeOptions.schema && routeOptions.schema.tags) { - routeOptions.schema.tags = ['minswap/amm']; + routeOptions.schema.tags = ['/connector/minswap/amm']; } }); diff --git a/src/connectors/sundaeswap/amm-routes/addLiquidity.ts b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts index 327e23997e..2d6b13a195 100644 --- a/src/connectors/sundaeswap/amm-routes/addLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts @@ -99,7 +99,7 @@ export const addLiquidityRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Add liquidity to a Sundaeswap pool', - tags: ['sundaeswap/amm'], + tags: ['/connector/sundaeswap/amm'], body: { ...AddLiquidityRequest, properties: { diff --git a/src/connectors/sundaeswap/amm-routes/executeSwap.ts b/src/connectors/sundaeswap/amm-routes/executeSwap.ts index 179317da87..05209a5342 100644 --- a/src/connectors/sundaeswap/amm-routes/executeSwap.ts +++ b/src/connectors/sundaeswap/amm-routes/executeSwap.ts @@ -26,7 +26,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Execute a swap on Sundaeswap AMM (Cardano)', - tags: ['sundaeswap/amm'], + tags: ['/connector/sundaeswap/amm'], body: { ...ExecuteSwapRequest, properties: { diff --git a/src/connectors/sundaeswap/amm-routes/poolInfo.ts b/src/connectors/sundaeswap/amm-routes/poolInfo.ts index abdd8a11d4..a3db74ff0d 100644 --- a/src/connectors/sundaeswap/amm-routes/poolInfo.ts +++ b/src/connectors/sundaeswap/amm-routes/poolInfo.ts @@ -13,7 +13,7 @@ export const ammPoolInfoRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Get AMM pool information from Sundaeswap', - tags: ['sundaeswap/amm'], + tags: ['/connector/sundaeswap/amm'], querystring: { ...GetPoolInfoRequest, properties: { diff --git a/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts b/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts index 6edb0fe710..5f393091be 100644 --- a/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts @@ -147,7 +147,7 @@ export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Get liquidity quote for Sundaeswap', - tags: ['sundaeswap/amm'], + tags: ['/connector/sundaeswap/amm'], querystring: { ...QuoteLiquidityRequest, properties: { diff --git a/src/connectors/sundaeswap/amm-routes/quoteSwap.ts b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts index 90cc88d771..1e5edf020d 100644 --- a/src/connectors/sundaeswap/amm-routes/quoteSwap.ts +++ b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts @@ -293,7 +293,7 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Get swap quote for Sundaeswap AMM', - tags: ['sundaeswap/amm'], + tags: ['/connector/sundaeswap/amm'], querystring: { ...QuoteSwapRequest, properties: { diff --git a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts index b8f039d41a..ae1dedd710 100644 --- a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts @@ -12,7 +12,6 @@ import { } from '../../../schemas/amm-schema'; import { logger } from '../../../services/logger'; import { Sundaeswap } from '../sundaeswap'; -import { formatTokenAmount } from '../sundaeswap.utils'; export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { fastify.post<{ @@ -23,7 +22,7 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { { schema: { description: 'Remove liquidity from a Sundaeswap pool', - tags: ['sundaeswap/amm'], + tags: ['/connector/sundaeswap/amm'], body: { ...RemoveLiquidityRequest, properties: { diff --git a/src/connectors/sundaeswap/sundaeswap.routes.ts b/src/connectors/sundaeswap/sundaeswap.routes.ts index e143533b5f..22bf0e5be0 100644 --- a/src/connectors/sundaeswap/sundaeswap.routes.ts +++ b/src/connectors/sundaeswap/sundaeswap.routes.ts @@ -1,10 +1,11 @@ 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 { quoteSwapRoute as ammQuoteSwapRoute } from './amm-routes/quoteSwap'; import quoteLiquidityRoute from './amm-routes/quoteLiquidity'; -import { executeSwapRoute as ammExecuteSwapRoute } from './amm-routes/executeSwap'; -import { addLiquidityRoute as ammAddLiquidityRoute } from './amm-routes/addLiquidity'; +import { quoteSwapRoute as ammQuoteSwapRoute } from './amm-routes/quoteSwap'; import { removeLiquidityRoute as ammRemoveLiquidityRoute } from './amm-routes/removeLiquidity'; // AMM routes including swap endpoints @@ -14,7 +15,7 @@ const sundaeswapAmmRoutes: FastifyPluginAsync = async (fastify) => { await fastify.register(async (instance) => { instance.addHook('onRoute', (routeOptions) => { if (routeOptions.schema && routeOptions.schema.tags) { - routeOptions.schema.tags = ['sundaeswap/amm']; + routeOptions.schema.tags = ['/connector/sundaeswap/amm']; } }); 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/services/connection-manager.ts b/src/services/connection-manager.ts index 3a4f714862..1afc7281dc 100644 --- a/src/services/connection-manager.ts +++ b/src/services/connection-manager.ts @@ -1,6 +1,6 @@ +import { Cardano } from '../chains/cardano/cardano'; import { Ethereum } from '../chains/ethereum/ethereum'; import { Solana } from '../chains/solana/solana'; -import { Cardano } from '../chains/cardano/cardano'; export interface Chain { // TODO: Add shared chain properties (e.g., network, chainId, etc.) @@ -45,6 +45,7 @@ export async function getChainInstance(chain: string, network: string): Promise< } 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 9c975c9b41..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; 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 50763871a2..5ac072b7f7 100644 --- a/src/wallet/schemas.ts +++ b/src/wallet/schemas.ts @@ -9,6 +9,7 @@ export const AddWalletRequestSchema = Type.Object({ chain: Type.String(), privateKey: Type.String(), network: Type.Optional(Type.String()), + setDefault: Type.Optional(Type.Boolean()), }); export const AddWalletResponseSchema = Type.Object({ @@ -39,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', @@ -126,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 451bf1e51b..b880fb5d94 100644 --- a/src/wallet/utils.ts +++ b/src/wallet/utils.ts @@ -96,6 +96,7 @@ export async function addWallet(fastify: FastifyInstance, req: AddWalletRequest) try { 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); @@ -146,9 +147,9 @@ export async function addWallet(fastify: FastifyInstance, req: AddWalletRequest) await fse.writeFile(`${path}/${safeAddress}.json`, encryptedPrivateKey); // Update default wallet if requested - // if (req.setDefault) { - // updateDefaultWallet(fastify, req.chain, address); - // } + if (req.setDefault) { + updateDefaultWallet(fastify, req.chain, address); + } return { address }; } From 47cc49e542dbde38a173cf0d52bdeeb0c2b7b74b Mon Sep 17 00:00:00 2001 From: Aiquant1 Date: Thu, 25 Sep 2025 12:58:56 +0530 Subject: [PATCH 11/12] feat(cardano): add full AMM DEX support for Minswap and SundaeSwap - Implement liquidity operations (add/remove/quote) for both DEXs - Add pool info and swap quote endpoints - Fix token address normalization for Cardano native assets - Support multiple token address formats (dot notation and concatenated) - Add Cardano wallet integration and validation utilities --- src/chains/cardano/cardano.ts | 9 ++ .../minswap/amm-routes/addLiquidity.ts | 20 +++- .../minswap/amm-routes/quoteLiquidity.ts | 43 ++++---- .../minswap/amm-routes/removeLiquidity.ts | 34 +++---- src/connectors/minswap/minswap.ts | 4 +- .../sundaeswap/amm-routes/addLiquidity.ts | 14 ++- .../sundaeswap/amm-routes/poolInfo.ts | 14 +-- .../sundaeswap/amm-routes/quoteLiquidity.ts | 54 ++++++----- .../sundaeswap/amm-routes/quoteSwap.ts | 1 - .../sundaeswap/amm-routes/removeLiquidity.ts | 23 +++-- src/wallet/utils.ts | 2 +- test/chains/cardano/wallet.test.ts | 97 +++++++++++-------- 12 files changed, 174 insertions(+), 141 deletions(-) diff --git a/src/chains/cardano/cardano.ts b/src/chains/cardano/cardano.ts index f9e4d53bdc..43e9b21cbe 100644 --- a/src/chains/cardano/cardano.ts +++ b/src/chains/cardano/cardano.ts @@ -436,6 +436,15 @@ export class Cardano { } } + 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/connectors/minswap/amm-routes/addLiquidity.ts b/src/connectors/minswap/amm-routes/addLiquidity.ts index 4991a846e6..95cf268051 100644 --- a/src/connectors/minswap/amm-routes/addLiquidity.ts +++ b/src/connectors/minswap/amm-routes/addLiquidity.ts @@ -2,6 +2,8 @@ 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, @@ -18,8 +20,8 @@ async function addLiquidity( network: string, walletAddress: string, poolAddress: string, - baseToken: string, - quoteToken: string, + baseToken: CardanoToken, + quoteToken: CardanoToken, baseTokenAmount: number, quoteTokenAmount: number, slippagePct?: number, // decimal, e.g. 0.01 for 1% @@ -157,8 +159,18 @@ export const addLiquidityRoute: FastifyPluginAsync = async (fastify) => { const poolInfo = await minswap.getAmmPoolInfo(reqPool); - const baseToken = poolInfo.baseTokenAddress; - const quoteToken = poolInfo.quoteTokenAddress; + const baseTokenAddress = poolInfo.baseTokenAddress; + // console.log('baseTokenAddress', baseTokenAddress); + + const quoteTokenAddress = poolInfo.quoteTokenAddress; + // console.log('quoteTokenAddress', quoteTokenAddress); + + // Find token symbol from token address + const baseToken = await minswap.cardano.getTokenByAddress(baseTokenAddress); + // console.log('baseToken', baseToken); + + const quoteToken = await minswap.cardano.getTokenByAddress(quoteTokenAddress); + // console.log('quoteToken', quoteToken); return await addLiquidity( fastify, diff --git a/src/connectors/minswap/amm-routes/quoteLiquidity.ts b/src/connectors/minswap/amm-routes/quoteLiquidity.ts index 4a5a8032f8..3960d6b49e 100644 --- a/src/connectors/minswap/amm-routes/quoteLiquidity.ts +++ b/src/connectors/minswap/amm-routes/quoteLiquidity.ts @@ -16,8 +16,8 @@ import { formatTokenAmount } from '../minswap.utils'; export async function getMinswapAmmLiquidityQuote( network: string, poolAddress?: string, - baseToken?: string, - quoteToken?: string, + baseToken?: CardanoToken, + quoteToken?: CardanoToken, baseTokenAmount?: number, quoteTokenAmount?: number, _slippagePct?: number, @@ -45,16 +45,10 @@ export async function getMinswapAmmLiquidityQuote( const minswap = await Minswap.getInstance(networkToUse); - const baseTokenObj = minswap.cardano.getTokenBySymbol(baseToken); - const quoteTokenObj = minswap.cardano.getTokenBySymbol(quoteToken); - if (!baseTokenObj || !quoteTokenObj) { - throw new Error(`Token not found: ${!baseTokenObj ? baseToken : quoteToken}`); - } - let poolAddressToUse = poolAddress; let existingPool = true; if (!poolAddressToUse) { - poolAddressToUse = await minswap.findDefaultPool(baseToken, quoteToken, 'amm'); + 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`); @@ -77,11 +71,9 @@ export async function getMinswapAmmLiquidityQuote( const quoteReserve: bigint = poolState.reserveB; // ── 3) Convert user inputs into raw bigints ─────────── - const baseRaw = baseTokenAmount - ? BigInt(Math.floor(baseTokenAmount * 10 ** baseTokenObj.decimals).toString()) - : null; + const baseRaw = baseTokenAmount ? BigInt(Math.floor(baseTokenAmount * 10 ** baseToken.decimals).toString()) : null; const quoteRaw = quoteTokenAmount - ? BigInt(Math.floor(quoteTokenAmount * 10 ** quoteTokenObj.decimals).toString()) + ? BigInt(Math.floor(quoteTokenAmount * 10 ** quoteToken.decimals).toString()) : null; // ── 4) Compute the “optimal” opposite amount ─────────── @@ -90,21 +82,21 @@ export async function getMinswapAmmLiquidityQuote( const quoteOptimal = (baseRaw * quoteReserve) / baseReserve; if (quoteOptimal <= quoteRaw) { baseLimited = true; - quoteTokenAmountOptimal = Number(formatTokenAmount(quoteOptimal.toString(), quoteTokenObj.decimals)); + quoteTokenAmountOptimal = Number(formatTokenAmount(quoteOptimal.toString(), quoteToken.decimals)); } else { baseLimited = false; const baseOptimal = (quoteRaw * baseReserve) / quoteReserve; - baseTokenAmountOptimal = Number(formatTokenAmount(baseOptimal.toString(), baseTokenObj.decimals)); + 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(), quoteTokenObj.decimals)); + 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(), baseTokenObj.decimals)); + baseTokenAmountOptimal = Number(formatTokenAmount(baseOptimal.toString(), baseToken.decimals)); baseLimited = false; } } else { @@ -116,11 +108,9 @@ export async function getMinswapAmmLiquidityQuote( } // ── 5) Convert back into Ethers BigNumber for any on‐chain tx ─── - const rawBaseTokenAmount = BigNumber.from( - Math.floor(baseTokenAmountOptimal * 10 ** baseTokenObj.decimals).toString(), - ); + const rawBaseTokenAmount = BigNumber.from(Math.floor(baseTokenAmountOptimal * 10 ** baseToken.decimals).toString()); const rawQuoteTokenAmount = BigNumber.from( - Math.floor(quoteTokenAmountOptimal * 10 ** quoteTokenObj.decimals).toString(), + Math.floor(quoteTokenAmountOptimal * 10 ** quoteToken.decimals).toString(), ); return { @@ -129,8 +119,8 @@ export async function getMinswapAmmLiquidityQuote( quoteTokenAmount: quoteTokenAmountOptimal, baseTokenAmountMax: baseTokenAmount ?? baseTokenAmountOptimal, quoteTokenAmountMax: quoteTokenAmount ?? quoteTokenAmountOptimal, - baseTokenObj, - quoteTokenObj, + baseTokenObj: baseToken, + quoteTokenObj: quoteToken, poolAddress: poolAddressToUse, rawBaseTokenAmount, rawQuoteTokenAmount, @@ -183,8 +173,11 @@ export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { const poolInfo = await minswap.getAmmPoolInfo(poolAddress); - const baseToken = poolInfo.baseTokenAddress; - const quoteToken = poolInfo.quoteTokenAddress; + 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, diff --git a/src/connectors/minswap/amm-routes/removeLiquidity.ts b/src/connectors/minswap/amm-routes/removeLiquidity.ts index e08b051f4b..c3e8648ce0 100644 --- a/src/connectors/minswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/minswap/amm-routes/removeLiquidity.ts @@ -76,35 +76,33 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const poolInfo = await minswap.getAmmPoolInfo(requestedPoolAddress); - const baseToken = poolInfo.baseTokenAddress; - const quoteToken = poolInfo.quoteTokenAddress; + const baseTokenAddress = poolInfo.baseTokenAddress; + // console.log('baseTokenAddress', baseTokenAddress); - // Resolve tokens - const baseTokenObj = minswap.cardano.getTokenBySymbol(baseToken); - const quoteTokenObj = minswap.cardano.getTokenBySymbol(quoteToken); + const quoteTokenAddress = poolInfo.quoteTokenAddress; + // console.log('quoteTokenAddress', quoteTokenAddress); - if (!baseTokenObj || !quoteTokenObj) { - throw fastify.httpErrors.badRequest(`Token not found: ${!baseTokenObj ? baseToken : quoteToken}`); + // Find token symbol from token address + const baseToken = await minswap.cardano.getTokenByAddress(baseTokenAddress); + // console.log('baseToken', baseToken); + + const quoteToken = await minswap.cardano.getTokenByAddress(quoteTokenAddress); + // console.log('quoteToken', quoteToken); + + if (!baseToken || !quoteToken) { + throw fastify.httpErrors.badRequest(`Token not found: ${!baseToken ? baseToken : quoteToken}`); } // Find pool address if not provided let poolAddress = requestedPoolAddress; if (!poolAddress) { - poolAddress = await minswap.findDefaultPool(baseToken, quoteToken, 'amm'); + poolAddress = await minswap.findDefaultPool(baseToken.symbol, quoteToken.symbol, 'amm'); if (!poolAddress) { throw fastify.httpErrors.notFound(`No AMM pool found for pair ${baseToken}-${quoteToken}`); } } // 5) Fetch on-chain pool state for withdraw calculation - const assetA: Asset = { - policyId: baseTokenObj.policyId, - tokenName: baseTokenObj.assetName, - }; - const assetB: Asset = { - policyId: quoteTokenObj.policyId, - tokenName: quoteTokenObj.assetName, - }; const { poolState, poolDatum } = await minswap.getPoolData(poolAddress); // 6) Fetch wallet UTxOs (this also selects the key in Lucid) @@ -143,8 +141,8 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const fee = txBuild.fee; // 10) Compute how many tokens were removed (roughly) - const baseTokenAmountRemoved = formatTokenAmount(amountAReceive, baseTokenObj.decimals); - const quoteTokenAmountRemoved = formatTokenAmount(amountBReceive, quoteTokenObj.decimals); + const baseTokenAmountRemoved = formatTokenAmount(amountAReceive, baseToken.decimals); + const quoteTokenAmountRemoved = formatTokenAmount(amountBReceive, quoteToken.decimals); return { signature: txHash, diff --git a/src/connectors/minswap/minswap.ts b/src/connectors/minswap/minswap.ts index 7849f6a85d..0aa7653831 100644 --- a/src/connectors/minswap/minswap.ts +++ b/src/connectors/minswap/minswap.ts @@ -171,8 +171,8 @@ export class Minswap { return { address: poolAddress, - baseTokenAddress: pool.assetA, - quoteTokenAddress: pool.assetB, + baseTokenAddress: pool.assetA === 'lovelace' ? 'adalovelace' : pool.assetA, + quoteTokenAddress: pool.assetB === 'lovelace' ? 'adalovelace' : pool.assetB, feePct: 2, price: price[0], baseTokenAmount: baseTokenAmount, diff --git a/src/connectors/sundaeswap/amm-routes/addLiquidity.ts b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts index 2d6b13a195..b4b8f38ee1 100644 --- a/src/connectors/sundaeswap/amm-routes/addLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts @@ -5,6 +5,8 @@ import { AssetAmount, IAssetAmountMetadata } from '@sundaeswap/asset'; import { BigNumber } from 'ethers'; import { FastifyPluginAsync } from 'fastify'; +import { CardanoToken } from '#src/tokens/types'; + import { AddLiquidityRequestType, AddLiquidityRequest, @@ -22,8 +24,8 @@ async function addLiquidity( network: string, walletAddress: string, poolAddress: string, - baseToken: string, - quoteToken: string, + baseToken: CardanoToken, + quoteToken: CardanoToken, baseTokenAmount: number, quoteTokenAmount: number, slippagePct?: number, // decimal, e.g. 0.01 for 1% @@ -145,8 +147,12 @@ export const addLiquidityRoute: FastifyPluginAsync = async (fastify) => { const poolInfo = await sundaeswap.getAmmPoolInfo(reqPool); - const baseToken = poolInfo.baseTokenAddress; - const quoteToken = poolInfo.quoteTokenAddress; + const baseTokenAddress = poolInfo.baseTokenAddress; + const quoteTokenAddress = poolInfo.quoteTokenAddress; + // Find token symbol from token address + const baseToken = await sundaeswap.cardano.getTokenByAddress(baseTokenAddress); + const quoteToken = await sundaeswap.cardano.getTokenByAddress(quoteTokenAddress); + return await addLiquidity( fastify, network || 'mainnet', diff --git a/src/connectors/sundaeswap/amm-routes/poolInfo.ts b/src/connectors/sundaeswap/amm-routes/poolInfo.ts index a3db74ff0d..8011a9c530 100644 --- a/src/connectors/sundaeswap/amm-routes/poolInfo.ts +++ b/src/connectors/sundaeswap/amm-routes/poolInfo.ts @@ -18,7 +18,7 @@ export const ammPoolInfoRoute: FastifyPluginAsync = async (fastify) => { ...GetPoolInfoRequest, properties: { network: { type: 'string', examples: ['mainnet'] }, - poolIdent: { + poolAddress: { type: 'string', examples: ['2f36866691fa75a9aab66dec99f7cc2d297ca09e34d9ce68cde04773'], }, @@ -33,18 +33,18 @@ export const ammPoolInfoRoute: FastifyPluginAsync = async (fastify) => { }, async (request): Promise => { try { - const { poolAddress: poolIdent } = request.query; + const { poolAddress } = request.query; const network = request.query.network || 'mainnet'; const sundaeswap = await Sundaeswap.getInstance(network); + // console.log('sundaeswap ', sundaeswap); - // Check if either poolIdent or both baseToken and quoteToken are provided - if (!poolIdent) { - throw fastify.httpErrors.badRequest('poolIdent is required'); + // Check if either poolAddress or both baseToken and quoteToken are provided + if (!poolAddress) { + throw fastify.httpErrors.badRequest('poolAddress is required'); } - const poolIdentToUse = poolIdent; - const poolInfo = await sundaeswap.getAmmPoolInfo(poolIdentToUse); + const poolInfo = await sundaeswap.getAmmPoolInfo(poolAddress); if (!poolInfo) throw fastify.httpErrors.notFound('Pool not found'); return poolInfo; } catch (e) { diff --git a/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts b/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts index 5f393091be..3317d9d8a1 100644 --- a/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts @@ -17,8 +17,8 @@ import { formatTokenAmount } from '../sundaeswap.utils'; export async function getSundaeswapAmmLiquidityQuote( network: string, poolAddress?: string, - baseToken?: string, - quoteToken?: string, + baseToken?: CardanoToken, + quoteToken?: CardanoToken, baseTokenAmount?: number, quoteTokenAmount?: number, _slippagePct?: number, @@ -28,8 +28,8 @@ export async function getSundaeswapAmmLiquidityQuote( quoteTokenAmount: number; baseTokenAmountMax: number; quoteTokenAmountMax: number; - baseTokenObj: CardanoToken; - quoteTokenObj: CardanoToken; + baseToken: CardanoToken; + quoteToken: CardanoToken; poolAddress?: string; rawBaseTokenAmount: string; rawQuoteTokenAmount: string; @@ -46,16 +46,10 @@ export async function getSundaeswapAmmLiquidityQuote( const sundaeswap = await Sundaeswap.getInstance(networkToUse); - const baseTokenObj = sundaeswap.cardano.getTokenBySymbol(baseToken); - const quoteTokenObj = sundaeswap.cardano.getTokenBySymbol(quoteToken); - if (!baseTokenObj || !quoteTokenObj) { - throw new Error(`Token not found: ${!baseTokenObj ? baseToken : quoteToken}`); - } - let poolAddressToUse = poolAddress; let existingPool = true; if (!poolAddressToUse) { - poolAddressToUse = await sundaeswap.findDefaultPool(baseToken, quoteToken, 'amm'); + 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`); @@ -79,11 +73,9 @@ export async function getSundaeswapAmmLiquidityQuote( const quoteReserve: bigint = poolState.liquidity.bReserve || BigInt(0); // ── 3) Convert user inputs into raw bigints ─────────── - const baseRaw = baseTokenAmount - ? BigInt(Math.floor(baseTokenAmount * 10 ** baseTokenObj.decimals).toString()) - : null; + const baseRaw = baseTokenAmount ? BigInt(Math.floor(baseTokenAmount * 10 ** baseToken.decimals).toString()) : null; const quoteRaw = quoteTokenAmount - ? BigInt(Math.floor(quoteTokenAmount * 10 ** quoteTokenObj.decimals).toString()) + ? BigInt(Math.floor(quoteTokenAmount * 10 ** quoteToken.decimals).toString()) : null; // ── 4) Compute the "optimal" opposite amount ─────────── @@ -92,21 +84,21 @@ export async function getSundaeswapAmmLiquidityQuote( const quoteOptimal = (baseRaw * quoteReserve) / baseReserve; if (quoteOptimal <= quoteRaw) { baseLimited = true; - quoteTokenAmountOptimal = Number(formatTokenAmount(quoteOptimal.toString(), quoteTokenObj.decimals)); + quoteTokenAmountOptimal = Number(formatTokenAmount(quoteOptimal.toString(), quoteToken.decimals)); } else { baseLimited = false; const baseOptimal = (quoteRaw * baseReserve) / quoteReserve; - baseTokenAmountOptimal = Number(formatTokenAmount(baseOptimal.toString(), baseTokenObj.decimals)); + 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(), quoteTokenObj.decimals)); + 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(), baseTokenObj.decimals)); + baseTokenAmountOptimal = Number(formatTokenAmount(baseOptimal.toString(), baseToken.decimals)); baseLimited = false; } } else { @@ -118,9 +110,9 @@ export async function getSundaeswapAmmLiquidityQuote( } // ── 5) Convert back into Ethers BigNumber for any on‐chain tx ─── - const rawBaseTokenAmount = Math.floor(baseTokenAmountOptimal * 10 ** baseTokenObj.decimals).toString(); + const rawBaseTokenAmount = Math.floor(baseTokenAmountOptimal * 10 ** baseToken.decimals).toString(); - const rawQuoteTokenAmount = Math.floor(quoteTokenAmountOptimal * 10 ** quoteTokenObj.decimals).toString(); + const rawQuoteTokenAmount = Math.floor(quoteTokenAmountOptimal * 10 ** quoteToken.decimals).toString(); return { baseLimited, @@ -128,8 +120,8 @@ export async function getSundaeswapAmmLiquidityQuote( quoteTokenAmount: quoteTokenAmountOptimal, baseTokenAmountMax: baseTokenAmount ?? baseTokenAmountOptimal, quoteTokenAmountMax: quoteTokenAmount ?? quoteTokenAmountOptimal, - baseTokenObj, - quoteTokenObj, + baseToken, + quoteToken, poolAddress: poolAddressToUse, rawBaseTokenAmount, rawQuoteTokenAmount, @@ -182,8 +174,20 @@ export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { const poolInfo = await sundaeswap.getAmmPoolInfo(poolAddress); - const baseToken = poolInfo.baseTokenAddress; - const quoteToken = poolInfo.quoteTokenAddress; + const baseTokenAddress = poolInfo.baseTokenAddress; + // console.log('baseTokenAddress ', baseTokenAddress); + + const quoteTokenAddress = poolInfo.quoteTokenAddress; + // console.log('quoteTokenAddress ', quoteTokenAddress); + + // Find token symbol from token address + const baseToken = await sundaeswap.cardano.getTokenByAddress(baseTokenAddress); + + // console.log('baseToken ', baseToken); + + const quoteToken = await sundaeswap.cardano.getTokenByAddress(quoteTokenAddress); + + // console.log('quoteToken ', quoteToken); const quote = await getSundaeswapAmmLiquidityQuote( network, diff --git a/src/connectors/sundaeswap/amm-routes/quoteSwap.ts b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts index 1e5edf020d..036770728f 100644 --- a/src/connectors/sundaeswap/amm-routes/quoteSwap.ts +++ b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts @@ -303,7 +303,6 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { quoteToken: { type: 'string', examples: ['SUNDAE'] }, amount: { type: 'number', examples: [0.001] }, side: { type: 'string', enum: ['BUY', 'SELL'], examples: ['SELL'] }, - poolIdent: { type: 'string', examples: [''] }, slippagePct: { type: 'number', examples: [1] }, }, }, diff --git a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts index ae1dedd710..b8a046183d 100644 --- a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts @@ -83,21 +83,20 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const poolInfo = await sundaeswap.getAmmPoolInfo(requestedPoolAddress); - const baseToken = poolInfo.baseTokenAddress; - const quoteToken = poolInfo.quoteTokenAddress; - - // Resolve tokens - const baseTokenObj = sundaeswap.cardano.getTokenBySymbol(baseToken); - const quoteTokenObj = sundaeswap.cardano.getTokenBySymbol(quoteToken); - - if (!baseTokenObj || !quoteTokenObj) { - throw fastify.httpErrors.badRequest(`Token not found: ${!baseTokenObj ? baseToken : quoteToken}`); + const baseTokenAddress = poolInfo.baseTokenAddress; + const quoteTokenAddress = poolInfo.quoteTokenAddress; + // Find token symbol from token address + 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 ? baseToken : quoteToken}`); } // Find pool address if not provided let poolAddress = requestedPoolAddress; if (!poolAddress) { - poolAddress = await sundaeswap.findDefaultPool(baseToken, quoteToken, 'amm'); + poolAddress = await sundaeswap.findDefaultPool(baseToken.symbol, quoteToken.symbol, 'amm'); if (!poolAddress) { throw fastify.httpErrors.notFound(`No AMM pool found for pair ${baseToken}-${quoteToken}`); @@ -160,11 +159,11 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { // Calculate the amounts that will be received (proportional to LP tokens withdrawn) const baseTokenAmountRemoved = Math.floor( - (Number(baseTokenReserve) * withdrawalProportion) / baseTokenObj.decimals, + (Number(baseTokenReserve) * withdrawalProportion) / baseToken.decimals, ); const quoteTokenAmountRemoved = Math.floor( - (Number(quoteTokenReserve) * withdrawalProportion) / quoteTokenObj.decimals, + (Number(quoteTokenReserve) * withdrawalProportion) / quoteToken.decimals, ); return { diff --git a/src/wallet/utils.ts b/src/wallet/utils.ts index b880fb5d94..74cb870e67 100644 --- a/src/wallet/utils.ts +++ b/src/wallet/utils.ts @@ -96,7 +96,7 @@ export async function addWallet(fastify: FastifyInstance, req: AddWalletRequest) try { if (req.chain.toLowerCase() === 'cardano') { connection = await getInitializedChain(req.chain, cardanoNetwork); - console.log('working upto here!', connection); + // console.log('working upto here!', connection); } else { // For Ethereum and Solana, use the default network connection = await getInitializedChain(req.chain, network); diff --git a/test/chains/cardano/wallet.test.ts b/test/chains/cardano/wallet.test.ts index 5a55f3a4c0..ac404bf33d 100644 --- a/test/chains/cardano/wallet.test.ts +++ b/test/chains/cardano/wallet.test.ts @@ -1,3 +1,6 @@ +// 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'); @@ -13,11 +16,9 @@ const mockFse = fse as jest.Mocked; let cardano: Cardano; -// Test wallet data -const testAddress = - 'addr_test1vrvqa7ytgmptew2qy3ec0lqdk9n94vcgwu4wy07kqp2he0srll8mg'; -const testPrivateKey = - 'ed25519_sk1n24dk27xar2skjef5a5xvpk0uy0sqw62tt7hlv7wcpd4xp4fhy5sdask94'; // noqa: mock +// --- Test wallet data --- +const testAddress = 'addr_test1vrvqa7ytgmptew2qy3ec0lqdk9n94vcgwu4wy07kqp2he0srll8mg'; +const testPrivateKey = 'ed25519_sk1n24dk27xar2skjef5a5xvpk0uy0sqw62tt7hlv7wcpd4xp4fhy5sdask94'; // noqa: mock // Mock the encoded private key response const encodedPrivateKey = { @@ -45,9 +46,29 @@ 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(); }); @@ -57,7 +78,7 @@ beforeEach(() => { // Clear mock wallets mockWallets.cardano.clear(); - // Mock wallet operations to work with in-memory storage + // Ensure per-test overrides can change behavior of the mocked instance patch(cardano, 'getWalletFromPrivateKey', () => { return { address: testAddress }; }); @@ -79,39 +100,35 @@ beforeEach(() => { return undefined; }); - (mockFse.readdir as jest.Mock).mockImplementation( - async (dirPath: any, options?: any) => { - const pathStr = dirPath.toString(); + (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 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`); + // 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 []; - }, - ); + return []; + }); - (mockFse.readFile as jest.Mock).mockResolvedValue( - Buffer.from(JSON.stringify(encodedPrivateKey)), - ); + (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); @@ -129,6 +146,7 @@ beforeEach(() => { }); afterAll(async () => { + // close the mocked cardano instance and the app await cardano.close(); await gatewayApp.close(); }); @@ -259,8 +277,7 @@ describe('Cardano Wallet Operations', () => { method: 'DELETE', url: '/wallet/remove', payload: { - address: - 'addr_test1vrvqa7ytgmptew2qy3ec0lqdk9n94vcgwu4wy07kqp2he0srll8mg', + address: 'addr_test1vrvqa7ytgmptew2qy3ec0lqdk9n94vcgwu4wy07kqp2he0srll8mg', chain: 'cardano', }, }); @@ -327,12 +344,8 @@ describe('Cardano Wallet Operations', () => { }); expect(finalGetResponse.statusCode).toBe(200); - const finalWallets: GetWalletResponse[] = JSON.parse( - finalGetResponse.payload, - ); - const finalCardanoWallet = finalWallets.find( - (w) => w.chain === 'cardano', - ); + const finalWallets: GetWalletResponse[] = JSON.parse(finalGetResponse.payload); + const finalCardanoWallet = finalWallets.find((w) => w.chain === 'cardano'); expect(finalCardanoWallet?.walletAddresses).not.toContain(testAddress); }); }); From eabfa021c4e53469fd214444c596c7086eb24a97 Mon Sep 17 00:00:00 2001 From: Aiquant1 Date: Fri, 26 Sep 2025 15:35:58 +0530 Subject: [PATCH 12/12] fix(cardano): correct base/quote token handling for Minswap and SundaeSwap - Fix base/quote token logic to match industry standards - Fix asset mappings for any pool structure - Fix amount parameter to use base token units - Update all DEX routes (swap, liquidity, execute) --- .../minswap/amm-routes/addLiquidity.ts | 38 ++- .../minswap/amm-routes/executeSwap.ts | 113 ++++---- .../minswap/amm-routes/quoteLiquidity.ts | 25 +- .../minswap/amm-routes/quoteSwap.ts | 75 ++--- .../minswap/amm-routes/removeLiquidity.ts | 63 ++--- .../sundaeswap/amm-routes/addLiquidity.ts | 40 ++- .../sundaeswap/amm-routes/executeSwap.ts | 111 ++++---- .../sundaeswap/amm-routes/quoteLiquidity.ts | 62 +++-- .../sundaeswap/amm-routes/quoteSwap.ts | 259 ++++++++---------- .../sundaeswap/amm-routes/removeLiquidity.ts | 79 +++--- 10 files changed, 441 insertions(+), 424 deletions(-) diff --git a/src/connectors/minswap/amm-routes/addLiquidity.ts b/src/connectors/minswap/amm-routes/addLiquidity.ts index 95cf268051..d54ff1bf02 100644 --- a/src/connectors/minswap/amm-routes/addLiquidity.ts +++ b/src/connectors/minswap/amm-routes/addLiquidity.ts @@ -24,7 +24,7 @@ async function addLiquidity( quoteToken: CardanoToken, baseTokenAmount: number, quoteTokenAmount: number, - slippagePct?: number, // decimal, e.g. 0.01 for 1% + slippagePct?: number, ): Promise { const networkToUse = network || 'mainnet'; @@ -51,21 +51,43 @@ async function addLiquidity( cardano.lucidInstance.selectWalletFromPrivateKey(privateKey); // 4) Determine slippage - const slippage = slippagePct !== undefined ? slippagePct : minswap.getAllowedSlippage(); // returns decimal, e.g. 0.005 + 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; - // 6) Compute necessary amounts and LP tokens + // 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: baseRaw, - depositedAmountB: quoteRaw, + depositedAmountA, + depositedAmountB, reserveA, reserveB, totalLiquidity, @@ -74,7 +96,7 @@ async function addLiquidity( // 7) Apply slippage to LP minimum const minLP = (lpAmount * BigInt(Math.floor((1 - slippage) * 1e6))) / BigInt(1e6); - // 8) Build tx + // 8) Build tx - amounts are already correctly mapped to assetA/assetB const dex = new Dex(cardano.lucidInstance); const utxos = await cardano.lucidInstance.utxosAt(walletAddress); @@ -160,17 +182,13 @@ export const addLiquidityRoute: FastifyPluginAsync = async (fastify) => { const poolInfo = await minswap.getAmmPoolInfo(reqPool); const baseTokenAddress = poolInfo.baseTokenAddress; - // console.log('baseTokenAddress', baseTokenAddress); const quoteTokenAddress = poolInfo.quoteTokenAddress; - // console.log('quoteTokenAddress', quoteTokenAddress); // Find token symbol from token address const baseToken = await minswap.cardano.getTokenByAddress(baseTokenAddress); - // console.log('baseToken', baseToken); const quoteToken = await minswap.cardano.getTokenByAddress(quoteTokenAddress); - // console.log('quoteToken', quoteToken); return await addLiquidity( fastify, diff --git a/src/connectors/minswap/amm-routes/executeSwap.ts b/src/connectors/minswap/amm-routes/executeSwap.ts index 56d151527c..eb9421d58d 100644 --- a/src/connectors/minswap/amm-routes/executeSwap.ts +++ b/src/connectors/minswap/amm-routes/executeSwap.ts @@ -30,9 +30,9 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { ...ExecuteSwapRequest.properties, network: { type: 'string', default: 'mainnet' }, walletAddress: { type: 'string' }, - baseToken: { type: 'string', examples: ['ADA'] }, - quoteToken: { type: 'string', examples: ['MIN'] }, - amount: { type: 'number', examples: [1.5] }, // now always quote + 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] }, @@ -48,7 +48,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { walletAddress: reqAddr, baseToken, quoteToken, - amount, // this is always quote quantity + amount, // this is always BASE token quantity side, slippagePct = 1, } = request.body; @@ -80,18 +80,34 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { tokenName: quoteInfo.assetName, }; - // On‑chain reserves - const { poolState } = await minswap.getPoolData(poolAddr); if (!poolState) { throw fastify.httpErrors.notFound('Pool state unavailable'); } - const baseReserve = poolState.reserveA; - const quoteReserve = poolState.reserveB; + + // 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); - // 2) build via SDK const privateKey = await minswap.cardano.getWalletFromAddress(walletAddr); minswap.cardano.lucidInstance.selectWalletFromPrivateKey(privateKey); const dex = new Dex(minswap.cardano.lucidInstance); @@ -103,74 +119,73 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { let totalOutputSwapped: number; if (side === 'SELL') { - // SELL: selling quote tokens to get base tokens - // `amount` is the amount of quote tokens to sell (input) - const amountIn = BigInt(Math.floor(amount * 10 ** quoteInfo.decimals).toString()); + // 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: idealBaseOut } = calculateSwapExactIn({ + const { amountOut: idealQuoteOut } = calculateSwapExactIn({ amountIn, - reserveIn: quoteReserve, - reserveOut: baseReserve, + reserveIn, + reserveOut, }); - const minBaseOut = (idealBaseOut * (100n - pct)) / 100n; + const minQuoteOut = (idealQuoteOut * (100n - pct)) / 100n; txBuild = await dex.buildSwapExactInTx({ sender: walletAddr, availableUtxos: await minswap.cardano.lucidInstance.utxosAt(walletAddr), - assetIn: quoteToken === 'ADA' ? ADA : assetB, + assetIn: baseToken === 'ADA' ? ADA : assetA, amountIn, - assetOut: baseToken === 'ADA' ? ADA : assetA, - minimumAmountOut: minBaseOut, + assetOut: quoteToken === 'ADA' ? ADA : assetB, + minimumAmountOut: minQuoteOut, isLimitOrder: false, }); - // SELL: spending quote tokens (-), receiving base tokens (+) - quoteAmountChange = -Number(amount); - baseAmountChange = +Number(formatTokenAmount(minBaseOut.toString(), baseInfo.decimals)); - totalInputSwapped = amount; // quote tokens spent - totalOutputSwapped = Number(formatTokenAmount(minBaseOut.toString(), baseInfo.decimals)); // base tokens received + // 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 quote tokens with base tokens - // `amount` is the amount of quote tokens to buy (output) - const exactQuoteOut = BigInt(Math.floor(amount * 10 ** quoteInfo.decimals).toString()); - - const { amountIn: idealBaseIn } = calculateSwapExactOut({ - exactAmountOut: exactQuoteOut, - reserveIn: baseReserve, - reserveOut: quoteReserve, + // 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 maxBaseIn = (idealBaseIn * (100n + pct)) / 100n; + const maxQuoteIn = (idealQuoteIn * (100n + pct)) / 100n; txBuild = await dex.buildSwapExactOutTx({ sender: walletAddr, availableUtxos: await minswap.cardano.lucidInstance.utxosAt(walletAddr), - assetIn: baseToken === 'ADA' ? ADA : assetA, - maximumAmountIn: maxBaseIn, - assetOut: quoteToken === 'ADA' ? ADA : assetB, - expectedAmountOut: exactQuoteOut, + assetIn: quoteToken === 'ADA' ? ADA : assetB, + maximumAmountIn: maxQuoteIn, + assetOut: baseToken === 'ADA' ? ADA : assetA, + expectedAmountOut: exactBaseOut, }); - // BUY: spending base tokens (-), receiving quote tokens (+) - baseAmountChange = -Number(formatTokenAmount(maxBaseIn.toString(), baseInfo.decimals)); - quoteAmountChange = +Number(amount); - totalInputSwapped = Number(formatTokenAmount(maxBaseIn.toString(), baseInfo.decimals)); // base tokens spent - totalOutputSwapped = amount; // quote tokens received + // 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 } - // 3) sign & submit const signed = await txBuild.sign().complete(); - const txHash = await signed.submit(); + // Return correct token addresses and amounts return { signature: txHash, - status: 1, // 1 = CONFIRMED, 0 = PENDING, -1 = FAILED + status: 1, data: { - tokenIn: side === 'SELL' ? quoteToken : baseToken, - tokenOut: side === 'SELL' ? baseToken : quoteToken, - amountIn: side === 'SELL' ? totalInputSwapped : totalInputSwapped, - amountOut: side === 'SELL' ? totalOutputSwapped : totalOutputSwapped, + tokenIn: side === 'SELL' ? baseToken : quoteToken, + tokenOut: side === 'SELL' ? quoteToken : baseToken, + amountIn: totalInputSwapped, + amountOut: totalOutputSwapped, fee: txBuild.fee, baseTokenBalanceChange: baseAmountChange, quoteTokenBalanceChange: quoteAmountChange, diff --git a/src/connectors/minswap/amm-routes/quoteLiquidity.ts b/src/connectors/minswap/amm-routes/quoteLiquidity.ts index 3960d6b49e..298e46d7a4 100644 --- a/src/connectors/minswap/amm-routes/quoteLiquidity.ts +++ b/src/connectors/minswap/amm-routes/quoteLiquidity.ts @@ -66,17 +66,30 @@ export async function getMinswapAmmLiquidityQuote( throw new Error(`Unable to load pool ${poolAddressToUse}`); } - // ── 2) Pull reserves as bigints ──────────────────────── - const baseReserve: bigint = poolState.reserveA; - const quoteReserve: bigint = poolState.reserveB; + // 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`); + } - // ── 3) Convert user inputs into raw bigints ─────────── + // 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; - // ── 4) Compute the “optimal” opposite amount ─────────── + // Compute the "optimal" opposite amount if (baseRaw !== null && quoteRaw !== null) { // both sides provided → pick the limiting one const quoteOptimal = (baseRaw * quoteReserve) / baseReserve; @@ -107,7 +120,7 @@ export async function getMinswapAmmLiquidityQuote( baseLimited = false; // arbitrary; both get used } - // ── 5) Convert back into Ethers BigNumber for any on‐chain tx ─── + // 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(), diff --git a/src/connectors/minswap/amm-routes/quoteSwap.ts b/src/connectors/minswap/amm-routes/quoteSwap.ts index fc64fe914e..b7d9784af8 100644 --- a/src/connectors/minswap/amm-routes/quoteSwap.ts +++ b/src/connectors/minswap/amm-routes/quoteSwap.ts @@ -22,41 +22,32 @@ async function quoteAmmSwap( poolAddress: string, baseToken: CardanoToken, quoteToken: CardanoToken, - amount: number, // now always refers to quote‐token units + amount: number, side: 'BUY' | 'SELL', - slippagePct?: number, + _slippagePct?: number, ): Promise { - // BUY: you want to RECEIVE `amount` of quoteToken, paying baseToken - // SELL: you want to SPEND `amount` of quoteToken, receiving baseToken const exactIn = side === 'SELL'; - // Figure out which asset is input vs. output - const inputToken = exactIn ? quoteToken : baseToken; - const outputToken = exactIn ? baseToken : quoteToken; + const [inputToken, outputToken] = exactIn ? [baseToken, quoteToken] : [quoteToken, baseToken]; - // FIXED: Convert `amount` to smallest‐unit based on what the amount represents - // For BUY: amount = desired quoteToken amount (output) - // For SELL: amount = available quoteToken amount (input) let amountInSmallestUnit: bigint; - - if (side === 'BUY') { - // For BUY, amount represents the desired quoteToken (output), but we need exactOut calculation - // So convert amount using quoteToken decimals - amountInSmallestUnit = BigNumber.from(Math.floor(amount * 10 ** quoteToken.decimals)).toBigInt(); + if (exactIn) { + // SELL: amount is in baseToken units, inputToken is baseToken + amountInSmallestUnit = BigNumber.from(Math.floor(amount * 10 ** baseToken.decimals)).toBigInt(); } else { - // For SELL, amount represents the quoteToken to spend (input) - // So convert amount using quoteToken decimals - amountInSmallestUnit = BigNumber.from(Math.floor(amount * 10 ** quoteToken.decimals)).toBigInt(); + // 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 & fee depending on input/output + // 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; @@ -68,10 +59,10 @@ async function quoteAmmSwap( throw new Error(`Input token not in pool`); } - // Do the math + // Calculate swap amounts let inputAmount: bigint, outputAmount: bigint, priceImpact: number; if (exactIn) { - // SELL: spending exact amount of quoteToken + // SELL: spending exact amount of baseToken inputAmount = amountInSmallestUnit; const { amountOut, priceImpact: pi } = calculateSwapExactIn({ amountIn: inputAmount, @@ -81,7 +72,7 @@ async function quoteAmmSwap( outputAmount = amountOut; priceImpact = pi.toNumber(); } else { - // BUY: want to receive exact amount of quoteToken + // BUY: want to receive exact amount of baseToken outputAmount = amountInSmallestUnit; const { amountIn, priceImpact: pi } = calculateSwapExactOut({ exactAmountOut: outputAmount, @@ -92,39 +83,19 @@ async function quoteAmmSwap( priceImpact = pi.toNumber(); } - const effectiveSlippage = slippagePct !== undefined ? slippagePct / 100 : minswap.getAllowedSlippage(); - - const minAmountOut = exactIn - ? new BN(outputAmount.toString()).mul(new BN(Math.floor((1 - effectiveSlippage) * 10000))).div(new BN(10000)) - : outputAmount; - - const maxAmountIn = exactIn - ? inputAmount - : new BN(inputAmount.toString()).mul(new BN(Math.floor((1 + effectiveSlippage) * 10000))).div(new BN(10000)); - - // Format human‐readable + // Format amounts const estimatedIn = formatTokenAmount(inputAmount.toString(), inputToken.decimals); const estimatedOut = formatTokenAmount(outputAmount.toString(), outputToken.decimals); - const minOutHuman = formatTokenAmount(minAmountOut.toString(), outputToken.decimals); - const maxInHuman = formatTokenAmount(maxAmountIn.toString(), inputToken.decimals); + // Return with proper token references return { poolAddress, estimatedAmountIn: estimatedIn, estimatedAmountOut: estimatedOut, - minAmountOut: minOutHuman, - maxAmountIn: maxInHuman, - priceImpact, inputToken, outputToken, - rawAmountIn: inputAmount.toString(), - rawAmountOut: outputAmount.toString(), - rawMinAmountOut: minAmountOut.toString(), - rawMaxAmountIn: maxAmountIn.toString(), - pathAddresses: [ - inputToken.address || `${inputToken.policyId}.${inputToken.assetName}`, - outputToken.address || `${outputToken.policyId}.${outputToken.assetName}`, - ], + // FIXED: Simple path addresses like Uniswap + pathAddresses: [inputToken.address, outputToken.address], }; } @@ -297,11 +268,11 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { properties: { ...QuoteSwapRequest.properties, network: { type: 'string', default: 'mainnet' }, - baseToken: { type: 'string', examples: ['ADA'] }, - quoteToken: { type: 'string', examples: ['MIN'] }, - amount: { type: 'number', examples: [0.001] }, - side: { type: 'string', enum: ['BUY', 'SELL'], examples: ['SELL'] }, - poolAddress: { type: 'string', examples: [''] }, + 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] }, }, }, diff --git a/src/connectors/minswap/amm-routes/removeLiquidity.ts b/src/connectors/minswap/amm-routes/removeLiquidity.ts index c3e8648ce0..f18533af32 100644 --- a/src/connectors/minswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/minswap/amm-routes/removeLiquidity.ts @@ -27,18 +27,13 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { ...RemoveLiquidityRequest.properties, network: { type: 'string', default: 'preprod' }, walletAddress: { type: 'string', examples: ['addr...'] }, - poolAddress: { - type: 'string', - examples: [''], - }, + poolAddress: { type: 'string', examples: [''] }, baseToken: { type: 'string', examples: ['ADA'] }, quoteToken: { type: 'string', examples: ['MIN'] }, percentageToRemove: { type: 'number', examples: [100] }, }, }, - response: { - 200: RemoveLiquidityResponse, - }, + response: { 200: RemoveLiquidityResponse }, }, }, async (request) => { @@ -56,10 +51,8 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { throw fastify.httpErrors.badRequest('Percentage to remove must be between 0 and 100'); } - // Get Minswap and Cardano instances const minswap = await Minswap.getInstance(networkToUse); - // Get wallet address - either from request or first available let walletAddress = requestedWalletAddress; if (!walletAddress) { walletAddress = await minswap.cardano.getFirstWalletAddress(); @@ -69,7 +62,6 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { logger.info(`Using first available wallet address: ${walletAddress}`); } - // Check if poolAddress is provided if (!requestedPoolAddress) { throw fastify.httpErrors.badRequest('poolAddress must be provided'); } @@ -77,45 +69,36 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const poolInfo = await minswap.getAmmPoolInfo(requestedPoolAddress); const baseTokenAddress = poolInfo.baseTokenAddress; - // console.log('baseTokenAddress', baseTokenAddress); - const quoteTokenAddress = poolInfo.quoteTokenAddress; - // console.log('quoteTokenAddress', quoteTokenAddress); - // Find token symbol from token address const baseToken = await minswap.cardano.getTokenByAddress(baseTokenAddress); - // console.log('baseToken', baseToken); - const quoteToken = await minswap.cardano.getTokenByAddress(quoteTokenAddress); - // console.log('quoteToken', quoteToken); if (!baseToken || !quoteToken) { - throw fastify.httpErrors.badRequest(`Token not found: ${!baseToken ? baseToken : quoteToken}`); + throw fastify.httpErrors.badRequest(`Token not found: ${!baseToken ? 'base' : 'quote'}`); } - // Find pool address if not provided 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}-${quoteToken}`); + throw fastify.httpErrors.notFound(`No AMM pool found for pair ${baseToken.symbol}-${quoteToken.symbol}`); } } - // 5) Fetch on-chain pool state for withdraw calculation + + // Fetch on-chain pool state const { poolState, poolDatum } = await minswap.getPoolData(poolAddress); - // 6) Fetch wallet UTxOs (this also selects the key in Lucid) + // Setup wallet const wallet = await minswap.cardano.getWalletFromAddress(walletAddress); minswap.cardano.lucidInstance.selectWalletFromPrivateKey(wallet); const utxos = await minswap.cardano.lucidInstance.utxosAt(walletAddress); - // 8) Calculate withdrawal amounts + // Calculate withdrawal amounts const totalLpInWallet = minswap.calculateAssetAmount(utxos, poolState.assetLP); - const withdrawLpAmount = (totalLpInWallet * BigInt(percentageToRemove)) / 100n; - // 9) Calculate the assets to be received upon withdrawal + // Calculate the assets to be received upon withdrawal const { amountAReceive, amountBReceive } = calculateWithdraw({ withdrawalLPAmount: withdrawLpAmount, reserveA: poolState.reserveA, @@ -123,8 +106,8 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { totalLiquidity: poolDatum.totalLiquidity, }); + // Build withdrawal transaction const lpAsset = Asset.fromString(poolState.assetLP); - // minimums = 0 here; you could tighten via slippage const dex = new Dex(minswap.cardano.lucidInstance); const txBuild = await dex.buildWithdrawTx({ sender: walletAddress, @@ -135,18 +118,33 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { availableUtxos: utxos, }); - // 9) Sign & submit + // Sign & submit const signed = await txBuild.sign().complete(); const txHash = await signed.submit(); const fee = txBuild.fee; - // 10) Compute how many tokens were removed (roughly) - const baseTokenAmountRemoved = formatTokenAmount(amountAReceive, baseToken.decimals); - const quoteTokenAmountRemoved = formatTokenAmount(amountBReceive, quoteToken.decimals); + // 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, // 1 = CONFIRMED, 0 = PENDING, -1 = FAILED + status: 1, data: { fee, baseTokenAmountRemoved, @@ -158,7 +156,6 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { if (e.statusCode) { throw e; } - throw fastify.httpErrors.internalServerError('Failed to remove liquidity'); } }, diff --git a/src/connectors/sundaeswap/amm-routes/addLiquidity.ts b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts index b4b8f38ee1..a4c894310f 100644 --- a/src/connectors/sundaeswap/amm-routes/addLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/addLiquidity.ts @@ -28,7 +28,7 @@ async function addLiquidity( quoteToken: CardanoToken, baseTokenAmount: number, quoteTokenAmount: number, - slippagePct?: number, // decimal, e.g. 0.01 for 1% + slippagePct?: number, ): Promise { const networkToUse = network || 'mainnet'; @@ -54,11 +54,36 @@ async function addLiquidity( } 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(quote.rawBaseTokenAmount, quote.poolData.assetA), - new AssetAmount(quote.rawQuoteTokenAmount, quote.poolData.assetB), - ] as [AssetAmount, AssetAmount], // Explicit tuple + new AssetAmount(assetAAmount, quote.poolData.assetA), + new AssetAmount(assetBAmount, quote.poolData.assetB), + ] as [AssetAmount, AssetAmount], pool: quote.poolData, orderAddresses: { DestinationAddress: { @@ -82,7 +107,7 @@ async function addLiquidity( return { signature: txHash, - status: 1, // 1 = CONFIRMED, 0 = PENDING, -1 = FAILED + status: 1, data: { fee: builtTx.builtTx.fee, baseTokenAmountAdded: quote.baseTokenAmount, @@ -140,7 +165,6 @@ export const addLiquidityRoute: FastifyPluginAsync = async (fastify) => { throw fastify.httpErrors.badRequest('No wallet address'); } - // Check if poolAddress is provided if (!reqPool) { throw fastify.httpErrors.badRequest('poolAddress must be provided'); } @@ -149,7 +173,7 @@ export const addLiquidityRoute: FastifyPluginAsync = async (fastify) => { const baseTokenAddress = poolInfo.baseTokenAddress; const quoteTokenAddress = poolInfo.quoteTokenAddress; - // Find token symbol from token address + const baseToken = await sundaeswap.cardano.getTokenByAddress(baseTokenAddress); const quoteToken = await sundaeswap.cardano.getTokenByAddress(quoteTokenAddress); @@ -162,7 +186,7 @@ export const addLiquidityRoute: FastifyPluginAsync = async (fastify) => { quoteToken, baseTokenAmount, quoteTokenAmount, - slippagePct !== undefined ? slippagePct / 100 : undefined, // convert % to decimal + slippagePct !== undefined ? slippagePct / 100 : undefined, ); } catch (e: any) { logger.error(e); diff --git a/src/connectors/sundaeswap/amm-routes/executeSwap.ts b/src/connectors/sundaeswap/amm-routes/executeSwap.ts index 05209a5342..978b1c22e6 100644 --- a/src/connectors/sundaeswap/amm-routes/executeSwap.ts +++ b/src/connectors/sundaeswap/amm-routes/executeSwap.ts @@ -35,7 +35,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { walletAddress: { type: 'string' }, baseToken: { type: 'string', examples: ['ADA'] }, quoteToken: { type: 'string', examples: ['SUNDAE'] }, - amount: { type: 'number', examples: [100] }, // always quote amount + amount: { type: 'number', examples: [100] }, // always BASE token amount side: { type: 'string', enum: ['BUY', 'SELL'] }, poolAddress: { type: 'string' }, slippagePct: { type: 'number', examples: [1] }, @@ -51,7 +51,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { const net = (network || 'mainnet') as TSupportedNetworks; const sundaeswap = await Sundaeswap.getInstance(net); - // determine wallet + // Determine wallet const walletAddr = reqAddr || (await sundaeswap.cardano.getFirstWalletAddress()); if (!walletAddr) { throw fastify.httpErrors.badRequest('No wallet address provided'); @@ -59,7 +59,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { const wallet = await sundaeswap.cardano.getWalletFromAddress(walletAddr); sundaeswap.cardano.lucidInstance.selectWalletFromPrivateKey(wallet); - // determine pool + // Determine pool const poolAddr = await sundaeswap.findDefaultPool(baseToken, quoteToken, 'amm'); if (!poolAddr) { throw fastify.httpErrors.notFound(`Pool not found for ${baseToken}-${quoteToken}`); @@ -74,70 +74,71 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { 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); - // Determine which token corresponds to which asset in the pool - const baseAssetId = baseTokenObj.address || `${baseTokenObj.policyId}.${baseTokenObj.assetName}`; - const quoteAssetId = quoteTokenObj.address || `${quoteTokenObj.policyId}.${quoteTokenObj.assetName}`; - - let baseReserve: bigint; - let quoteReserve: bigint; + // Map input/output tokens to pool reserves + let inputReserve: bigint; + let outputReserve: bigint; - // Match tokens to pool reserves - if (baseAssetId.trim() === assetA) { - baseReserve = reserveA; - quoteReserve = reserveB; - } else if (baseAssetId.trim() === assetB) { - baseReserve = reserveB; - quoteReserve = reserveA; + if (inputAssetId === assetA) { + inputReserve = reserveA; + outputReserve = reserveB; + } else if (inputAssetId === assetB) { + inputReserve = reserveB; + outputReserve = reserveA; } else { - throw fastify.httpErrors.badRequest(`Base token ${baseAssetId} not found in pool`); + throw fastify.httpErrors.badRequest(`Input token ${inputAssetId} not found in pool`); } - // Validate quote token is in the pool - const quoteInPool = quoteAssetId.trim() === assetA || quoteAssetId.trim() === assetB; - if (!quoteInPool) { - throw fastify.httpErrors.badRequest(`Quote token ${quoteAssetId} 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 to smallest units and calculate swap amounts + // 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; - let inputTokenObj: CardanoToken; - let outputTokenObj: CardanoToken; - if (side === 'SELL') { - // SELL: spending `amount` of quoteToken, receiving baseToken - inputTokenObj = quoteTokenObj; - outputTokenObj = baseTokenObj; - inputAmount = BigInt(Math.floor(amount * 10 ** quoteTokenObj.decimals)); + if (exactIn) { + // SELL: spending exact amount of baseToken + inputAmount = BigInt(Math.floor(amount * 10 ** baseTokenObj.decimals)); - // Apply AMM formula for sell (exactIn): dy = (y * dx * (1 - fee)) / (x + dx * (1 - fee)) + // Apply AMM formula: dy = (y * dx * (1 - fee)) / (x + dx * (1 - fee)) const inputAfterFee = (inputAmount * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; - outputAmount = (baseReserve * inputAfterFee) / (quoteReserve + inputAfterFee); + outputAmount = (outputReserve * inputAfterFee) / (inputReserve + inputAfterFee); } else { - // BUY: wanting to receive `amount` of quoteToken, paying baseToken - inputTokenObj = baseTokenObj; - outputTokenObj = quoteTokenObj; - outputAmount = BigInt(Math.floor(amount * 10 ** quoteTokenObj.decimals)); + // BUY: wanting to receive exact amount of baseToken + outputAmount = BigInt(Math.floor(amount * 10 ** baseTokenObj.decimals)); - // Check if we have enough liquidity - if (outputAmount >= quoteReserve) { + // Check liquidity + if (outputAmount >= outputReserve) { throw fastify.httpErrors.badRequest('Insufficient liquidity: requested amount exceeds available reserves'); } - // Apply AMM formula for buy (exactOut): dx = (x * dy) / ((y - dy) * (1 - fee)) - const numerator = baseReserve * outputAmount; - const denominator = ((quoteReserve - outputAmount) * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; + // 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 + // Prepare asset metadata for the input token with correct format const asset: IAssetAmountMetadata = inputTokenObj.symbol === 'ADA' ? { @@ -145,7 +146,7 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { decimals: 6, } : { - assetId: inputTokenObj.address || `${inputTokenObj.policyId}.${inputTokenObj.assetName}`, + assetId: `${inputTokenObj.policyId}.${inputTokenObj.assetName}`, decimals: inputTokenObj.decimals, }; @@ -173,32 +174,20 @@ export const executeSwapRoute: FastifyPluginAsync = async (fastify) => { const txHash = await submit(); - // Format response values - convert back to human readable amounts + // Format response values const inputAmountHuman = Number(inputAmount) / 10 ** inputTokenObj.decimals; const outputAmountHuman = Number(outputAmount) / 10 ** outputTokenObj.decimals; - // Calculate balance changes correctly - let baseTokenBalanceChange: number; - let quoteTokenBalanceChange: number; - - if (side === 'BUY') { - // BUY: spending baseToken to get quoteToken - // baseToken decreases (negative), quoteToken increases (positive) - baseTokenBalanceChange = -inputAmountHuman; // spending baseToken - quoteTokenBalanceChange = outputAmountHuman; // receiving quoteToken - } else { - // SELL: spending quoteToken to get baseToken - // quoteToken decreases (negative), baseToken increases (positive) - quoteTokenBalanceChange = -inputAmountHuman; // spending quoteToken - baseTokenBalanceChange = outputAmountHuman; // receiving baseToken - } + // Balance changes + const baseTokenBalanceChange = side === 'BUY' ? outputAmountHuman : -inputAmountHuman; + const quoteTokenBalanceChange = side === 'BUY' ? -inputAmountHuman : outputAmountHuman; return { signature: txHash, - status: 1, // 1 = CONFIRMED, 0 = PENDING, -1 = FAILED + status: 1, data: { - tokenIn: side === 'SELL' ? quoteToken : baseToken, - tokenOut: side === 'SELL' ? baseToken : quoteToken, + tokenIn: side === 'SELL' ? baseToken : quoteToken, + tokenOut: side === 'SELL' ? quoteToken : baseToken, amountIn: inputAmountHuman, amountOut: outputAmountHuman, fee: builtTx.builtTx.fee, diff --git a/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts b/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts index 3317d9d8a1..56d21d6e0c 100644 --- a/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/quoteLiquidity.ts @@ -60,25 +60,51 @@ export async function getSundaeswapAmmLiquidityQuote( let quoteTokenAmountOptimal = quoteTokenAmount!; let baseLimited = false; let poolState: IPoolData; + if (existingPool) { - // Get pool state from Sundaeswap (adjust method name based on their SDK) poolState = await sundaeswap.getPoolData(poolAddressToUse); + if (!poolState) { throw new Error(`Unable to load pool ${poolAddressToUse}`); } - // ── 2) Pull reserves as bigints ──────────────────────── - // Adjust property names based on Sundaeswap's pool structure - const baseReserve: bigint = poolState.liquidity.aReserve || BigInt(0); - const quoteReserve: bigint = poolState.liquidity.bReserve || BigInt(0); + // 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`); + } - // ── 3) Convert user inputs into raw bigints ─────────── + // 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; - // ── 4) Compute the "optimal" opposite amount ─────────── + // Compute the "optimal" opposite amount if (baseRaw !== null && quoteRaw !== null) { // both sides provided → pick the limiting one const quoteOptimal = (baseRaw * quoteReserve) / baseReserve; @@ -109,9 +135,8 @@ export async function getSundaeswapAmmLiquidityQuote( baseLimited = false; // arbitrary; both get used } - // ── 5) Convert back into Ethers BigNumber for any on‐chain tx ─── + // Convert back to raw amounts const rawBaseTokenAmount = Math.floor(baseTokenAmountOptimal * 10 ** baseToken.decimals).toString(); - const rawQuoteTokenAmount = Math.floor(quoteTokenAmountOptimal * 10 ** quoteToken.decimals).toString(); return { @@ -145,10 +170,7 @@ export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { properties: { ...QuoteLiquidityRequest.properties, network: { type: 'string', default: 'mainnet' }, - poolAddress: { - type: 'string', - examples: [''], - }, + poolAddress: { type: 'string', examples: [''] }, baseToken: { type: 'string', examples: ['ADA'] }, quoteToken: { type: 'string', examples: ['SUNDAE'] }, baseTokenAmount: { type: 'number', examples: [0.029314] }, @@ -156,9 +178,7 @@ export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { slippagePct: { type: 'number', examples: [1] }, }, }, - response: { - 200: QuoteLiquidityResponse, - }, + response: { 200: QuoteLiquidityResponse }, }, }, async (request) => { @@ -167,7 +187,6 @@ export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { const sundaeswap = await Sundaeswap.getInstance(network); - // Check if poolAddress is provided if (!poolAddress) { throw fastify.httpErrors.badRequest('poolAddress must be provided'); } @@ -175,20 +194,11 @@ export const quoteLiquidityRoute: FastifyPluginAsync = async (fastify) => { const poolInfo = await sundaeswap.getAmmPoolInfo(poolAddress); const baseTokenAddress = poolInfo.baseTokenAddress; - // console.log('baseTokenAddress ', baseTokenAddress); - const quoteTokenAddress = poolInfo.quoteTokenAddress; - // console.log('quoteTokenAddress ', quoteTokenAddress); - // Find token symbol from token address const baseToken = await sundaeswap.cardano.getTokenByAddress(baseTokenAddress); - - // console.log('baseToken ', baseToken); - const quoteToken = await sundaeswap.cardano.getTokenByAddress(quoteTokenAddress); - // console.log('quoteToken ', quoteToken); - const quote = await getSundaeswapAmmLiquidityQuote( network, poolAddress, diff --git a/src/connectors/sundaeswap/amm-routes/quoteSwap.ts b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts index 036770728f..acc2b89220 100644 --- a/src/connectors/sundaeswap/amm-routes/quoteSwap.ts +++ b/src/connectors/sundaeswap/amm-routes/quoteSwap.ts @@ -18,12 +18,13 @@ export async function quoteAmmSwap( poolIdent: string, baseToken: CardanoToken, quoteToken: CardanoToken, - amount: number, // now always refers to quote‐token units + amount: number, // now always refers to BASE token units side: 'BUY' | 'SELL', - slippagePct: number = 1, // Default to 1% if not provided + slippagePct: number = 1, ): Promise { - // BUY: you want to RECEIVE `amount` of quoteToken, paying baseToken - // SELL: you want to SPEND `amount` of quoteToken, receiving baseToken + // 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 @@ -32,83 +33,76 @@ export async function quoteAmmSwap( const reserveA = BigInt(poolData.liquidity.aReserve); const reserveB = BigInt(poolData.liquidity.bReserve); - // Determine which token corresponds to which asset in the pool - const baseAssetId = baseToken.address || `${baseToken.policyId}.${baseToken.assetName}`; - const quoteAssetId = quoteToken.address || `${quoteToken.policyId}.${quoteToken.assetName}`; + const exactIn = side === 'SELL'; + const [inputToken, outputToken] = exactIn ? [baseToken, quoteToken] : [quoteToken, baseToken]; - let baseReserve: bigint; - let quoteReserve: bigint; + // Map input/output tokens to pool reserves + const inputAssetId = inputToken.address || `${inputToken.policyId}.${inputToken.assetName}`; + const outputAssetId = outputToken.address || `${outputToken.policyId}.${outputToken.assetName}`; - // Match tokens to pool reserves - if (baseAssetId.trim() === assetA) { - baseReserve = reserveA; - quoteReserve = reserveB; - } else if (baseAssetId.trim() === assetB) { - baseReserve = reserveB; - quoteReserve = reserveA; + 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(`Base token ${baseAssetId} not found in pool`); + throw new Error(`Input token ${inputAssetId} not found in pool`); } - // Validate quote token is in the pool - const quoteInPool = quoteAssetId.trim() === assetA || quoteAssetId.trim() === assetB; - if (!quoteInPool) { - throw new Error(`Quote token ${quoteAssetId} 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 to smallest units + // Convert amount using BASE token decimals const fee = poolData.currentFee; // e.g., 0.005 for 0.5% let inputAmount: bigint; let outputAmount: bigint; - if (side === 'SELL') { - // SELL: spending `amount` of quoteToken, receiving baseToken - // This is exactIn scenario - inputAmount = BigInt(Math.floor(amount * 10 ** quoteToken.decimals)); + if (exactIn) { + // SELL: spending exact amount of baseToken + inputAmount = BigInt(Math.floor(amount * 10 ** baseToken.decimals)); - // Apply AMM formula for sell (exactIn): dy = (y * dx * (1 - fee)) / (x + dx * (1 - fee)) + // Apply AMM formula: dy = (y * dx * (1 - fee)) / (x + dx * (1 - fee)) const inputAfterFee = (inputAmount * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; - outputAmount = (baseReserve * inputAfterFee) / (quoteReserve + inputAfterFee); + outputAmount = (outputReserve * inputAfterFee) / (inputReserve + inputAfterFee); } else { - // BUY: wanting to receive `amount` of quoteToken, paying baseToken - // This is exactOut scenario - outputAmount = BigInt(Math.floor(amount * 10 ** quoteToken.decimals)); + // BUY: wanting to receive exact amount of baseToken + outputAmount = BigInt(Math.floor(amount * 10 ** baseToken.decimals)); - // Check if we have enough liquidity - if (outputAmount >= quoteReserve) { + // Check liquidity + if (outputAmount >= outputReserve) { throw new Error('Insufficient liquidity: requested amount exceeds available reserves'); } - // Apply AMM formula for buy (exactOut): dx = (x * dy) / ((y - dy) * (1 - fee)) - const numerator = baseReserve * outputAmount; - const denominator = ((quoteReserve - outputAmount) * BigInt(Math.floor((1 - fee) * 10000))) / 10000n; + // 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 amounts + // Calculate slippage protection const slippageTolerance = slippagePct / 100; const slippageMultiplier = BigInt(Math.floor((1 - slippageTolerance) * 10000)); const slippageDenominator = 10000n; - const minAmountOut = side === 'SELL' ? (outputAmount * slippageMultiplier) / slippageDenominator : outputAmount; - - const maxAmountIn = - side === 'BUY' - ? (inputAmount * (slippageDenominator + BigInt(Math.floor(slippageTolerance * 10000)))) / slippageDenominator - : inputAmount; + 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(baseReserve) / 10 ** baseToken.decimals / (Number(quoteReserve) / 10 ** quoteToken.decimals); - + const midPrice = + Number(inputReserve) / 10 ** inputToken.decimals / (Number(outputReserve) / 10 ** outputToken.decimals); const executionPrice = - Number(inputAmount) / 10 ** baseToken.decimals / (Number(outputAmount) / 10 ** quoteToken.decimals); - + Number(inputAmount) / 10 ** inputToken.decimals / (Number(outputAmount) / 10 ** outputToken.decimals); const priceImpact = Math.abs((executionPrice - midPrice) / midPrice); - // Determine which token is input and output based on side - const inputToken = side === 'SELL' ? quoteToken : baseToken; - const outputToken = side === 'SELL' ? baseToken : quoteToken; - // Convert amounts to human-readable format const estimatedIn = formatTokenAmount(inputAmount, inputToken.decimals); const estimatedOut = formatTokenAmount(outputAmount, outputToken.decimals); @@ -129,13 +123,77 @@ export async function quoteAmmSwap( rawMinAmountOut: minAmountOut.toString(), rawMaxAmountIn: maxAmountIn.toString(), slippagePct, - pathAddresses: [ - inputToken.address || `${inputToken.policyId}.${inputToken.assetName}`, - outputToken.address || `${outputToken.policyId}.${outputToken.assetName}`, - ], + 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, @@ -198,89 +256,6 @@ export async function getSundaeswapAmmQuote( }; } -// Fixed formatSwapQuote function with corrected balance changes -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 { - // Use the extracted quote function with slippage percentage - 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}`, - ); - - // 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 { - // - poolAddress: poolIdent, - tokenIn: quoteTokenObj.symbol, - tokenOut: baseTokenObj.symbol, - amountIn: quote.estimatedAmountIn, - amountOut: quote.estimatedAmountOut, - price: price, - minAmountOut: quote.minAmountOut, - maxAmountIn: quote.maxAmountIn, - slippagePct: quote.slippagePct, - priceImpactPct: quote.priceImpactPct, - }; - } 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')); @@ -299,10 +274,10 @@ export const quoteSwapRoute: FastifyPluginAsync = async (fastify) => { properties: { ...QuoteSwapRequest.properties, network: { type: 'string', default: 'mainnet' }, - baseToken: { type: 'string', examples: ['ADA'] }, - quoteToken: { type: 'string', examples: ['SUNDAE'] }, - amount: { type: 'number', examples: [0.001] }, - side: { type: 'string', enum: ['BUY', 'SELL'], examples: ['SELL'] }, + 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] }, }, }, diff --git a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts index b8a046183d..4d06499471 100644 --- a/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts +++ b/src/connectors/sundaeswap/amm-routes/removeLiquidity.ts @@ -29,18 +29,13 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { ...RemoveLiquidityRequest.properties, network: { type: 'string', default: 'mainnet' }, walletAddress: { type: 'string', examples: [''] }, - poolAddress: { - 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, - }, + response: { 200: RemoveLiquidityResponse }, }, }, async (request) => { @@ -54,7 +49,6 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const networkToUse = network || 'mainnet'; - // Validate essential parameters if (!percentageToRemove) { throw fastify.httpErrors.badRequest('Missing required parameters'); } @@ -63,10 +57,8 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { throw fastify.httpErrors.badRequest('Percentage to remove must be between 0 and 100'); } - // Get Sundaeswap and Cardano instances const sundaeswap = await Sundaeswap.getInstance(networkToUse); - // Get wallet address - either from request or first available let walletAddress = requestedWalletAddress; if (!walletAddress) { walletAddress = await sundaeswap.cardano.getFirstWalletAddress(); @@ -76,7 +68,6 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { logger.info(`Using first available wallet address: ${walletAddress}`); } - // Check if poolAddress is provided if (!requestedPoolAddress) { throw fastify.httpErrors.badRequest('poolAddress must be provided'); } @@ -85,21 +76,19 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { const baseTokenAddress = poolInfo.baseTokenAddress; const quoteTokenAddress = poolInfo.quoteTokenAddress; - // Find token symbol from token address + 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 ? baseToken : quoteToken}`); + throw fastify.httpErrors.badRequest(`Token not found: ${!baseToken ? 'base' : 'quote'}`); } - // Find pool address if not provided 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}-${quoteToken}`); + throw fastify.httpErrors.notFound(`No AMM pool found for pair ${baseToken.symbol}-${quoteToken.symbol}`); } } @@ -108,16 +97,14 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { sundaeswap.cardano.lucidInstance.selectWalletFromPrivateKey(wallet); const utxos = await sundaeswap.cardano.lucidInstance.utxosAt(walletAddress); - // 8) Calculate withdrawal amounts + // Calculate withdrawal amounts const totalLpInWallet = sundaeswap.calculateAssetAmount(utxos, poolData.assetLP); - - // Calculate how much LP token will be withdrawn based on the percentage const withdrawalAmount = BigInt((BigInt(totalLpInWallet) * BigInt(percentageToRemove)) / BigInt(100)); // Define the LP Token to withdraw - const lpTokenAmount = new AssetAmount(withdrawalAmount, poolData.assetLP); // Specify LP token amount + const lpTokenAmount = new AssetAmount(withdrawalAmount, poolData.assetLP); - // Build withdraw arguments (Added `pool` property) + // Build withdraw arguments const withdrawArgs: IWithdrawConfigArgs = { suppliedLPAsset: lpTokenAmount, pool: poolData, @@ -142,33 +129,52 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { // Build the transaction const builtTx = await result.build(); - // Sign and submit the transaction const { submit, cbor } = await builtTx.sign(); const txHash = await submit(); - // Calculate the proportional amounts that will be received - const totalLpSupply = poolData.liquidity.lpTotal; // Total LP token supply - const lpTokensToWithdraw = withdrawalAmount; // Amount of LP tokens being withdrawn + // 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); - // Get current pool reserves - const baseTokenReserve = poolData.liquidity.aReserve; // Base token reserve in the pool - const quoteTokenReserve = poolData.liquidity.bReserve; // Quote token reserve in the pool + // 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 the amounts that will be received (proportional to LP tokens withdrawn) - const baseTokenAmountRemoved = Math.floor( - (Number(baseTokenReserve) * withdrawalProportion) / baseToken.decimals, - ); + // Calculate correct withdrawal amounts with proper decimals + const baseTokenAmountRaw = Number(baseTokenReserve) * withdrawalProportion; + const quoteTokenAmountRaw = Number(quoteTokenReserve) * withdrawalProportion; - const quoteTokenAmountRemoved = Math.floor( - (Number(quoteTokenReserve) * withdrawalProportion) / quoteToken.decimals, - ); + const baseTokenAmountRemoved = baseTokenAmountRaw / Math.pow(10, baseToken.decimals); + const quoteTokenAmountRemoved = quoteTokenAmountRaw / Math.pow(10, quoteToken.decimals); return { signature: txHash, - status: 1, // 1 = CONFIRMED, 0 = PENDING, -1 = FAILED + status: 1, data: { fee: builtTx.builtTx.fee, baseTokenAmountRemoved, @@ -180,7 +186,6 @@ export const removeLiquidityRoute: FastifyPluginAsync = async (fastify) => { if (e.statusCode) { throw e; } - throw fastify.httpErrors.internalServerError('Failed to remove liquidity'); } },