diff --git a/debridge_node/Dockerfile b/debridge_node/Dockerfile index dfec031..938ac42 100644 --- a/debridge_node/Dockerfile +++ b/debridge_node/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22.14.0 as builder +FROM node:22.15.1 as builder RUN apt-get update && apt-get install build-essential WORKDIR /build @@ -15,7 +15,7 @@ COPY src /build/src RUN mkdir stats RUN npm run build -FROM node:22.14.0-alpine +FROM node:22.15.1-alpine WORKDIR /app COPY --from=builder /build/dist /app/dist COPY --from=builder /build/node_modules /app/node_modules diff --git a/debridge_node/package-lock.json b/debridge_node/package-lock.json index 7bb39bb..d8e38ad 100644 --- a/debridge_node/package-lock.json +++ b/debridge_node/package-lock.json @@ -9,59 +9,59 @@ "version": "2.8.0", "license": "BUSL-1.1", "dependencies": { - "@ardrive/turbo-sdk": "1.23.0", + "@ardrive/turbo-sdk": "1.25.0", "@debridge-finance/solana-grpc": "1.1.3", "@debridge-finance/solana-utils": "4.5.5", "@fastify/static": "8.1.1", "@nestjs/axios": "4.0.0", - "@nestjs/common": "11.0.11", - "@nestjs/config": "4.0.1", - "@nestjs/core": "11.0.11", + "@nestjs/common": "11.1.1", + "@nestjs/config": "4.0.2", + "@nestjs/core": "11.1.1", "@nestjs/jwt": "11.0.0", "@nestjs/passport": "11.0.5", - "@nestjs/platform-fastify": "11.0.11", + "@nestjs/platform-fastify": "11.1.1", "@nestjs/schedule": "5.0.1", - "@nestjs/swagger": "11.0.6", + "@nestjs/swagger": "11.2.0", "@nestjs/throttler": "6.4.0", "@nestjs/typeorm": "11.0.0", - "@sentry/node": "7.119.0", - "@solana/web3.js": "1.98.0", + "@sentry/node": "8.55.0", + "@solana/web3.js": "1.98.2", "arbundles": "0.11.2", "class-transformer": "0.5.1", - "class-validator": "0.14.1", - "dotenv": "16.4.7", + "class-validator": "0.14.2", + "dotenv": "16.5.0", "passport": "0.7.0", "passport-jwt": "4.0.1", - "pg": "8.14.1", + "pg": "8.16.0", "reflect-metadata": "0.1.14", - "rxjs": "7.8.1", - "typeorm": "0.3.21", + "rxjs": "7.8.2", + "typeorm": "0.3.24", "web3": "1.10.4", "web3-eth-contract": "1.10.4" }, "devDependencies": { - "@nestjs/cli": "11.0.5", - "@nestjs/schematics": "11.0.2", - "@nestjs/testing": "11.0.11", + "@nestjs/cli": "11.0.7", + "@nestjs/schematics": "11.0.5", + "@nestjs/testing": "11.1.1", "@types/cron": "2.4.3", "@types/jest": "29.5.14", - "@types/node": "22.13.10", + "@types/node": "22.15.18", "@types/passport-jwt": "4.0.1", - "@types/pg": "8.11.11", + "@types/pg": "8.15.2", "@types/supertest": "2.0.16", - "@typescript-eslint/eslint-plugin": "7.18.0", - "@typescript-eslint/parser": "7.18.0", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "eslint": "8.57.1", "eslint-config-prettier": "9.1.0", - "eslint-plugin-prettier": "5.2.3", + "eslint-plugin-prettier": "5.4.0", "jest": "29.7.0", "prettier": "3.5.3", "supertest": "6.3.4", - "ts-jest": "29.2.6", + "ts-jest": "29.3.4", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "typescript": "5.8.2" + "typescript": "5.8.3" } }, "node_modules/@adraffy/ens-normalize": { @@ -85,9 +85,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.8.tgz", - "integrity": "sha512-j1zHKvOsGwu5YwAZGuzi835R9vcW7PkfxmSRIJeVl+vawgk31K3zFb4UPH8AY/NPWYqXIAnwpka3HC1+JrWLWA==", + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.6.tgz", + "integrity": "sha512-WFgiYhrDMq83UNaGRAneIM7CYYdBozD+yYA9BjoU8AgBLKtrvn6S8ZcjKAk5heoHtY/u8pEb0mwDTz9gxFmJZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -112,14 +112,24 @@ } } }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.8.tgz", - "integrity": "sha512-2JGUMD3zjfY8G4RYpypm2/1YEO+O4DtFycUvptIpsBYyULgnEbJ3tlp2oRiXI2vp9tC8IyWqa/swlA8DTI6ZYQ==", + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.6.tgz", + "integrity": "sha512-YTAxNnT++5eflx19OUHmOWu597/TbTel+QARiZCv1xQw99+X8DCKKOUXtqBRd53CAHlREDI33Rn/JLY3NYgMLQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.8", + "@angular-devkit/core": "19.2.6", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -132,15 +142,15 @@ } }, "node_modules/@angular-devkit/schematics-cli": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-19.1.8.tgz", - "integrity": "sha512-sHblN9EuiJgKwJVYc+nhpU+GlVkAJHJc7lBR8YSoaugNGcCMkWn4f7rJnJDywL/CEOHBICnyWZKfTCMsMyg1Cw==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-19.2.8.tgz", + "integrity": "sha512-RFnlyu4Ld8I4xvu/eqrhjbQ6kQTr27w79omMiTbQcQZvP3E6oUyZdBjobyih4Np+1VVQrbdEeNz76daP2iUDig==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.8", - "@angular-devkit/schematics": "19.1.8", - "@inquirer/prompts": "7.2.1", + "@angular-devkit/core": "19.2.8", + "@angular-devkit/schematics": "19.2.8", + "@inquirer/prompts": "7.3.2", "ansi-colors": "4.1.3", "symbol-observable": "4.0.0", "yargs-parser": "21.1.1" @@ -154,35 +164,107 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/schematics-cli/node_modules/@angular-devkit/core": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.8.tgz", + "integrity": "sha512-kcxUHKf5Hi98r4gAvMP3ntJV8wuQ3/i6wuU9RcMP0UKUt2Rer5Ryis3MPqT92jvVVwg6lhrLIhXsFuWJMiYjXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/@angular-devkit/schematics": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.8.tgz", + "integrity": "sha512-QsmFuYdAyeCyg9WF/AJBhFXDUfCwmDFTEbsv5t5KPSP6slhk0GoLNZApniiFytU2siRlSxVNpve2uATyYuAYkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.8", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, "node_modules/@angular-devkit/schematics-cli/node_modules/@inquirer/prompts": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", - "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.0.4", - "@inquirer/confirm": "^5.1.1", - "@inquirer/editor": "^4.2.1", - "@inquirer/expand": "^4.0.4", - "@inquirer/input": "^4.1.1", - "@inquirer/number": "^3.0.4", - "@inquirer/password": "^4.0.4", - "@inquirer/rawlist": "^4.0.4", - "@inquirer/search": "^3.0.4", - "@inquirer/select": "^4.0.4" + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, "node_modules/@ardrive/turbo-sdk": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/@ardrive/turbo-sdk/-/turbo-sdk-1.23.0.tgz", - "integrity": "sha512-KDOlELOWXotErjGIBCSYMONpyqtBtp8r9VlWILHASmRHFZcLMlMx1T5/NLgFsw7o5o3kbzNwynN3/E5LsgYc4A==", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/@ardrive/turbo-sdk/-/turbo-sdk-1.25.0.tgz", + "integrity": "sha512-hhZJTVCr4b2sXrqPrA6NPzd1aqXCnR6ZT/PvbTy7juFmpbEl93KRiyZCh8BdYdj1dOULRLspiQ1dqM54B/KZvA==", "license": "Apache-2.0", "dependencies": { "@cosmjs/amino": "^0.32.4", @@ -191,12 +273,14 @@ "@cosmjs/proto-signing": "^0.32.4", "@dha-team/arbundles": "^1.0.1", "@ethersproject/signing-key": "^5.7.0", - "@kyvejs/sdk": "^1.3.3", + "@kyvejs/sdk": "^1.4.5", + "@permaweb/aoconnect": "0.0.57", "@solana/web3.js": "^1.91.7", "arweave": "^1.15.1", "axios": "1.4.0", "axios-retry": "^3.7.0", "bignumber.js": "^9.1.2", + "bitcoinjs-lib": "^6.1.7", "bs58": "^5.0.0", "commander": "^12.1.0", "ethers": "^6.12.0", @@ -292,14 +376,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", - "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -309,13 +393,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.5", + "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -408,27 +492,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.10" + "@babel/types": "^7.27.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -677,9 +761,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", - "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -689,32 +773,32 @@ } }, "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", - "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -733,9 +817,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "dev": true, "license": "MIT", "dependencies": { @@ -754,9 +838,9 @@ "license": "MIT" }, "node_modules/@bufbuild/protobuf": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.4.tgz", - "integrity": "sha512-P9xQgtMh71TA7tHTnbDe68zcI+TPnkyyfBIhGaUr4iUEIXN7yI01DyjmmdEwXTk5OlISBJYkoxCVj2dwmHqIkA==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.5.tgz", + "integrity": "sha512-/g5EzJifw5GF8aren8wZ/G5oMuPoGeS6MQD3ca8ddcvdXR5UELUfdTZITCGNhNXynY/AYl3Z4plmxdj/tRl/hQ==", "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@colors/colors": { @@ -1211,9 +1295,9 @@ } }, "node_modules/@dha-team/arbundles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@dha-team/arbundles/-/arbundles-1.0.1.tgz", - "integrity": "sha512-cgVxhZJLK1HG2+vcRBZ0CYGpxz7mA2QvLaspcw2gOzb2V/ZUxlifUu1aufBK3iz63Ww2OhgO0j9DstRJqrG1uA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@dha-team/arbundles/-/arbundles-1.0.3.tgz", + "integrity": "sha512-/XelOo5V/1o1M8VchCQ+F7N5kxwirWh5jD5zg1KECaV80Qld6aKBSgG19VLlBsRUXbRUfjM+LDRPJm9Hjfmycg==", "license": "Apache-2.0", "dependencies": { "@ethersproject/bytes": "^5.7.0", @@ -1223,7 +1307,7 @@ "@ethersproject/transactions": "^5.7.0", "@ethersproject/wallet": "^5.7.0", "@noble/ed25519": "^1.6.1", - "arweave": "^1.15.1", + "arweave": "^1.15.7", "base64url": "^3.0.1", "bs58": "^4.0.1", "keccak": "^3.0.2", @@ -1256,9 +1340,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "license": "MIT", "dependencies": { @@ -2077,10 +2161,19 @@ "fast-uri": "^3.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/@fastify/cors": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-11.0.0.tgz", - "integrity": "sha512-41Bx0LVGr2a6DnnhDN/SgfDlTRNZtEs8niPxyoymV6Hw09AIdz/9Rn/0Fpu+pBOs6kviwS44JY2mB8NcU2qSAA==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-11.0.1.tgz", + "integrity": "sha512-dmZaE7M1f4SM8ZZuk5RhSsDJ+ezTgI7v3HHRj8Ow9CneczsPLZV6+2j2uwdaSLn8zhTv6QV0F4ZRcqdalGx1pQ==", "funding": [ { "type": "github", @@ -2094,7 +2187,7 @@ "license": "MIT", "dependencies": { "fastify-plugin": "^5.0.0", - "mnemonist": "0.40.0" + "toad-cache": "^3.7.0" } }, "node_modules/@fastify/error": { @@ -2114,9 +2207,9 @@ "license": "MIT" }, "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.2.tgz", - "integrity": "sha512-YdR7gqlLg1xZAQa+SX4sMNzQHY5pC54fu9oC5aYSUqBhyn6fkLkrdtKlpVdCNPlwuUuXA1PjFTEmvMF6ZVXVGw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", + "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==", "funding": [ { "type": "github", @@ -2350,15 +2443,15 @@ "license": "BSD-3-Clause" }, "node_modules/@inquirer/checkbox": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.4.tgz", - "integrity": "sha512-d30576EZdApjAMceijXA5jDzRQHT/MygbC+J8I7EqA6f/FRpYxlRtRJbHF8gHeWYeSdOuTEJqonn7QLB1ELezA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.5.tgz", + "integrity": "sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.9", + "@inquirer/core": "^10.1.10", "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.5", + "@inquirer/type": "^3.0.6", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -2375,14 +2468,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.8.tgz", - "integrity": "sha512-dNLWCYZvXDjO3rnQfk2iuJNL4Ivwz/T2+C3+WnNfJKsNGSuOs3wAo2F6e0p946gtSAk31nZMfW+MRmYaplPKsg==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.9.tgz", + "integrity": "sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5" + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" }, "engines": { "node": ">=18" @@ -2397,14 +2490,14 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.9.tgz", - "integrity": "sha512-sXhVB8n20NYkUBfDYgizGHlpRVaCRjtuzNZA6xpALIUbkgfd2Hjz+DfEN6+h1BRnuxw0/P4jCIMjMsEOAMwAJw==", + "version": "10.1.10", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.10.tgz", + "integrity": "sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.5", + "@inquirer/type": "^3.0.6", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", @@ -2425,14 +2518,14 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.9.tgz", - "integrity": "sha512-8HjOppAxO7O4wV1ETUlJFg6NDjp/W2NP5FB9ZPAcinAlNT4ZIWOLe2pUVwmmPRSV0NMdI5r/+lflN55AwZOKSw==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.10.tgz", + "integrity": "sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5", + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", "external-editor": "^3.1.0" }, "engines": { @@ -2448,14 +2541,14 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.11.tgz", - "integrity": "sha512-OZSUW4hFMW2TYvX/Sv+NnOZgO8CHT2TU1roUCUIF2T+wfw60XFRRp9MRUPCT06cRnKL+aemt2YmTWwt7rOrNEA==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.12.tgz", + "integrity": "sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5", + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -2481,14 +2574,14 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.8.tgz", - "integrity": "sha512-WXJI16oOZ3/LiENCAxe8joniNp8MQxF6Wi5V+EBbVA0ZIOpFcL4I9e7f7cXse0HJeIPCWO8Lcgnk98juItCi7Q==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.9.tgz", + "integrity": "sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5" + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" }, "engines": { "node": ">=18" @@ -2503,14 +2596,14 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.11.tgz", - "integrity": "sha512-pQK68CsKOgwvU2eA53AG/4npRTH2pvs/pZ2bFvzpBhrznh8Mcwt19c+nMO7LHRr3Vreu1KPhNBF3vQAKrjIulw==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.12.tgz", + "integrity": "sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5" + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" }, "engines": { "node": ">=18" @@ -2525,14 +2618,14 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.11.tgz", - "integrity": "sha512-dH6zLdv+HEv1nBs96Case6eppkRggMe8LoOTl30+Gq5Wf27AO/vHFgStTVz4aoevLdNXqwE23++IXGw4eiOXTg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.12.tgz", + "integrity": "sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5", + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", "ansi-escapes": "^4.3.2" }, "engines": { @@ -2548,22 +2641,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", - "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.4.1.tgz", + "integrity": "sha512-UlmM5FVOZF0gpoe1PT/jN4vk8JmpIWBlMvTL8M+hlvPmzN89K6z03+IFmyeu/oFCenwdwHDr2gky7nIGSEVvlA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.1.2", - "@inquirer/confirm": "^5.1.6", - "@inquirer/editor": "^4.2.7", - "@inquirer/expand": "^4.0.9", - "@inquirer/input": "^4.1.6", - "@inquirer/number": "^3.0.9", - "@inquirer/password": "^4.0.9", - "@inquirer/rawlist": "^4.0.9", - "@inquirer/search": "^3.0.9", - "@inquirer/select": "^4.0.9" + "@inquirer/checkbox": "^4.1.5", + "@inquirer/confirm": "^5.1.9", + "@inquirer/editor": "^4.2.10", + "@inquirer/expand": "^4.0.12", + "@inquirer/input": "^4.1.9", + "@inquirer/number": "^3.0.12", + "@inquirer/password": "^4.0.12", + "@inquirer/rawlist": "^4.0.12", + "@inquirer/search": "^3.0.12", + "@inquirer/select": "^4.1.1" }, "engines": { "node": ">=18" @@ -2578,14 +2671,14 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.11.tgz", - "integrity": "sha512-uAYtTx0IF/PqUAvsRrF3xvnxJV516wmR6YVONOmCWJbbt87HcDHLfL9wmBQFbNJRv5kCjdYKrZcavDkH3sVJPg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.12.tgz", + "integrity": "sha512-wNPJZy8Oc7RyGISPxp9/MpTOqX8lr0r+lCCWm7hQra+MDtYRgINv1hxw7R+vKP71Bu/3LszabxOodfV/uTfsaA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5", + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -2601,15 +2694,15 @@ } }, "node_modules/@inquirer/search": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.11.tgz", - "integrity": "sha512-9CWQT0ikYcg6Ls3TOa7jljsD7PgjcsYEM0bYE+Gkz+uoW9u8eaJCRHJKkucpRE5+xKtaaDbrND+nPDoxzjYyew==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.12.tgz", + "integrity": "sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.9", + "@inquirer/core": "^10.1.10", "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.5", + "@inquirer/type": "^3.0.6", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -2625,15 +2718,15 @@ } }, "node_modules/@inquirer/select": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.1.0.tgz", - "integrity": "sha512-z0a2fmgTSRN+YBuiK1ROfJ2Nvrpij5lVN3gPDkQGhavdvIVGHGW29LwYZfM/j42Ai2hUghTI/uoBuTbrJk42bA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.1.1.tgz", + "integrity": "sha512-IUXzzTKVdiVNMA+2yUvPxWsSgOG4kfX93jOM4Zb5FgujeInotv5SPIJVeXQ+fO4xu7tW8VowFhdG5JRmmCyQ1Q==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.9", + "@inquirer/core": "^10.1.10", "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.5", + "@inquirer/type": "^3.0.6", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -2650,9 +2743,9 @@ } }, "node_modules/@inquirer/type": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.5.tgz", - "integrity": "sha512-ZJpeIYYueOz/i/ONzrfof8g89kNdO2hjGuvULROo3O8rlB2CRtSseE5KeirnyE4t/thAn/EwvS/vuQeJCn+NZg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz", + "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==", "dev": true, "license": "MIT", "engines": { @@ -3561,30 +3654,30 @@ } }, "node_modules/@keplr-wallet/common": { - "version": "0.12.203", - "resolved": "https://registry.npmjs.org/@keplr-wallet/common/-/common-0.12.203.tgz", - "integrity": "sha512-Jf/+n2XTB2etj21wnBV6m90KPeSDrXF9VKKJ9xXfZoVcMiCKhScgCADE+LrDcU9vbUxlIyBG+uZYDKhZ8lLuBQ==", + "version": "0.12.220", + "resolved": "https://registry.npmjs.org/@keplr-wallet/common/-/common-0.12.220.tgz", + "integrity": "sha512-deI2Ycqxur/GFIP7PKYNLLnXW0gQNVr8vim9eqXEw37eVl17VQTpWQCFd2VEMwlOSA0zOv3q7Jkk1Mrve+A/Cw==", "license": "Apache-2.0", "dependencies": { - "@keplr-wallet/crypto": "0.12.203", - "@keplr-wallet/types": "0.12.203", + "@keplr-wallet/crypto": "0.12.220", + "@keplr-wallet/types": "0.12.220", "buffer": "^6.0.3", "delay": "^4.4.0" } }, "node_modules/@keplr-wallet/cosmos": { - "version": "0.12.203", - "resolved": "https://registry.npmjs.org/@keplr-wallet/cosmos/-/cosmos-0.12.203.tgz", - "integrity": "sha512-3+kzywLqfX5ya+Cl7CjeBvue21HNNDCVrPNXkwYGv01MZtf+WIRMFuhcm6VUzOyetBS+Tr2YyViM6juLHXEnGw==", + "version": "0.12.220", + "resolved": "https://registry.npmjs.org/@keplr-wallet/cosmos/-/cosmos-0.12.220.tgz", + "integrity": "sha512-YaZxA96YalJf7EYi3PLp6LI1R4b7gQEamReq3drK4P3W68Ij+TwrsDct2N/brF/ZCwied115gPZLjC0Yk7EHcg==", "license": "Apache-2.0", "dependencies": { "@ethersproject/address": "^5.6.0", - "@keplr-wallet/common": "0.12.203", - "@keplr-wallet/crypto": "0.12.203", - "@keplr-wallet/proto-types": "0.12.203", - "@keplr-wallet/simple-fetch": "0.12.203", - "@keplr-wallet/types": "0.12.203", - "@keplr-wallet/unit": "0.12.203", + "@keplr-wallet/common": "0.12.220", + "@keplr-wallet/crypto": "0.12.220", + "@keplr-wallet/proto-types": "0.12.220", + "@keplr-wallet/simple-fetch": "0.12.220", + "@keplr-wallet/types": "0.12.220", + "@keplr-wallet/unit": "0.12.220", "bech32": "^1.1.4", "buffer": "^6.0.3", "long": "^4.0.0", @@ -3624,9 +3717,9 @@ } }, "node_modules/@keplr-wallet/crypto": { - "version": "0.12.203", - "resolved": "https://registry.npmjs.org/@keplr-wallet/crypto/-/crypto-0.12.203.tgz", - "integrity": "sha512-Gi6sLw/g1vY6Qq+UNb+F7iuRLxRqbMafw78u016k1eJsirJACtXOXhvREiHjAYMZBrl3mvE9L5C46LDw8Bt54A==", + "version": "0.12.220", + "resolved": "https://registry.npmjs.org/@keplr-wallet/crypto/-/crypto-0.12.220.tgz", + "integrity": "sha512-46MSOuutSeR+/0H4zPV8HN7EPMtnNRxo7MKR+DcD+/z0B3uQAJFM8rscef3UKwXlyLzIDxZglK5a1S7KywkqVQ==", "license": "Apache-2.0", "dependencies": { "@noble/curves": "^1.4.2", @@ -3634,16 +3727,18 @@ "bip32": "^2.0.6", "bip39": "^3.0.3", "bs58check": "^2.1.2", - "buffer": "^6.0.3" + "buffer": "^6.0.3", + "ecpair": "^2.1.0" }, "peerDependencies": { + "bitcoinjs-lib": "^6", "starknet": "^6" } }, "node_modules/@keplr-wallet/proto-types": { - "version": "0.12.203", - "resolved": "https://registry.npmjs.org/@keplr-wallet/proto-types/-/proto-types-0.12.203.tgz", - "integrity": "sha512-oAAZFyalllqsGTdNI3JB1p09c3VDtrASHXQKNQtt58ARKzg6Y4GmekaEW6tgD4os29tIRz2qUYDemoMDVYTBeg==", + "version": "0.12.220", + "resolved": "https://registry.npmjs.org/@keplr-wallet/proto-types/-/proto-types-0.12.220.tgz", + "integrity": "sha512-ShqqoqCIIjcnSG9375C6rEyC2OLOSo2uNPjd9H4FNUnydGfxsik8eJwVxTyR+kq+N0eepWkEoIArKdTmDKO1yg==", "license": "Apache-2.0", "dependencies": { "long": "^4.0.0", @@ -3683,15 +3778,15 @@ } }, "node_modules/@keplr-wallet/simple-fetch": { - "version": "0.12.203", - "resolved": "https://registry.npmjs.org/@keplr-wallet/simple-fetch/-/simple-fetch-0.12.203.tgz", - "integrity": "sha512-IK5GKPivIFmV9JAxlvvgmjTDlyFWA8I9iNo2Fls2hsmamuqRxNQ/T+Q+e8Krcd4DtNjza3dtQFnZU/bEk87qZA==", + "version": "0.12.220", + "resolved": "https://registry.npmjs.org/@keplr-wallet/simple-fetch/-/simple-fetch-0.12.220.tgz", + "integrity": "sha512-7ZG5CGi2emqvk2Y1fc2XRxEYkicPz9xwtuAdECEgZ/DTj8TKUtP17B6PhC90x4q20ZkvLuoLa8lA9/dkD8Kadw==", "license": "Apache-2.0" }, "node_modules/@keplr-wallet/types": { - "version": "0.12.203", - "resolved": "https://registry.npmjs.org/@keplr-wallet/types/-/types-0.12.203.tgz", - "integrity": "sha512-E1UArrXZ95vZLcs3o1c8vpSm+pa97ooz8437VyZJxGVDkILpLmy6Q+ZRbj7QOzvo8li1mbwX5h4xprHYt2+DBw==", + "version": "0.12.220", + "resolved": "https://registry.npmjs.org/@keplr-wallet/types/-/types-0.12.220.tgz", + "integrity": "sha512-vQkun9eeGriMR9+eCdWmynWG6yre0DreBP6axRT8hruTYnVEVDVjRTD5A6WYyTA6Qj8Yb0yzrka3LuRMfgG15g==", "license": "Apache-2.0", "dependencies": { "long": "^4.0.0" @@ -3707,20 +3802,20 @@ "license": "Apache-2.0" }, "node_modules/@keplr-wallet/unit": { - "version": "0.12.203", - "resolved": "https://registry.npmjs.org/@keplr-wallet/unit/-/unit-0.12.203.tgz", - "integrity": "sha512-NX7uxNRBumiusDX+DvpYXbqQ+wCJeHrhZFnIVXX4uk/drqoT4gyNYIFE5OifSi9nm6kq6x7Jfz6nKZokLWwOkA==", + "version": "0.12.220", + "resolved": "https://registry.npmjs.org/@keplr-wallet/unit/-/unit-0.12.220.tgz", + "integrity": "sha512-Nf+qIrRa/bhTE5q0ag+RUck5ZGyFoKMzkPSOfA3+cjIbjpXyX0YffzZ7HsY9uc+R/HmdWE7Ek4MiDf0Wu185gw==", "license": "Apache-2.0", "dependencies": { - "@keplr-wallet/types": "0.12.203", + "@keplr-wallet/types": "0.12.220", "big-integer": "^1.6.48", "utility-types": "^3.10.0" } }, "node_modules/@kyvejs/sdk": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@kyvejs/sdk/-/sdk-1.4.4.tgz", - "integrity": "sha512-hqrHAXZ5jPGYK92RM2KuWvLT4FrKTZ4qtMNGLSJ/C69nOKBSKqOYUkOELf3yFo5aIAcrhWsa/vy7xIo+kikpMg==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@kyvejs/sdk/-/sdk-1.4.5.tgz", + "integrity": "sha512-eOrxvqAKz9xD5620awGWPc33tyhCGyi684qHQjQswVZUN5/pNNRxOet6gL0K41t0OEMaRmjpWf2oSigHam7Mgw==", "license": "MIT", "dependencies": { "@cosmjs/amino": "^0.32.4", @@ -3756,6 +3851,15 @@ "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", "license": "MIT" }, + "node_modules/@kyvejs/sdk/node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/@kyvejs/types": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@kyvejs/types/-/types-1.5.0.tgz", @@ -3803,30 +3907,30 @@ } }, "node_modules/@nestjs/cli": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.5.tgz", - "integrity": "sha512-ab/d8Ple+dMSQ4pC7RSNjhntpT8gFQQE8y/F/ilaplp7zPGpuxbayRtYbsA/wc1UkJHORDckrqFc8Jh8mrTq2A==", + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.7.tgz", + "integrity": "sha512-svrP8j1R0/lQVJ8ZI3BlDtuZxmkvVJokUJSB04sr6uibunk2wHeVDDVLZvYBUorCdGU/RHJl1IufhqUBM91vAQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.8", - "@angular-devkit/schematics": "19.1.8", - "@angular-devkit/schematics-cli": "19.1.8", - "@inquirer/prompts": "7.3.2", + "@angular-devkit/core": "19.2.8", + "@angular-devkit/schematics": "19.2.8", + "@angular-devkit/schematics-cli": "19.2.8", + "@inquirer/prompts": "7.4.1", "@nestjs/schematics": "^11.0.1", - "ansis": "3.16.0", + "ansis": "3.17.0", "chokidar": "4.0.3", "cli-table3": "0.6.5", "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "9.0.2", + "fork-ts-checker-webpack-plugin": "9.1.0", "glob": "11.0.1", "node-emoji": "1.11.0", "ora": "5.4.1", "tree-kill": "1.2.2", "tsconfig-paths": "4.2.0", "tsconfig-paths-webpack-plugin": "4.2.0", - "typescript": "5.7.3", - "webpack": "5.98.0", + "typescript": "5.8.3", + "webpack": "5.99.6", "webpack-node-externals": "3.0.0" }, "bin": { @@ -3836,7 +3940,7 @@ "node": ">= 20.11" }, "peerDependencies": { - "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0", + "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0", "@swc/core": "^1.3.62" }, "peerDependenciesMeta": { @@ -3848,6 +3952,53 @@ } } }, + "node_modules/@nestjs/cli/node_modules/@angular-devkit/core": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.8.tgz", + "integrity": "sha512-kcxUHKf5Hi98r4gAvMP3ntJV8wuQ3/i6wuU9RcMP0UKUt2Rer5Ryis3MPqT92jvVVwg6lhrLIhXsFuWJMiYjXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@nestjs/cli/node_modules/@angular-devkit/schematics": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.8.tgz", + "integrity": "sha512-QsmFuYdAyeCyg9WF/AJBhFXDUfCwmDFTEbsv5t5KPSP6slhk0GoLNZApniiFytU2siRlSxVNpve2uATyYuAYkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.8", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, "node_modules/@nestjs/cli/node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -3858,27 +4009,25 @@ "node": ">= 6" } }, - "node_modules/@nestjs/cli/node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "node_modules/@nestjs/cli/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" + "dependencies": { + "tslib": "^2.1.0" } }, "node_modules/@nestjs/common": { - "version": "11.0.11", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.0.11.tgz", - "integrity": "sha512-b3zYiho5/XGCnLa7W2hHv5ecSBR1huQrXCHu6pxd+g2HY2B7sKP5CXHMv4gHYqpIqu4ClOb7Q4tLKXMp9LyLUg==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.1.tgz", + "integrity": "sha512-crzp+1qeZ5EGL0nFTPy9NrVMAaUWewV5AwtQyv6SQ9yQPXwRl9W9hm1pt0nAtUu5QbYMbSuo7lYcF81EjM+nCA==", "license": "MIT", "dependencies": { + "file-type": "20.5.0", "iterare": "1.2.1", + "load-esm": "1.0.2", "tslib": "2.8.1", "uid": "2.0.2" }, @@ -3887,8 +4036,8 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "class-transformer": "*", - "class-validator": "*", + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, @@ -3902,9 +4051,9 @@ } }, "node_modules/@nestjs/config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.1.tgz", - "integrity": "sha512-0hr6lKS//Wf8A6VcV69ts8uD0fke6jtmmmXSxzvwAzOM/HEXEKYEp21nRU+cpYxlYqm7Khb0oTOoVuDGk+AWUw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.2.tgz", + "integrity": "sha512-McMW6EXtpc8+CwTUwFdg6h7dYcBUpH5iUILCclAsa+MbCEvC9ZKu4dCHRlJqALuhjLw97pbQu62l4+wRwGeZqA==", "license": "MIT", "dependencies": { "dotenv": "16.4.7", @@ -3916,10 +4065,22 @@ "rxjs": "^7.1.0" } }, + "node_modules/@nestjs/config/node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/@nestjs/core": { - "version": "11.0.11", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.0.11.tgz", - "integrity": "sha512-jMH3jrjrPiaGrkQ5hANNcgDWN+j+hcM5GMQ3jSs4vOWNs3lmKHTVR11wJ9y5tTNnwKydzMogeju0VTUdfXDI5Q==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.1.tgz", + "integrity": "sha512-UFoUAgLKFT+RwHTANJdr0dF7p0qS9QjkaUPjg8aafnjM/qxxxrUVDB49nVvyMlk+Hr1+vvcNaOHbWWQBxoZcHA==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -4001,16 +4162,16 @@ } }, "node_modules/@nestjs/platform-fastify": { - "version": "11.0.11", - "resolved": "https://registry.npmjs.org/@nestjs/platform-fastify/-/platform-fastify-11.0.11.tgz", - "integrity": "sha512-Ts7jMc3GE35k8KMY8m7/qtc4/Zqo4BFSXsfUy646o+JeJSkUZOSofevxkkI2smhX6w9SKJzyfEpRHzMZNs/oRA==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/platform-fastify/-/platform-fastify-11.1.1.tgz", + "integrity": "sha512-BW43nLbsJ9B//1l2qPKUMCM25t227X0ziisbzqrAkFPz+4D3wjAID6zFzwu/151zx9Rz6ACVcEDkSXEoILT+xg==", "license": "MIT", "dependencies": { - "@fastify/cors": "11.0.0", + "@fastify/cors": "11.0.1", "@fastify/formbody": "8.0.2", "@fastify/middie": "9.0.3", "fast-querystring": "1.1.2", - "fastify": "5.2.1", + "fastify": "5.3.3", "light-my-request": "6.6.0", "path-to-regexp": "8.2.0", "tslib": "2.8.1" @@ -4021,7 +4182,7 @@ }, "peerDependencies": { "@fastify/static": "^8.0.0", - "@fastify/view": "^10.0.0", + "@fastify/view": "^10.0.0 || ^11.0.0", "@nestjs/common": "^11.0.0", "@nestjs/core": "^11.0.0" }, @@ -4047,15 +4208,40 @@ "@nestjs/core": "^10.0.0 || ^11.0.0" } }, + "node_modules/@nestjs/schedule/node_modules/@types/luxon": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", + "license": "MIT" + }, + "node_modules/@nestjs/schedule/node_modules/cron": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/cron/-/cron-3.5.0.tgz", + "integrity": "sha512-0eYZqCnapmxYcV06uktql93wNWdlTmmBFP2iYz+JPVcQqlyFYcn1lFuIk4R54pkOmE7mcldTAPZv6X5XA4Q46A==", + "license": "MIT", + "dependencies": { + "@types/luxon": "~3.4.0", + "luxon": "~3.5.0" + } + }, + "node_modules/@nestjs/schedule/node_modules/luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/@nestjs/schematics": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.2.tgz", - "integrity": "sha512-C4KM3BHBG6tRX8t5UrHdUq8Y49asEfJUora/fBXge3UTAnxKGlXc20p5s2Q0Q1+l+1YaXqTrKGSIbYXdPX8r9g==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.5.tgz", + "integrity": "sha512-T50SCNyqCZ/fDssaOD7meBKLZ87ebRLaJqZTJPvJKjlib1VYhMOCwXYsr7bjMPmuPgiQHOwvppz77xN/m6GM7A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.0", - "@angular-devkit/schematics": "19.2.0", + "@angular-devkit/core": "19.2.6", + "@angular-devkit/schematics": "19.2.6", "comment-json": "4.2.5", "jsonc-parser": "3.3.1", "pluralize": "8.0.0" @@ -4064,65 +4250,18 @@ "typescript": ">=4.8.2" } }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.0.tgz", - "integrity": "sha512-qd2nYoHZOYWRsu4MjXG8KiDtfM9ZDRR2rDGa+rDZ3CYAsngCrPmqOebun10dncUjwAidX49P4S2U2elOmX3VYQ==", - "dev": true, + "node_modules/@nestjs/swagger": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-11.2.0.tgz", + "integrity": "sha512-5wolt8GmpNcrQv34tIPUtPoV1EeFbCetm40Ij3+M0FNNnf2RJ3FyWfuQvI8SBlcJyfaounYVTKzKHreFXsUyOg==", "license": "MIT", "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.0.tgz", - "integrity": "sha512-cGGqUGqBXIGJkeL65l70y0BflDAu/0Zi/ohbYat3hvadFfumRJnVElVfJ59JtWO7FfKQjxcwCVTyuQ/tevX/9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.2.0", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@nestjs/swagger": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-11.0.6.tgz", - "integrity": "sha512-W/0aQWiEfEcXKd/dYO0DbVpYhlKNVMAhO4haahUyrYe20eXaaDY0T5exA2U8IsCcXZePWZuodRUiiXo8jcMYbA==", - "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "0.15.1", - "@nestjs/mapped-types": "2.1.0", - "js-yaml": "4.1.0", - "lodash": "4.17.21", - "path-to-regexp": "8.2.0", - "swagger-ui-dist": "5.19.0" + "@microsoft/tsdoc": "0.15.1", + "@nestjs/mapped-types": "2.1.0", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "8.2.0", + "swagger-ui-dist": "5.21.0" }, "peerDependencies": { "@fastify/static": "^8.0.0", @@ -4144,161 +4283,885 @@ } } }, - "node_modules/@nestjs/testing": { - "version": "11.0.11", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.0.11.tgz", - "integrity": "sha512-SoMIrhRpElV53btmGnEwpIQmXn2Xcztb9ae3lv+eVVnPHQuyB2zlgDIQVNjicbj7+3jdycX52KctOoj2eXEo1Q==", - "dev": true, + "node_modules/@nestjs/testing": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.1.tgz", + "integrity": "sha512-stzm8YrLDGAijHYQw+8Z9dD6lGdvahL0hIjGVZ/0KBxLZht0/rvRjgV31UK+DUqXaF7yhJTw9ryrPaITxI1J6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + } + } + }, + "node_modules/@nestjs/throttler": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@nestjs/throttler/-/throttler-6.4.0.tgz", + "integrity": "sha512-osL67i0PUuwU5nqSuJjtUJZMkxAnYB4VldgYUMGzvYRJDCqGRFMWbsbzm/CkUtPLRL30I8T74Xgt/OQxnYokiA==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", + "@nestjs/core": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0" + } + }, + "node_modules/@nestjs/typeorm": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.0.tgz", + "integrity": "sha512-SOeUQl70Lb2OfhGkvnh4KXWlsd+zA08RuuQgT7kKbzivngxzSo1Oc7Usu5VxCxACQC9wc2l9esOHILSJeK7rJA==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "rxjs": "^7.2.0", + "typeorm": "^0.3.0" + } + }, + "node_modules/@noble/curves": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz", + "integrity": "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.7.2" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/ed25519": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.5.tgz", + "integrity": "sha512-xuS0nwRMQBvSxDa7UxMb61xTiH3MxTgUfhyPUALVIe0FlOAz4sjELwyDRyUvqeEYfRSG9qNjFIycqLZppg4RSA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/@noble/hashes": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", + "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.2.tgz", + "integrity": "sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", + "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz", + "integrity": "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.46.1.tgz", + "integrity": "sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.43.0.tgz", + "integrity": "sha512-Q57JGpH6T4dkYHo9tKXONgLtxzsh1ZEW5M9A/OwKrZFyEpLqWgjhcZ3hIuVvDlhb426iDF1f9FPToV/mi5rpeA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.36" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect/node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.16.0.tgz", + "integrity": "sha512-88+qCHZC02up8PwKHk0UQKLLqGGURzS3hFQBZC7PnGwReuoKjHXS1o29H58S+QkXJpkTr2GACbx8j6mUoGjNPA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.47.0.tgz", + "integrity": "sha512-XFWVx6k0XlU8lu6cBlCa29ONtVt6ADEjmxtyAyeF2+rifk8uBJbk1La0yIVfI0DoKURGbaEDTNelaXG9l/lNNQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.44.1.tgz", + "integrity": "sha512-RoVeMGKcNttNfXMSl6W4fsYoCAYP1vi6ZAWIGhBY+o7R9Y0afA7f9JJL0j8LHbyb0P0QhSYk+6O56OwI2k4iRQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.19.0.tgz", + "integrity": "sha512-JGwmHhBkRT2G/BYNV1aGI+bBjJu4fJUD/5/Jat0EWZa2ftrLV3YE8z84Fiij/wK32oMZ88eS8DI4ecLGZhpqsQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.43.0.tgz", + "integrity": "sha512-at8GceTtNxD1NfFKGAuwtqM41ot/TpcLh+YsGe4dhf7gvv1HW/ZWdq6nfRtS6UjIvZJOokViqLPJ3GVtZItAnQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.47.0.tgz", + "integrity": "sha512-Cc8SMf+nLqp0fi8oAnooNEfwZWFnzMiBHCGmDFYqmgjPylyLmi83b+NiTns/rKGwlErpW0AGPt0sMpkbNlzn8w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.45.1.tgz", + "integrity": "sha512-VH6mU3YqAKTePPfUPwfq4/xr049774qWtfTuJqVHoVspCLiT3bW+fCQ1toZxt6cxRPYASoYaBsMA3CWo8B8rcw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.57.1.tgz", + "integrity": "sha512-ThLmzAQDs7b/tdKI3BV2+yawuF09jF111OFsovqT1Qj3D8vjwKBwhi/rDE5xethwn4tSXtZcJ9hBsVAlWFQZ7g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/instrumentation": "0.57.1", + "@opentelemetry/semantic-conventions": "1.28.0", + "forwarded-parse": "2.1.2", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/api-logs": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.1.tgz", + "integrity": "sha512-I4PHczeujhQAQv6ZBzqHYEUiggZL4IdSMixtVD3EYqbdrjujE7kRfI5QohjlPoJm8BvenoW5YaTMWRrbpot6tg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.1.tgz", + "integrity": "sha512-SgHEKXoVxOjc20ZYusPG3Fh+RLIZTSa4x8QtD3NfgAUDyqdFFS9W1F2ZVbZkqDCdyMcQG02Ok4duUGLHJXHgbA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.1", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.47.0.tgz", + "integrity": "sha512-4HqP9IBC8e7pW9p90P3q4ox0XlbLGme65YTrA3UTLvqvo4Z6b0puqZQP203YFu8m9rE/luLfaG7/xrwwqMUpJw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.7.0.tgz", + "integrity": "sha512-LB+3xiNzc034zHfCtgs4ITWhq6Xvdo8bsq7amR058jZlf2aXXDrN9SV4si4z2ya9QX4tz6r4eZJwDkXOp14/AQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.44.0.tgz", + "integrity": "sha512-SlT0+bLA0Lg3VthGje+bSZatlGHw/vwgQywx0R/5u9QC59FddTQSPJeWNw29M6f8ScORMeUOOTwihlQAn4GkJQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.47.0.tgz", + "integrity": "sha512-HFdvqf2+w8sWOuwtEXayGzdZ2vWpCKEQv5F7+2DSA74Te/Cv4rvb2E5So5/lh+ok4/RAIPuvCbCb/SHQFzMmbw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.44.0.tgz", + "integrity": "sha512-Tn7emHAlvYDFik3vGU0mdwvWJDwtITtkJ+5eT2cUquct6nIs+H8M47sqMJkCpyPe5QIBJoTOHxmc6mj9lz6zDw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.51.0.tgz", + "integrity": "sha512-cMKASxCX4aFxesoj3WK8uoQ0YUrRvnfxaO72QWI2xLu5ZtgX/QvdGBlU3Ehdond5eb74c2s1cqRQUIptBnKz1g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.46.0.tgz", + "integrity": "sha512-mtVv6UeaaSaWTeZtLo4cx4P5/ING2obSqfWGItIFSunQBrYROfhuVe7wdIrFUs2RH1tn2YYpAJyMaRe/bnTTIQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.45.0.tgz", + "integrity": "sha512-tWWyymgwYcTwZ4t8/rLDfPYbOTF3oYB8SxnYMtIQ1zEf5uDm90Ku3i6U/vhaMyfHNlIHvDhvJh+qx5Nc4Z3Acg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/mysql": "2.15.26" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.45.0.tgz", + "integrity": "sha512-qLslv/EPuLj0IXFvcE3b0EqhWI8LKmrgRPIa4gUd8DllbBpqJAvLNJSv3cC6vWwovpbSI3bagNO/3Q2SuXv2xA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.44.0.tgz", + "integrity": "sha512-t16pQ7A4WYu1yyQJZhRKIfUNvl5PAaF2pEteLvgJb/BWdd1oNuU1rOYt4S825kMy+0q4ngiX281Ss9qiwHfxFQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.50.0.tgz", + "integrity": "sha512-TtLxDdYZmBhFswm8UIsrDjh/HFBeDXd4BLmE8h2MxirNHewLJ0VS9UUddKKEverb5Sm2qFVjqRjcU+8Iw4FJ3w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "1.27.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", "license": "MIT", "dependencies": { - "tslib": "2.8.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^11.0.0", - "@nestjs/core": "^11.0.0", - "@nestjs/microservices": "^11.0.0", - "@nestjs/platform-express": "^11.0.0" + "xtend": "^4.0.0" }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - } + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@nestjs/throttler": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@nestjs/throttler/-/throttler-6.4.0.tgz", - "integrity": "sha512-osL67i0PUuwU5nqSuJjtUJZMkxAnYB4VldgYUMGzvYRJDCqGRFMWbsbzm/CkUtPLRL30I8T74Xgt/OQxnYokiA==", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.46.0.tgz", + "integrity": "sha512-aTUWbzbFMFeRODn3720TZO0tsh/49T8H3h8vVnVKJ+yE36AeW38Uj/8zykQ/9nO8Vrtjr5yKuX3uMiG/W8FKNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, "peerDependencies": { - "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", - "@nestjs/core": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", - "reflect-metadata": "^0.1.13 || ^0.2.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@nestjs/typeorm": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.0.tgz", - "integrity": "sha512-SOeUQl70Lb2OfhGkvnh4KXWlsd+zA08RuuQgT7kKbzivngxzSo1Oc7Usu5VxCxACQC9wc2l9esOHILSJeK7rJA==", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.18.0.tgz", + "integrity": "sha512-9zhjDpUDOtD+coeADnYEJQ0IeLVCj7w/hqzIutdp5NqS1VqTAanaEfsEcSypyvYv5DX3YOsTUoF+nr2wDXPETA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": ">=14" + }, "peerDependencies": { - "@nestjs/common": "^10.0.0 || ^11.0.0", - "@nestjs/core": "^10.0.0 || ^11.0.0", - "reflect-metadata": "^0.1.13 || ^0.2.0", - "rxjs": "^7.2.0", - "typeorm": "^0.3.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@noble/curves": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", - "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.10.0.tgz", + "integrity": "sha512-vm+V255NGw9gaSsPD6CP0oGo8L55BffBc8KnxqsMuc6XiAD1L8SFNzsW0RHhxJFqy9CJaJh+YiJ5EHXuZ5rZBw==", + "license": "Apache-2.0", "dependencies": { - "@noble/hashes": "1.7.1" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.0" }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=14" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" } }, - "node_modules/@noble/ed25519": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz", - "integrity": "sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } }, - "node_modules/@noble/hashes": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", - "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", - "license": "MIT", + "node_modules/@opentelemetry/resources": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=14" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", + "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", + "license": "Apache-2.0", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" }, "engines": { - "node": ">= 8" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", "engines": { - "node": ">= 8" + "node": ">=14" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.32.0.tgz", + "integrity": "sha512-s0OpmpQFSfMrmedAn9Lhg4KWJELHCU6uU9dtIJ28N8UGhf9Y55im5X8fEzwhwDwiSqN+ZPSNrDJF7ivf/AuRPQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", + "license": "Apache-2.0", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@opentelemetry/core": "^1.1.0" }, "engines": { - "node": ">= 8" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" } }, - "node_modules/@nuxt/opencollective": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", - "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", - "license": "MIT", + "node_modules/@permaweb/ao-scheduler-utils": { + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@permaweb/ao-scheduler-utils/-/ao-scheduler-utils-0.0.25.tgz", + "integrity": "sha512-b0UYSTgnLMIYLScrfNBgcqK7ZMmd78L3J0Jz4RIsIq2P5PtkdRqQ7fYqLlltg7bD1f3dvl4TkO1925ED4ei7LA==", "dependencies": { - "consola": "^3.2.3" + "lru-cache": "^10.2.2", + "ramda": "^0.30.0", + "zod": "^3.23.5" }, - "bin": { - "opencollective": "bin/opencollective.js" + "engines": { + "node": ">=18" + } + }, + "node_modules/@permaweb/ao-scheduler-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/@permaweb/aoconnect": { + "version": "0.0.57", + "resolved": "https://registry.npmjs.org/@permaweb/aoconnect/-/aoconnect-0.0.57.tgz", + "integrity": "sha512-l1+47cZuQ8pOIMOdRXymcegCmefXjqR8Bc2MY6jIzWv9old/tG6mfCue2W1QviGyhjP3zEVQgr7YofkY2lq35Q==", + "dependencies": { + "@permaweb/ao-scheduler-utils": "~0.0.20", + "buffer": "^6.0.3", + "debug": "^4.3.5", + "hyper-async": "^1.1.2", + "mnemonist": "^0.39.8", + "ramda": "^0.30.1", + "warp-arbundles": "^1.0.4", + "zod": "^3.23.8" }, "engines": { - "node": "^14.18.0 || >=16.10.0", - "npm": ">=5.10.0" + "node": ">=18", + "yarn": "please-use-npm" } }, "node_modules/@pkgjs/parseargs": { @@ -4312,16 +5175,59 @@ } }, "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", + "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@prisma/instrumentation": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-5.22.0.tgz", + "integrity": "sha512-LxccF392NN37ISGxIurUljZSh1YWnphO34V5a0+T7FVQG2u9bhAXRTJpgmQ3483woVhkraQZFF7cbRrpbw/F4Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.8", + "@opentelemetry/instrumentation": "^0.49 || ^0.50 || ^0.51 || ^0.52.0 || ^0.53.0", + "@opentelemetry/sdk-trace-base": "^1.22" + } + }, + "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@protobuf-ts/grpc-transport": { @@ -4582,83 +5488,79 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@sentry-internal/tracing": { - "version": "7.119.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.119.0.tgz", - "integrity": "sha512-oKdFJnn+56f0DHUADlL8o9l8jTib3VDLbWQBVkjD9EprxfaCwt2m8L5ACRBdQ8hmpxCEo4I8/6traZ7qAdBUqA==", - "license": "MIT", - "dependencies": { - "@sentry/core": "7.119.0", - "@sentry/types": "7.119.0", - "@sentry/utils": "7.119.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@sentry/core": { - "version": "7.119.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.0.tgz", - "integrity": "sha512-CS2kUv9rAJJEjiRat6wle3JATHypB0SyD7pt4cpX5y0dN5dZ1JrF57oLHRMnga9fxRivydHz7tMTuBhSSwhzjw==", - "license": "MIT", - "dependencies": { - "@sentry/types": "7.119.0", - "@sentry/utils": "7.119.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/integrations": { - "version": "7.119.0", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.119.0.tgz", - "integrity": "sha512-OHShvtsRW0A+ZL/ZbMnMqDEtJddPasndjq+1aQXw40mN+zeP7At/V1yPZyFaURy86iX7Ucxw5BtmzuNy7hLyTA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.55.0.tgz", + "integrity": "sha512-6g7jpbefjHYs821Z+EBJ8r4Z7LT5h80YSWRJaylGS4nW5W5Z2KXzpdnyFarv37O7QjauzVC2E+PABmpkw5/JGA==", "license": "MIT", - "dependencies": { - "@sentry/core": "7.119.0", - "@sentry/types": "7.119.0", - "@sentry/utils": "7.119.0", - "localforage": "^1.8.1" - }, "engines": { - "node": ">=8" + "node": ">=14.18" } }, "node_modules/@sentry/node": { - "version": "7.119.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.119.0.tgz", - "integrity": "sha512-9PFzN8xS6U0oZCflpVxS2SSIsHkCaj7qYBlsvHj4CTGWfao9ImwrU6+smy4qoG6oxwPfoVb5pOOMb4WpWOvXcQ==", - "license": "MIT", - "dependencies": { - "@sentry-internal/tracing": "7.119.0", - "@sentry/core": "7.119.0", - "@sentry/integrations": "7.119.0", - "@sentry/types": "7.119.0", - "@sentry/utils": "7.119.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/types": { - "version": "7.119.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.0.tgz", - "integrity": "sha512-27qQbutDBPKGbuJHROxhIWc1i0HJaGLA90tjMu11wt0E4UNxXRX+UQl4Twu68v4EV3CPvQcEpQfgsViYcXmq+w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils": { - "version": "7.119.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.0.tgz", - "integrity": "sha512-ZwyXexWn2ZIe2bBoYnXJVPc2esCSbKpdc6+0WJa8eutXfHq3FRKg4ohkfCBpfxljQGEfP1+kfin945lA21Ka+A==", - "license": "MIT", - "dependencies": { - "@sentry/types": "7.119.0" + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.55.0.tgz", + "integrity": "sha512-h10LJLDTRAzYgay60Oy7moMookqqSZSviCWkkmHZyaDn+4WURnPp5SKhhfrzPRQcXKrweiOwDSHBgn1tweDssg==", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1", + "@opentelemetry/core": "^1.30.1", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/instrumentation-amqplib": "^0.46.0", + "@opentelemetry/instrumentation-connect": "0.43.0", + "@opentelemetry/instrumentation-dataloader": "0.16.0", + "@opentelemetry/instrumentation-express": "0.47.0", + "@opentelemetry/instrumentation-fastify": "0.44.1", + "@opentelemetry/instrumentation-fs": "0.19.0", + "@opentelemetry/instrumentation-generic-pool": "0.43.0", + "@opentelemetry/instrumentation-graphql": "0.47.0", + "@opentelemetry/instrumentation-hapi": "0.45.1", + "@opentelemetry/instrumentation-http": "0.57.1", + "@opentelemetry/instrumentation-ioredis": "0.47.0", + "@opentelemetry/instrumentation-kafkajs": "0.7.0", + "@opentelemetry/instrumentation-knex": "0.44.0", + "@opentelemetry/instrumentation-koa": "0.47.0", + "@opentelemetry/instrumentation-lru-memoizer": "0.44.0", + "@opentelemetry/instrumentation-mongodb": "0.51.0", + "@opentelemetry/instrumentation-mongoose": "0.46.0", + "@opentelemetry/instrumentation-mysql": "0.45.0", + "@opentelemetry/instrumentation-mysql2": "0.45.0", + "@opentelemetry/instrumentation-nestjs-core": "0.44.0", + "@opentelemetry/instrumentation-pg": "0.50.0", + "@opentelemetry/instrumentation-redis-4": "0.46.0", + "@opentelemetry/instrumentation-tedious": "0.18.0", + "@opentelemetry/instrumentation-undici": "0.10.0", + "@opentelemetry/resources": "^1.30.1", + "@opentelemetry/sdk-trace-base": "^1.30.1", + "@opentelemetry/semantic-conventions": "^1.28.0", + "@prisma/instrumentation": "5.22.0", + "@sentry/core": "8.55.0", + "@sentry/opentelemetry": "8.55.0", + "import-in-the-middle": "^1.11.2" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/opentelemetry": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.55.0.tgz", + "integrity": "sha512-UvatdmSr3Xf+4PLBzJNLZ2JjG1yAPWGe/VrJlJAqyTJ2gKeTzgXJJw8rp4pbvNZO8NaTGEYhhO+scLUj0UtLAQ==", + "license": "MIT", + "dependencies": { + "@sentry/core": "8.55.0" + }, + "engines": { + "node": ">=14.18" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1", + "@opentelemetry/core": "^1.30.1", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/sdk-trace-base": "^1.30.1", + "@opentelemetry/semantic-conventions": "^1.28.0" } }, "node_modules/@sinclair/typebox": { @@ -4880,36 +5782,86 @@ "license": "Apache-2.0", "peer": true, "dependencies": { - "@solana/codecs": "2.0.0-rc.1" + "@solana/codecs": "2.0.0-rc.1" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.95.3" + } + }, + "node_modules/@solana/web3.js": { + "version": "1.98.2", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.2.tgz", + "integrity": "sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "@noble/curves": "^1.4.2", + "@noble/hashes": "^1.4.0", + "@solana/buffer-layout": "^4.0.1", + "@solana/codecs-numbers": "^2.1.0", + "agentkeepalive": "^4.5.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.1.1", + "node-fetch": "^2.7.0", + "rpc-websockets": "^9.0.2", + "superstruct": "^2.0.2" + } + }, + "node_modules/@solana/web3.js/node_modules/@solana/codecs-core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.1.0.tgz", + "integrity": "sha512-SR7pKtmJBg2mhmkel2NeHA1pz06QeQXdMv8WJoIR9m8F/hw80K/612uaYbwTt2nkK0jg/Qn/rNSd7EcJ4SBGjw==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/web3.js/node_modules/@solana/codecs-numbers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.1.0.tgz", + "integrity": "sha512-XMu4yw5iCgQnMKsxSWPPOrGgtaohmupN3eyAtYv3K3C/MJEc5V90h74k5B1GUCiHvcrdUDO9RclNjD9lgbjFag==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/errors": "2.1.0" }, "engines": { - "node": ">=16" + "node": ">=20.18.0" }, "peerDependencies": { - "@solana/web3.js": "^1.95.3" + "typescript": ">=5" } }, - "node_modules/@solana/web3.js": { - "version": "1.98.0", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.0.tgz", - "integrity": "sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==", + "node_modules/@solana/web3.js/node_modules/@solana/errors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.1.0.tgz", + "integrity": "sha512-l+GxAv0Ar4d3c3PlZdA9G++wFYZREEbbRyAFP8+n8HSg0vudCuzogh/13io6hYuUhG/9Ve8ARZNamhV7UScKNw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.0", - "@noble/curves": "^1.4.2", - "@noble/hashes": "^1.4.0", - "@solana/buffer-layout": "^4.0.1", - "agentkeepalive": "^4.5.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.1", - "node-fetch": "^2.7.0", - "rpc-websockets": "^9.0.2", - "superstruct": "^2.0.2" + "chalk": "^5.3.0", + "commander": "^13.1.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, "node_modules/@solana/web3.js/node_modules/base-x": { @@ -4930,6 +5882,15 @@ "base-x": "^3.0.2" } }, + "node_modules/@solana/web3.js/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@sqltools/formatter": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", @@ -4937,9 +5898,9 @@ "license": "MIT" }, "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" @@ -4957,6 +5918,30 @@ "node": ">=14.16" } }, + "node_modules/@tokenizer/inflate": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", + "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "fflate": "^0.8.2", + "token-types": "^6.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -5000,9 +5985,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -5021,9 +6006,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, "license": "MIT", "dependencies": { @@ -5112,22 +6097,21 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true, "license": "MIT" }, "node_modules/@types/express": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", - "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.1.tgz", + "integrity": "sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==", "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", - "@types/qs": "*", "@types/serve-static": "*" } }, @@ -5237,9 +6221,10 @@ "license": "MIT" }, "node_modules/@types/luxon": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", - "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.6.2.tgz", + "integrity": "sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==", + "dev": true, "license": "MIT" }, "node_modules/@types/methods": { @@ -5256,13 +6241,22 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mysql": { + "version": "2.15.26", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", + "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { - "version": "22.13.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", - "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "version": "22.15.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.18.tgz", + "integrity": "sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/passport": { @@ -5307,10 +6301,9 @@ } }, "node_modules/@types/pg": { - "version": "8.11.11", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.11.tgz", - "integrity": "sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw==", - "dev": true, + "version": "8.15.2", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.2.tgz", + "integrity": "sha512-+BKxo5mM6+/A1soSHBI7ufUglqYXntChLDyTbvcAn1Lawi9J7J9Ok3jt6w7I0+T/UDJ4CyhHk66+GZbwmkYxSg==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -5318,6 +6311,15 @@ "pg-types": "^4.0.1" } }, + "node_modules/@types/pg-pool": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", + "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", + "license": "MIT", + "dependencies": { + "@types/pg": "*" + } + }, "node_modules/@types/qs": { "version": "6.9.18", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", @@ -5373,6 +6375,12 @@ "@types/send": "*" } }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", + "license": "MIT" + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -5403,6 +6411,15 @@ "@types/superagent": "*" } }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/triple-beam": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", @@ -5416,9 +6433,9 @@ "license": "MIT" }, "node_modules/@types/validator": { - "version": "13.12.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", - "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.0.tgz", + "integrity": "sha512-nh7nrWhLr6CBq9ldtw0wx+z9wKnnv/uTVLA9g/3/TcOYxbpOSZE+MhKPmWqU+K0NvThjhv12uD8MuqijB0WzEA==", "license": "MIT" }, "node_modules/@types/ws": { @@ -5448,80 +6465,82 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz", + "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/type-utils": "8.32.1", + "@typescript-eslint/utils": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz", + "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", + "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -5529,41 +6548,37 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz", + "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/utils": "8.32.1", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", + "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -5571,75 +6586,87 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", + "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", + "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", + "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.32.1", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", @@ -5866,7 +6893,6 @@ "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "devOptional": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -5875,6 +6901,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -6049,9 +7084,9 @@ "license": "MIT" }, "node_modules/ansis": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.16.0.tgz", - "integrity": "sha512-sU7d/tfZiYrsIAXbdL/CNZld5bCkruzwT5KmqmadCJYxuLxHAOBjidxD5+iLmN/6xEfjcQq1l7OpsiCBlc4LzA==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", "license": "ISC", "engines": { "node": ">=14" @@ -6173,20 +7208,10 @@ "dev": true, "license": "MIT" }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/arweave": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/arweave/-/arweave-1.15.5.tgz", - "integrity": "sha512-Zj3b8juz1ZtDaQDPQlzWyk2I4wZPx3RmcGq8pVJeZXl2Tjw0WRy5ueHPelxZtBLqCirGoZxZEAFRs6SZUSCBjg==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/arweave/-/arweave-1.15.7.tgz", + "integrity": "sha512-F+Y4iWU1qea9IsKQ/YNmLsY4DHQVsaJBuhEbFxQn9cfGHOmtXE+bwo14oY8xqymsqSNf/e1PeIfLk7G7qN/hVA==", "license": "MIT", "dependencies": { "arconnect": "^0.4.2", @@ -6330,9 +7355,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", - "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -6614,27 +7639,14 @@ } }, "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.2.1.tgz", + "integrity": "sha512-+NzaKgOUvInq9TIUZ1+DRspzf/HApkCwD4btfuasFTdrfnOxqx853TgDpMolp+uv4RpRp7bPcEU2zKr9+fRmyw==", "license": "MIT", "engines": { "node": "*" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -6644,6 +7656,15 @@ "file-uri-to-path": "1.0.0" } }, + "node_modules/bip174": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.1.1.tgz", + "integrity": "sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/bip32": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", @@ -6677,6 +7698,39 @@ "@noble/hashes": "^1.2.0" } }, + "node_modules/bitcoinjs-lib": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.7.tgz", + "integrity": "sha512-tlf/r2DGMbF7ky1MgUqXHzypYHakkEnm0SZP23CJKIqNY/5uNAnMbFhMJdhjrL/7anfb/U8+AlpdjPWjPnAalg==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bech32": "^2.0.0", + "bip174": "^2.1.1", + "bs58check": "^3.0.1", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/bitcoinjs-lib/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", + "license": "MIT" + }, + "node_modules/bitcoinjs-lib/node_modules/bs58check": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", + "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^5.0.0" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -7141,9 +8195,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001706", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz", - "integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==", + "version": "1.0.30001714", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001714.tgz", + "integrity": "sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg==", "dev": true, "funding": [ { @@ -7185,7 +8239,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "license": "MIT", - "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -7328,7 +8381,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, "license": "MIT" }, "node_modules/class-is": { @@ -7344,13 +8396,13 @@ "license": "MIT" }, "node_modules/class-validator": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", - "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.2.tgz", + "integrity": "sha512-3kMVRF2io8N8pY1IFIXlho9r8IPUUIfHe2hYVtiebvAzU2XeQFXTv+XI4WX+TnXmtwXMDcjngcpkiPM0O9PvLw==", "license": "MIT", "dependencies": { "@types/validator": "^13.11.8", - "libphonenumber-js": "^1.10.53", + "libphonenumber-js": "^1.11.1", "validator": "^13.9.0" } }, @@ -7855,13 +8907,17 @@ "license": "MIT" }, "node_modules/cron": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/cron/-/cron-3.5.0.tgz", - "integrity": "sha512-0eYZqCnapmxYcV06uktql93wNWdlTmmBFP2iYz+JPVcQqlyFYcn1lFuIk4R54pkOmE7mcldTAPZv6X5XA4Q46A==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cron/-/cron-4.3.0.tgz", + "integrity": "sha512-ciiYNLfSlF9MrDqnbMdRWFiA6oizSF7kA1osPP9lRzNu0Uu+AWog1UKy7SkckiDY2irrNjeO6qLyKnXC8oxmrw==", + "dev": true, "license": "MIT", "dependencies": { - "@types/luxon": "~3.4.0", - "luxon": "~3.5.0" + "@types/luxon": "~3.6.0", + "luxon": "~3.6.0" + }, + "engines": { + "node": ">=18.x" } }, "node_modules/cross-fetch": { @@ -7973,10 +9029,9 @@ } }, "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -8150,19 +9205,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -8182,9 +9224,9 @@ "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -8247,6 +9289,20 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/ecpair": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ecpair/-/ecpair-2.1.0.tgz", + "integrity": "sha512-cL/mh3MtJutFOvFc27GPZE2pWL3a3k4YvzUWEOvilnfZVlH3Jwgx/7d6tlD7/75tNk8TG2m+7Kgtz0SI1tWcqw==", + "license": "MIT", + "dependencies": { + "randombytes": "^2.1.0", + "typeforce": "^1.18.0", + "wif": "^2.0.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -8270,9 +9326,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.120", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.120.tgz", - "integrity": "sha512-oTUp3gfX1gZI+xfD2djr2rzQdHCwHzPQrrK0CD7WpTdF0nPdQ/INcRVjWgLdCT4a9W3jFObR9DAfsuyFQnI8CQ==", + "version": "1.5.137", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.137.tgz", + "integrity": "sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA==", "dev": true, "license": "ISC" }, @@ -8570,14 +9626,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", - "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz", + "integrity": "sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==", "dev": true, "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" + "synckit": "^0.11.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -8588,7 +9644,7 @@ "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", - "eslint-config-prettier": "*", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -9488,9 +10544,9 @@ "peer": true }, "node_modules/fastify": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.2.1.tgz", - "integrity": "sha512-rslrNBF67eg8/Gyn7P2URV8/6pz8kSAscFL4EThZJ8JBMaXacVdVE4hmUcnPNKERl5o/xTiBSLfdowBRhVF1WA==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.3.3.tgz", + "integrity": "sha512-nCBiBCw9q6jPx+JJNVgO8JVnTXeUyrGcyTKPQikRkA/PanrFcOIo4R+ZnLeOLPZPGgzjomqfVarzE0kYx7qWiQ==", "funding": [ { "type": "github", @@ -9513,9 +10569,9 @@ "find-my-way": "^9.0.0", "light-my-request": "^6.0.0", "pino": "^9.0.0", - "process-warning": "^4.0.0", + "process-warning": "^5.0.0", "rfdc": "^1.3.1", - "secure-json-parse": "^3.0.1", + "secure-json-parse": "^4.0.0", "semver": "^7.6.0", "toad-cache": "^3.7.0" } @@ -9561,6 +10617,12 @@ "tough-cookie": "^4.0.0" } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -9574,6 +10636,24 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-type": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.5.0.tgz", + "integrity": "sha512-BfHZtG/l9iMm4Ecianu7P8HRD2tBHLtjXinm4X62XBOYzi7CYA7jyqfJzOvXHqzVrVPYqBo2/GvbARMaaJkKVg==", + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.2.6", + "strtok3": "^10.2.0", + "token-types": "^6.0.0", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -9650,17 +10730,17 @@ "license": "MIT" }, "node_modules/find-my-way": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.2.0.tgz", - "integrity": "sha512-d3uCir8Hmg7W1Ywp8nKf2lJJYU9Nwinvo+1D39Dn09nz65UKXIxUh7j7K8zeWhxqe1WrkS7FJyON/Q/3lPoc6w==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.3.0.tgz", + "integrity": "sha512-eRoFWQw+Yv2tuYlK2pjFS2jGXSxSppAs3hSQjfxVKxM5amECzIgYYc1FEI8ZmhSh/Ig+FrKEz43NLRKJjYCZVg==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", - "safe-regex2": "^4.0.0" + "safe-regex2": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/find-up": { @@ -9769,15 +10849,15 @@ } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz", - "integrity": "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", - "chokidar": "^3.5.3", + "chokidar": "^4.0.1", "cosmiconfig": "^8.2.0", "deepmerge": "^4.2.2", "fs-extra": "^10.0.0", @@ -9789,8 +10869,7 @@ "tapable": "^2.2.1" }, "engines": { - "node": ">=12.13.0", - "yarn": ">=1.0.0" + "node": ">=14.21.3" }, "peerDependencies": { "typescript": ">3.6.0", @@ -9841,31 +10920,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9879,25 +10933,12 @@ "node": ">=7.0.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { "version": "3.1.2", @@ -9912,32 +10953,6 @@ "node": "*" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/form-data": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", @@ -9984,6 +10999,12 @@ "node": ">= 0.6" } }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", + "license": "MIT" + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -10264,27 +11285,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -10592,6 +11592,12 @@ "resolved": "https://registry.npmjs.org/humanize-number/-/humanize-number-0.0.2.tgz", "integrity": "sha512-un3ZAcNQGI7RzaWGZzQDH47HETM4Wrj6z6E4TId8Yeq9w5ZKUVB1nrT2jwFheTUjEmqcgTjXDc959jum+ai1kQ==" }, + "node_modules/hyper-async": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/hyper-async/-/hyper-async-1.1.2.tgz", + "integrity": "sha512-cnpOgKa+5FZOaccTtjduac1FrZuSc38/ftCp3vYJdUMt+7c+uvGDKLDK4MTNK8D3aFjIeveVrPcSgUPvzZLopg==", + "license": "MIT" + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -10655,12 +11661,6 @@ "node": ">= 4" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -10678,6 +11678,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-in-the-middle": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", + "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -10758,19 +11770,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -10787,7 +11786,6 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -13038,15 +14036,6 @@ "libsodium-sumo": "^0.7.15" } }, - "node_modules/lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, "node_modules/light-my-request": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", @@ -13068,6 +14057,22 @@ "set-cookie-parser": "^2.6.0" } }, + "node_modules/light-my-request/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -13075,6 +14080,25 @@ "dev": true, "license": "MIT" }, + "node_modules/load-esm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.2.tgz", + "integrity": "sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "license": "MIT", + "engines": { + "node": ">=13.2.0" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -13085,15 +14109,6 @@ "node": ">=6.11.5" } }, - "node_modules/localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "license": "Apache-2.0", - "dependencies": { - "lie": "3.1.1" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -13309,9 +14324,10 @@ } }, "node_modules/luxon": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", - "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", + "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -13629,12 +14645,12 @@ } }, "node_modules/mnemonist": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.40.0.tgz", - "integrity": "sha512-kdd8AFNig2AD5Rkih7EPCXhu/iMvwevQFX/uEiGhZyPZi7fHqOoF4V4kHLpCfysxXMgQ4B52kdPMCwARshKvEg==", + "version": "0.39.8", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz", + "integrity": "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==", "license": "MIT", "dependencies": { - "obliterator": "^2.0.4" + "obliterator": "^2.0.1" } }, "node_modules/mock-fs": { @@ -13643,6 +14659,12 @@ "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", "license": "MIT" }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -14015,7 +15037,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true, "license": "MIT" }, "node_modules/on-exit-leak-free": { @@ -14255,9 +15276,9 @@ } }, "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.6.tgz", + "integrity": "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==", "license": "MIT" }, "node_modules/parse-json": { @@ -14357,7 +15378,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, "license": "MIT" }, "node_modules/path-scurry": { @@ -14377,9 +15397,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", - "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", "license": "ISC", "engines": { "node": "20 || >=22" @@ -14425,6 +15445,19 @@ "node": ">=0.12" } }, + "node_modules/peek-readable": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-7.0.0.tgz", + "integrity": "sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -14432,22 +15465,22 @@ "license": "MIT" }, "node_modules/pg": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.14.1.tgz", - "integrity": "sha512-0TdbqfjwIun9Fm/r89oB7RFQ0bLgduAhiIqIXOsyKoiC/L54DbuAAzIEN/9Op0f1Po9X7iCPXGoa/Ah+2aI8Xw==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.0.tgz", + "integrity": "sha512-7SKfdvP8CTNXjMUzfcVTaI+TDzBEeaUnVwiVGZQD1Hh33Kpev7liQba9uLd4CfN8r9mCVsD0JIpq03+Unpz+kg==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.7.0", - "pg-pool": "^3.8.0", - "pg-protocol": "^1.8.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" + "pg-connection-string": "^2.9.0", + "pg-pool": "^3.10.0", + "pg-protocol": "^1.10.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" }, "engines": { "node": ">= 8.0.0" }, "optionalDependencies": { - "pg-cloudflare": "^1.1.1" + "pg-cloudflare": "^1.2.5" }, "peerDependencies": { "pg-native": ">=3.0.1" @@ -14459,16 +15492,16 @@ } }, "node_modules/pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.5.tgz", + "integrity": "sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==", "license": "MIT", "optional": true }, "node_modules/pg-connection-string": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", - "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.0.tgz", + "integrity": "sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ==", "license": "MIT" }, "node_modules/pg-int8": { @@ -14484,32 +15517,30 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", - "dev": true, "license": "ISC", "engines": { "node": ">=4" } }, "node_modules/pg-pool": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.8.0.tgz", - "integrity": "sha512-VBw3jiVm6ZOdLBTIcXLNdSotb6Iy3uOCwDGFAksZCXmi10nyRvnP2v3jl4d+IsLYRyXf6o9hIm/ZtUzlByNUdw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.0.tgz", + "integrity": "sha512-DzZ26On4sQ0KmqnO34muPcmKbhrjmyiO4lCCR0VwEd7MjmiKf5NTg/6+apUEu0NF7ESa37CGzFxH513CoUmWnA==", "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.8.0.tgz", - "integrity": "sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.0.tgz", + "integrity": "sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q==", "license": "MIT" }, "node_modules/pg-types": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz", "integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==", - "dev": true, "license": "MIT", "dependencies": { "pg-int8": "1.0.1", @@ -14645,10 +15676,26 @@ "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", "license": "MIT" }, + "node_modules/pino/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, "license": "MIT", "engines": { @@ -14759,7 +15806,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.4.tgz", "integrity": "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -14769,7 +15815,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", - "dev": true, "license": "MIT", "dependencies": { "obuf": "~1.1.2" @@ -14782,7 +15827,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -14792,7 +15836,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -14802,7 +15845,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz", "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==", - "dev": true, "license": "MIT" }, "node_modules/prelude-ls": { @@ -14869,9 +15911,9 @@ } }, "node_modules/process-warning": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", - "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", "funding": [ { "type": "github", @@ -14898,9 +15940,9 @@ } }, "node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.0.tgz", + "integrity": "sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -15080,6 +16122,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ramda": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz", + "integrity": "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -15290,6 +16342,20 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -15300,7 +16366,6 @@ "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", @@ -15551,9 +16616,9 @@ } }, "node_modules/rpc-websockets/node_modules/@types/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -15584,9 +16649,9 @@ } }, "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -15630,9 +16695,9 @@ } }, "node_modules/safe-regex2": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-4.0.1.tgz", - "integrity": "sha512-goqsB+bSlOmVX+CiFX2PFc1OV88j5jvBqIM+DgqrucHnUguAUNtiNOs+aTadq2NqsLQ+TQ3UEVG3gtSFcdlkCg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz", + "integrity": "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==", "funding": [ { "type": "github", @@ -15744,9 +16809,9 @@ "license": "MIT" }, "node_modules/secure-json-parse": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-3.0.2.tgz", - "integrity": "sha512-H6nS2o8bWfpFEV6U38sOSjS7bTbdgbCGU9wEM6W14P5H0QOsz94KCusifV44GpHDTu2nqZbuDNhTzu+mjDSw1w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.0.0.tgz", + "integrity": "sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==", "funding": [ { "type": "github", @@ -15760,9 +16825,9 @@ "license": "BSD-3-Clause" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -15941,6 +17006,12 @@ "node": ">=8" } }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", + "license": "BSD-2-Clause" + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -16235,9 +17306,9 @@ } }, "node_modules/starknet": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/starknet/-/starknet-6.23.1.tgz", - "integrity": "sha512-vQV9luXpmwZZs9RVZaRwm2iD8T0PYx1AzgZeQsCvD89tR0HwUF0paty27ZzuJrdPe0CmAs/ipAYFCE55jbj0RQ==", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/starknet/-/starknet-6.24.1.tgz", + "integrity": "sha512-g7tiCt73berhcNi41otlN3T3kxZnIvZhMi8WdC21Y6GC6zoQgbI2z1t7JAZF9c4xZiomlanwVnurcpyfEdyMpg==", "license": "MIT", "dependencies": { "@noble/curves": "1.7.0", @@ -16428,6 +17499,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strtok3": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.2.2.tgz", + "integrity": "sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/superagent": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", @@ -16504,7 +17592,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -16514,9 +17601,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.19.0.tgz", - "integrity": "sha512-bSVZeYaqanMFeW5ZY3+EejFbsjkjazYxm1I7Lz3xayYz5XU3m2aUzvuPC0jI95WCQdduszHYV3ER4buQoy8DXA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.21.0.tgz", + "integrity": "sha512-E0K3AB6HvQd8yQNSMR7eE5bk+323AUxjtCz/4ZNKiahOlPhPJxqn3UPIGs00cyY/dhrTDJ61L7C/a8u6zhGrZg==", "license": "Apache-2.0", "dependencies": { "@scarf/scarf": "=1.4.0" @@ -16682,20 +17769,20 @@ } }, "node_modules/synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.4.tgz", + "integrity": "sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "@pkgr/core": "^0.2.3", + "tslib": "^2.8.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/synckit" } }, "node_modules/tapable": { @@ -17096,6 +18183,23 @@ "node": ">=0.6" } }, + "node_modules/token-types": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.0.tgz", + "integrity": "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -17146,22 +18250,22 @@ } }, "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/ts-jest": { - "version": "29.2.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.6.tgz", - "integrity": "sha512-yTNZVZqc8lSixm+QGVFcPe6+yj7+TWZwIesuOWvfcn4B9bz5x4NDzVCQQjOs7Hfouu36aEqfEbo9Qpo+gq8dDg==", + "version": "29.3.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.4.tgz", + "integrity": "sha512-Iqbrm8IXOmV+ggWHOTEbjwyCf2xZlUMv5npExksXohL+tk8va4Fjhb+X2+Rt9NBmgO7bJ8WpnMLOwih/DnMlFA==", "dev": true, "license": "MIT", "dependencies": { @@ -17172,7 +18276,8 @@ "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", "yargs-parser": "^21.1.1" }, "bin": { @@ -17207,6 +18312,19 @@ } } }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ts-loader": { "version": "9.5.2", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", @@ -17520,24 +18638,25 @@ "license": "MIT" }, "node_modules/typeorm": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.21.tgz", - "integrity": "sha512-lh4rUWl1liZGjyPTWpwcK8RNI5x4ekln+/JJOox1wCd7xbucYDOXWD+1cSzTN3L0wbTGxxOtloM5JlxbOxEufA==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.24.tgz", + "integrity": "sha512-4IrHG7A0tY8l5gEGXfW56VOMfUVWEkWlH/h5wmcyZ+V8oCiLj7iTPp0lEjMEZVrxEkGSdP9ErgTKHKXQApl/oA==", "license": "MIT", "dependencies": { "@sqltools/formatter": "^1.2.5", - "ansis": "^3.9.0", + "ansis": "^3.17.0", "app-root-path": "^3.1.0", "buffer": "^6.0.3", - "dayjs": "^1.11.9", - "debug": "^4.3.4", - "dotenv": "^16.0.3", + "dayjs": "^1.11.13", + "debug": "^4.4.0", + "dedent": "^1.6.0", + "dotenv": "^16.4.7", "glob": "^10.4.5", "sha.js": "^2.4.11", "sql-highlight": "^6.0.0", - "tslib": "^2.5.0", - "uuid": "^11.0.5", - "yargs": "^17.6.2" + "tslib": "^2.8.1", + "uuid": "^11.1.0", + "yargs": "^17.7.2" }, "bin": { "typeorm": "cli.js", @@ -17551,12 +18670,12 @@ "url": "https://opencollective.com/typeorm" }, "peerDependencies": { - "@google-cloud/spanner": "^5.18.0", + "@google-cloud/spanner": "^5.18.0 || ^6.0.0 || ^7.0.0", "@sap/hana-client": "^2.12.25", "better-sqlite3": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", "hdb-pool": "^0.1.6", "ioredis": "^5.0.4", - "mongodb": "^5.8.0", + "mongodb": "^5.8.0 || ^6.0.0", "mssql": "^9.1.1 || ^10.0.1 || ^11.0.1", "mysql2": "^2.2.5 || ^3.0.1", "oracledb": "^6.3.0", @@ -17568,7 +18687,7 @@ "sql.js": "^1.4.0", "sqlite3": "^5.0.3", "ts-node": "^10.7.0", - "typeorm-aurora-data-api-driver": "^2.0.0" + "typeorm-aurora-data-api-driver": "^2.0.0 || ^3.0.0" }, "peerDependenciesMeta": { "@google-cloud/spanner": { @@ -17695,9 +18814,9 @@ } }, "node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -17719,16 +18838,40 @@ "node": ">=8" } }, + "node_modules/uint8array-extras": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz", + "integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "license": "MIT" }, + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/universalify": { @@ -17893,9 +19036,9 @@ } }, "node_modules/validator": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", - "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.0.tgz", + "integrity": "sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -17907,6 +19050,15 @@ "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", "license": "MIT" }, + "node_modules/varuint-bitcoin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", + "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -17953,6 +19105,31 @@ "makeerror": "1.0.12" } }, + "node_modules/warp-arbundles": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/warp-arbundles/-/warp-arbundles-1.0.4.tgz", + "integrity": "sha512-KeRac/EJ7VOK+v5+PSMh2SrzpCKOAFnJICLlqZWt6qPkDCzVwcrNE5wFxOlEk5U170ewMDAB3e86UHUblevXpw==", + "license": "ISC", + "dependencies": { + "arweave": "^1.13.7", + "base64url": "^3.0.1", + "buffer": "^6.0.3", + "warp-isomorphic": "^1.0.7" + } + }, + "node_modules/warp-isomorphic": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/warp-isomorphic/-/warp-isomorphic-1.0.7.tgz", + "integrity": "sha512-fXHbUXwdYqPm9fRPz8mjv5ndPco09aMQuTe4kXfymzOq8V6F3DLsg9cIafxvjms9/mc6eijzkLBJ63yjEENEjA==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "undici": "^5.19.1" + }, + "engines": { + "node": ">=16.8.0" + } + }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", @@ -18397,9 +19574,9 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.98.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", - "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "version": "5.99.6", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.6.tgz", + "integrity": "sha512-TJOLrJ6oeccsGWPl7ujCYuc0pIq2cNsuD6GZDma8i5o5Npvcco/z+NKvZSFsP0/x6SShVb0+X2JK/JHUjKY9dQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18974,6 +20151,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/debridge_node/package.json b/debridge_node/package.json index 06f895a..0c78b9b 100644 --- a/debridge_node/package.json +++ b/debridge_node/package.json @@ -21,59 +21,59 @@ "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { - "@ardrive/turbo-sdk": "1.23.0", + "@ardrive/turbo-sdk": "1.25.0", "@debridge-finance/solana-grpc": "1.1.3", "@debridge-finance/solana-utils": "4.5.5", "@fastify/static": "8.1.1", "@nestjs/axios": "4.0.0", - "@nestjs/common": "11.0.11", - "@nestjs/config": "4.0.1", - "@nestjs/core": "11.0.11", + "@nestjs/common": "11.1.1", + "@nestjs/config": "4.0.2", + "@nestjs/core": "11.1.1", "@nestjs/jwt": "11.0.0", "@nestjs/passport": "11.0.5", - "@nestjs/platform-fastify": "11.0.11", + "@nestjs/platform-fastify": "11.1.1", "@nestjs/schedule": "5.0.1", - "@nestjs/swagger": "11.0.6", + "@nestjs/swagger": "11.2.0", "@nestjs/throttler": "6.4.0", "@nestjs/typeorm": "11.0.0", - "@sentry/node": "7.119.0", - "@solana/web3.js": "1.98.0", + "@sentry/node": "8.55.0", + "@solana/web3.js": "1.98.2", "arbundles": "0.11.2", "class-transformer": "0.5.1", - "class-validator": "0.14.1", - "dotenv": "16.4.7", + "class-validator": "0.14.2", + "dotenv": "16.5.0", "passport": "0.7.0", "passport-jwt": "4.0.1", - "pg": "8.14.1", + "pg": "8.16.0", "reflect-metadata": "0.1.14", - "rxjs": "7.8.1", - "typeorm": "0.3.21", + "rxjs": "7.8.2", + "typeorm": "0.3.24", "web3": "1.10.4", "web3-eth-contract": "1.10.4" }, "devDependencies": { - "@nestjs/cli": "11.0.5", - "@nestjs/schematics": "11.0.2", - "@nestjs/testing": "11.0.11", + "@nestjs/cli": "11.0.7", + "@nestjs/schematics": "11.0.5", + "@nestjs/testing": "11.1.1", "@types/cron": "2.4.3", "@types/jest": "29.5.14", - "@types/node": "22.13.10", + "@types/node": "22.15.18", "@types/passport-jwt": "4.0.1", - "@types/pg": "8.11.11", + "@types/pg": "8.15.2", "@types/supertest": "2.0.16", - "@typescript-eslint/eslint-plugin": "7.18.0", - "@typescript-eslint/parser": "7.18.0", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "eslint": "8.57.1", "eslint-config-prettier": "9.1.0", - "eslint-plugin-prettier": "5.2.3", + "eslint-plugin-prettier": "5.4.0", "jest": "29.7.0", "prettier": "3.5.3", "supertest": "6.3.4", - "ts-jest": "29.2.6", + "ts-jest": "29.3.4", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "typescript": "5.8.2" + "typescript": "5.8.3" }, "jest": { "moduleFileExtensions": [ diff --git a/debridge_node/src/AppModule.ts b/debridge_node/src/AppModule.ts index e545835..8226118 100644 --- a/debridge_node/src/AppModule.ts +++ b/debridge_node/src/AppModule.ts @@ -13,6 +13,7 @@ import { ChainConfigModule } from './modules/chain/config/ChainConfigModule'; import { ApiModule } from './modules/api/ApiModule'; import { SolanaEventsReaderModule } from './modules/solana-events-reader/SolanaEventsReaderModule'; import { DataLoaderModule } from './data-loader/data-loader.module'; +import { MonitoringSendEventEntity } from './entities/MonitoringSendEventEntity'; @Module({ imports: [ @@ -33,10 +34,10 @@ import { DataLoaderModule } from './data-loader/data-loader.module'; password: configService.get('POSTGRES_PASSWORD', 'password'), database: configService.get('POSTGRES_DATABASE', 'postgres'), synchronize: true, - entities: [SubmissionEntity, SupportedChainEntity, ConfirmNewAssetEntity], + entities: [SubmissionEntity, SupportedChainEntity, ConfirmNewAssetEntity, MonitoringSendEventEntity], }), }), - TypeOrmModule.forFeature([SubmissionEntity, SupportedChainEntity, ConfirmNewAssetEntity]), + TypeOrmModule.forFeature([SubmissionEntity, SupportedChainEntity, ConfirmNewAssetEntity, MonitoringSendEventEntity]), Web3Module, DebridgeApiModule, JobModule, diff --git a/debridge_node/src/assets/DeBridgeGate.json b/debridge_node/src/assets/DeBridgeGate.json index d1fb695..7c92841 100644 --- a/debridge_node/src/assets/DeBridgeGate.json +++ b/debridge_node/src/assets/DeBridgeGate.json @@ -596,6 +596,37 @@ "name": "Sent", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "submissionId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lockedOrMintedAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalSupply", + "type": "uint256" + } + ], + "name": "MonitoringSendEvent", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -1955,4 +1986,4 @@ "type": "function" } ] -} \ No newline at end of file +} diff --git a/debridge_node/src/data-loader/missed-events.service.ts b/debridge_node/src/data-loader/missed-events.service.ts index c363306..311c60b 100644 --- a/debridge_node/src/data-loader/missed-events.service.ts +++ b/debridge_node/src/data-loader/missed-events.service.ts @@ -4,9 +4,9 @@ import { Repository } from 'typeorm'; import { SubmissionEntity } from '../entities/SubmissionEntity'; import missedEvents from '../config/datafixes/missed_events.json'; import { BundlrStatusEnum } from '../enums/BundlrStatusEnum'; -import { SubmisionAssetsStatusEnum } from '../enums/SubmisionAssetsStatusEnum'; +import { SubmissionAssetsStatusEnum } from '../enums/SubmissionAssetsStatusEnum'; import { UploadStatusEnum } from '../enums/UploadStatusEnum'; -import { SubmisionStatusEnum } from '../enums/SubmisionStatusEnum'; +import { SubmissionStatusEnum } from '../enums/SubmissionStatusEnum'; @Injectable() export class MissedEventsService implements OnModuleInit { @@ -69,11 +69,11 @@ export class MissedEventsService implements OnModuleInit { receiverAddr: event.receiverAddr, amount: event.amount, rawEvent: event.rawEvent, - status: SubmisionStatusEnum.NEW, + status: SubmissionStatusEnum.NEW, ipfsStatus: UploadStatusEnum.NEW, apiStatus: UploadStatusEnum.NEW, bundlrStatus: BundlrStatusEnum.NEW, - assetsStatus: SubmisionAssetsStatusEnum.NEW, + assetsStatus: SubmissionAssetsStatusEnum.NEW, nonce: event.nonce, blockNumber: event.blockNumber, } as SubmissionEntity; diff --git a/debridge_node/src/entities/BalanceSheetEntity.ts b/debridge_node/src/entities/BalanceSheetEntity.ts new file mode 100644 index 0000000..9cfba31 --- /dev/null +++ b/debridge_node/src/entities/BalanceSheetEntity.ts @@ -0,0 +1,24 @@ +import { Column, Entity, PrimaryColumn, Unique } from 'typeorm'; + +@Entity('balance_sheet') +@Unique(['debridgeId']) +export class BalanceSheetEntity { + @PrimaryColumn() + debridgeId: string; + + @Column() + chainId: number; + + @Column({ + type: 'numeric', + transformer: { + to(data: bigint): bigint { + return data; + }, + from(data: string): bigint { + return BigInt(data); + }, + }, + }) + amount: bigint; +} diff --git a/debridge_node/src/entities/ConfirmNewAssetEntity.ts b/debridge_node/src/entities/ConfirmNewAssetEntity.ts index ae4cc96..6a18f50 100644 --- a/debridge_node/src/entities/ConfirmNewAssetEntity.ts +++ b/debridge_node/src/entities/ConfirmNewAssetEntity.ts @@ -1,5 +1,5 @@ import { Column, Index, Entity, PrimaryColumn, Unique } from 'typeorm'; -import { SubmisionStatusEnum } from '../enums/SubmisionStatusEnum'; +import { SubmissionStatusEnum } from '../enums/SubmissionStatusEnum'; import { UploadStatusEnum } from '../enums/UploadStatusEnum'; import { BundlrStatusEnum } from '../enums/BundlrStatusEnum'; @@ -64,7 +64,7 @@ export class ConfirmNewAssetEntity { @Column() @Index() - status: SubmisionStatusEnum; + status: SubmissionStatusEnum; @Column() @Index() diff --git a/debridge_node/src/entities/MonitoringSendEventEntity.ts b/debridge_node/src/entities/MonitoringSendEventEntity.ts new file mode 100644 index 0000000..d2bd6b9 --- /dev/null +++ b/debridge_node/src/entities/MonitoringSendEventEntity.ts @@ -0,0 +1,45 @@ +import { Column, CreateDateColumn, Entity, PrimaryColumn, UpdateDateColumn } from 'typeorm'; + +@Entity('monitoring_send_events') +export class MonitoringSendEventEntity { + @PrimaryColumn() + submissionId: string; + + @Column() + nonce: number; + + @Column({ + type: 'numeric', + transformer: { + to(data: bigint): bigint { + return data; + }, + from(data: string): bigint { + return BigInt(data); + }, + }, + }) + lockedOrMintedAmount: bigint; + + @Column({ + type: 'numeric', + transformer: { + to(data: bigint): bigint { + return data; + }, + from(data: string): bigint { + return BigInt(data); + }, + }, + }) + totalSupply: bigint; + + @Column() + rawEvent: string; + + @CreateDateColumn() + createdAt: Date; + + @UpdateDateColumn() + updatedAt: Date; +} diff --git a/debridge_node/src/entities/SubmissionEntity.ts b/debridge_node/src/entities/SubmissionEntity.ts index 1d0c89b..2977df4 100644 --- a/debridge_node/src/entities/SubmissionEntity.ts +++ b/debridge_node/src/entities/SubmissionEntity.ts @@ -1,8 +1,10 @@ import { Column, CreateDateColumn, UpdateDateColumn, Entity, Index, PrimaryColumn, Unique } from 'typeorm'; -import { SubmisionStatusEnum } from '../enums/SubmisionStatusEnum'; -import { SubmisionAssetsStatusEnum } from '../enums/SubmisionAssetsStatusEnum'; +import { SubmissionStatusEnum } from '../enums/SubmissionStatusEnum'; +import { SubmissionAssetsStatusEnum } from '../enums/SubmissionAssetsStatusEnum'; import { UploadStatusEnum } from '../enums/UploadStatusEnum'; import { BundlrStatusEnum } from '../enums/BundlrStatusEnum'; +import { BalanceValidationStatusEnum } from '../enums/BalanceValidationStatusEnum'; +import { SubmissionTypeEnum } from '../enums/SubmissionTypeEnum'; @Entity('submissions') @Unique(['submissionId']) @@ -60,7 +62,7 @@ export class SubmissionEntity { @Column() @Index() - status: SubmisionStatusEnum; + status: SubmissionStatusEnum; @Column() @Index() @@ -72,11 +74,15 @@ export class SubmissionEntity { @Column({ nullable: true }) @Index() - bundlrStatus: BundlrStatusEnum; + balanceValidationStatus?: BalanceValidationStatusEnum; + + @Column({ nullable: true }) + @Index() + bundlrStatus?: BundlrStatusEnum; @Column() @Index() - assetsStatus: SubmisionAssetsStatusEnum; + assetsStatus: SubmissionAssetsStatusEnum; @Column({ nullable: true }) @Index() @@ -93,6 +99,12 @@ export class SubmissionEntity { @Column({ nullable: true, default: 0 }) decimalDenominator?: number; + @Column({ nullable: true }) + type?: SubmissionTypeEnum; + + @Column({ nullable: true }) + executionFee?: string; + @CreateDateColumn() createdAt: Date; diff --git a/debridge_node/src/enums/BalanceValidationStatusEnum.ts b/debridge_node/src/enums/BalanceValidationStatusEnum.ts new file mode 100644 index 0000000..53c60ce --- /dev/null +++ b/debridge_node/src/enums/BalanceValidationStatusEnum.ts @@ -0,0 +1,6 @@ +export enum BalanceValidationStatusEnum { + RECEIVED = 1, + ON_HOLD = 2, + COMPLETED = 3, + ERROR = 4, +} diff --git a/debridge_node/src/enums/SubmisionStatusEnum.ts b/debridge_node/src/enums/SubmisionStatusEnum.ts deleted file mode 100644 index c3915aa..0000000 --- a/debridge_node/src/enums/SubmisionStatusEnum.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum SubmisionStatusEnum { - NEW = 1, - SIGNED = 2, -} diff --git a/debridge_node/src/enums/SubmisionAssetsStatusEnum.ts b/debridge_node/src/enums/SubmissionAssetsStatusEnum.ts similarity index 61% rename from debridge_node/src/enums/SubmisionAssetsStatusEnum.ts rename to debridge_node/src/enums/SubmissionAssetsStatusEnum.ts index 96155c9..fef725c 100644 --- a/debridge_node/src/enums/SubmisionAssetsStatusEnum.ts +++ b/debridge_node/src/enums/SubmissionAssetsStatusEnum.ts @@ -1,4 +1,4 @@ -export enum SubmisionAssetsStatusEnum { +export enum SubmissionAssetsStatusEnum { NEW = 1, ASSETS_CREATED = 2, ASSETS_ALREADY_CREATED = 3, diff --git a/debridge_node/src/enums/SubmissionStatusEnum.ts b/debridge_node/src/enums/SubmissionStatusEnum.ts new file mode 100644 index 0000000..7d6728e --- /dev/null +++ b/debridge_node/src/enums/SubmissionStatusEnum.ts @@ -0,0 +1,4 @@ +export enum SubmissionStatusEnum { + NEW = 1, + SIGNED = 2, +} diff --git a/debridge_node/src/enums/SubmissionTypeEnum.ts b/debridge_node/src/enums/SubmissionTypeEnum.ts new file mode 100644 index 0000000..f807fa6 --- /dev/null +++ b/debridge_node/src/enums/SubmissionTypeEnum.ts @@ -0,0 +1,4 @@ +export enum SubmissionTypeEnum { + Sent = 'Sent', + Burn = 'Burn', +} diff --git a/debridge_node/src/modules/api/services/RescanService.ts b/debridge_node/src/modules/api/services/RescanService.ts index d1c3f6d..99ace25 100644 --- a/debridge_node/src/modules/api/services/RescanService.ts +++ b/debridge_node/src/modules/api/services/RescanService.ts @@ -1,7 +1,7 @@ import { HttpException, HttpStatus, Logger } from '@nestjs/common'; import { ChainConfigService } from '../../chain/config/services/ChainConfigService'; import { EvmChainConfig } from '../../chain/config/models/configs/EvmChainConfig'; -import { AddNewEventsAction } from '../../chain/scanning/services/AddNewEventsAction'; +import { EvmNewEventsReaderAction } from '../../chain/scanning/services/EvmNewEventsReaderAction'; /** * Rescan service @@ -10,7 +10,7 @@ export class RescanService { private readonly logger = new Logger(); constructor( - private readonly addNewEventsAction: AddNewEventsAction, + private readonly addNewEventsAction: EvmNewEventsReaderAction, private readonly chainConfigService: ChainConfigService, ) {} diff --git a/debridge_node/src/modules/balance-sheet/BalanceSheetModule.ts b/debridge_node/src/modules/balance-sheet/BalanceSheetModule.ts new file mode 100644 index 0000000..2d9338c --- /dev/null +++ b/debridge_node/src/modules/balance-sheet/BalanceSheetModule.ts @@ -0,0 +1,28 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { SubmissionEntity } from '../../entities/SubmissionEntity'; +import { MonitoringSendEventEntity } from '../../entities/MonitoringSendEventEntity'; +import { BalanceSheetEntity } from '../../entities/BalanceSheetEntity'; +import { ValidateSynchronizationService } from './services/utils/ValidateSynchronizationService'; +import { BalanceValidationStatusService } from './services/utils/BalanceValidationStatusService'; +import { DebridgeValidationService } from './services/utils/DebridgeValidationService'; +import { SubmissionDataService } from './services/utils/SubmissionDataService'; +import { BalanceSheetInitializatorService } from './services/utils/BalanceSheetInitializatorService'; +import { BalanceProcessorService } from './services/BalanceProcessorService'; +import { SupportedChainEntity } from '../../entities/SupportedChainEntity'; +import { BalanceValidationService } from './services/BalanceValidationService'; + +@Module({ + imports: [TypeOrmModule.forFeature([SubmissionEntity, MonitoringSendEventEntity, BalanceSheetEntity, SupportedChainEntity])], + providers: [ + DebridgeValidationService, + ValidateSynchronizationService, + BalanceValidationStatusService, + BalanceValidationService, + SubmissionDataService, + BalanceSheetInitializatorService, + BalanceProcessorService, + ], + exports: [BalanceProcessorService], +}) +export class BalanceSheetModule {} diff --git a/debridge_node/src/modules/balance-sheet/services/BalanceProcessorService.ts b/debridge_node/src/modules/balance-sheet/services/BalanceProcessorService.ts new file mode 100644 index 0000000..a0c0383 --- /dev/null +++ b/debridge_node/src/modules/balance-sheet/services/BalanceProcessorService.ts @@ -0,0 +1,91 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { In, Repository } from 'typeorm'; +import { SubmissionEntity } from '../../../entities/SubmissionEntity'; +import { Not } from 'typeorm'; +import { BalanceValidationStatusEnum } from 'src/enums/BalanceValidationStatusEnum'; +import { BalanceValidationService } from './BalanceValidationService'; + +@Injectable() +export class BalanceProcessorService { + readonly #logger = new Logger(BalanceProcessorService.name); + readonly #submissionsRepository: Repository; + readonly #balanceValidationService: BalanceValidationService; + + constructor( + @InjectRepository(SubmissionEntity) + submissionsRepository: Repository, + balanceValidationService: BalanceValidationService, + ) { + this.#submissionsRepository = submissionsRepository; + this.#balanceValidationService = balanceValidationService; + } + + /** + * Processes submissions in batches, fills missing data and calculates balance + * + * Uses the async iterator to process submissions in batches. For each submission, it fills missing data and calculates the balance. + */ + async processSubmissions(): Promise { + const debridgeIds = await this.#submissionsRepository.createQueryBuilder('submission') + .select('DISTINCT submission.debridgeId') + .where('submission.balanceValidationStatus NOT IN (:...statuses)', { + statuses: [BalanceValidationStatusEnum.COMPLETED, BalanceValidationStatusEnum.ERROR], + }) + .getMany() + .then(submissions => submissions.map(s => s.debridgeId)); + + for (const debridgeId of debridgeIds) { + for await (const submissions of await this.#submissionsIterator(debridgeId)) { + this.#logger.log(`Processing ${submissions.length} submissions`); + for (const submission of submissions) { + try { + await this.#balanceValidationService.processSubmission(submission); + } catch (error) { + this.#logger.error(`Processing submission ${submission.submissionId} failed`, error); + if (await this.isSubmissionSkipped(submission.submissionId)) { + this.#logger.log(`Submission ${submission.submissionId} is skipped`); + continue; + } + throw error; + } + } + } + } + } + + async isSubmissionSkipped(submissionId: string): Promise { + const submission = await this.#submissionsRepository.findOne({ where: { submissionId } }); + return submission?.balanceValidationStatus === BalanceValidationStatusEnum.ON_HOLD; + } + + /** + * Create an async iterator for submissions to process them in batches + * @param batchSize The number of submissions to process in each batch + */ + async *#submissionsIterator(debridgeId: string, batchSize: number = 100): AsyncGenerator { + let page = 1; + let hasMoreData = true; + + while (hasMoreData) { + const submissions = await this.#submissionsRepository.find({ + where: { + balanceValidationStatus: Not(In([BalanceValidationStatusEnum.COMPLETED, BalanceValidationStatusEnum.ERROR])), + }, + order: { + nonce: 'ASC', + createdAt: 'ASC', + }, + skip: (page - 1) * batchSize, + take: batchSize, + }); + + if (submissions.length > 0) { + yield submissions; + page++; + } else { + hasMoreData = false; + } + } + } +} diff --git a/debridge_node/src/modules/balance-sheet/services/BalanceValidationService.ts b/debridge_node/src/modules/balance-sheet/services/BalanceValidationService.ts new file mode 100644 index 0000000..88c9d53 --- /dev/null +++ b/debridge_node/src/modules/balance-sheet/services/BalanceValidationService.ts @@ -0,0 +1,156 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { SubmissionEntity } from '../../../entities/SubmissionEntity'; +import { ValidateSynchronizationService } from './utils/ValidateSynchronizationService'; +import { DebridgeValidationService } from './utils/DebridgeValidationService'; +import { BalanceValidationStatusService } from './utils/BalanceValidationStatusService'; +import { SubmissionDataService } from './utils/SubmissionDataService'; +import { BalanceSheetInitializatorService } from './utils/BalanceSheetInitializatorService'; +import { SubmissionTypeEnum } from '../../../enums/SubmissionTypeEnum'; +import { MonitoringSendEventEntity } from '../../../entities/MonitoringSendEventEntity'; +import { BalanceSheetEntity } from '../../../entities/BalanceSheetEntity'; + +@Injectable() +export class BalanceValidationService { + readonly #logger = new Logger(BalanceValidationService.name); + readonly #balanceSheetInitializatorService: BalanceSheetInitializatorService; + readonly #debridgeValidationService: DebridgeValidationService; + readonly #validateSynchronizationService: ValidateSynchronizationService; + readonly #monitoringSendEventRepository: Repository; + readonly #balanceValidationStatusService: BalanceValidationStatusService; + readonly #submissionDataService: SubmissionDataService; + + constructor( + balanceSheetInitializatorService: BalanceSheetInitializatorService, + @InjectRepository(MonitoringSendEventEntity) + monitoringSendEventRepository: Repository, + debridgeValidationService: DebridgeValidationService, + validateSynchronizationService: ValidateSynchronizationService, + balanceValidationStatusService: BalanceValidationStatusService, + submissionDataService: SubmissionDataService, + ) { + this.#balanceSheetInitializatorService = balanceSheetInitializatorService; + this.#monitoringSendEventRepository = monitoringSendEventRepository; + this.#debridgeValidationService = debridgeValidationService; + this.#validateSynchronizationService = validateSynchronizationService; + this.#balanceValidationStatusService = balanceValidationStatusService; + this.#submissionDataService = submissionDataService; + } + + /** + * Processes submissions in batches, fills missing data and calculates balance + * + * Uses the async iterator to process submissions in batches. For each submission, it fills missing data and calculates the balance. + */ + async processSubmission(submission: SubmissionEntity): Promise { + this.#logger.log(`Processing submission ${submission.submissionId} started`); + await this.#submissionDataService.fillMissingData(submission); + await this.#processBalance(submission); + + this.#logger.log(`Processing submission ${submission.submissionId} finished`); + } + + + /** + * Calculates the balance of sender and receiver based on the submission type + * + * For Sent submissions, it adds the amount and execution fee to both the sender and receiver balances + * For Burn submissions, it subtracts the amount and execution fee from both the sender and receiver balances + * unless the submission is a return to native chain submission, in which case it adds the amount and execution fee to the sender balance + * and subtracts it from the receiver balance. + * + * @param submission The submission entity to process + */ + async #processBalance(submission: SubmissionEntity) { + const [senderBalance, receiverBalance] = await this.#balanceSheetInitializatorService.getOrCreateBalanceSheetEntities(submission); + const D = BigInt(submission.amount) + BigInt(submission.executionFee); + const monitorSendEvent = await this.#monitoringSendEventRepository.findOneBy({ submissionId: submission.submissionId }); + switch (submission.type) { + case SubmissionTypeEnum.Sent: + senderBalance.amount = senderBalance.amount + D; + receiverBalance.amount = receiverBalance.amount + D; + await this.#compareBalance(senderBalance, receiverBalance, submission, monitorSendEvent); + break; + case SubmissionTypeEnum.Burn: + const isReturnToNativeChain = await this.#debridgeValidationService.isReturnToNativeChain(submission); + if (isReturnToNativeChain) { + senderBalance.amount = senderBalance.amount - D; + receiverBalance.amount = receiverBalance.amount - D; + } else { + senderBalance.amount = senderBalance.amount + D; + receiverBalance.amount = receiverBalance.amount - D; + } + if (senderBalance.amount < 0) { + await this.#validateSynchronizationService.validate(submission, 'Sender balance is less than 0'); + } + if (receiverBalance.amount < 0) { + await this.#validateSynchronizationService.validate(submission, 'Receiver balance is less than 0'); + } + await this.#compareBurnEventBalance(senderBalance, receiverBalance, submission, monitorSendEvent); + break; + default: + break; + } + } + + async #compareBurnEventBalance( + senderBalance: BalanceSheetEntity, + receiverBalance: BalanceSheetEntity, + submission: SubmissionEntity, + monitorSendEvent: MonitoringSendEventEntity, + ) { + if (monitorSendEvent.lockedOrMintedAmount === senderBalance.amount) { + await this.#compareBalance(senderBalance, receiverBalance, submission, monitorSendEvent); + } else { + await this.#validateSynchronizationService.validate(submission, 'Locked or minted amount is not equal to sender balance'); + } + } + + /** + * Compares calculated balance with monitoring event data + * + * Validates that the calculated balance matches the expected values from monitoring events + * + * If the submission is a DeAsset transfer, the balance validation is skipped + * If the submission is a return to native chain, the balance validation is only completed if the locked amount from the monitoring event + * is less than or equal to the sender's balance + * Otherwise, the balance validation is only completed if the locked amount from the monitoring event + * is equal to the sender's balance and the total supply from the monitoring event is equal to the receiver's balance + * + * @param senderBalance The balance sheet entity for the sender chain + * @param receiverBalance The balance sheet entity for the receiver chain + * @param submission The submission entity being processed + * @param monitorSendEvent The monitoring event containing expected balance values + * @returns Promise that resolves when the comparison is complete + */ + async #compareBalance( + senderBalance: BalanceSheetEntity, + receiverBalance: BalanceSheetEntity, + submission: SubmissionEntity, + monitorSendEvent: MonitoringSendEventEntity, + ): Promise { + const isDeAssetTransfer = await this.#debridgeValidationService.isDeAssetTransfer(submission); + if (!isDeAssetTransfer) { + await this.#balanceValidationStatusService.complete(submission, senderBalance, receiverBalance); + } + const isReturnToNativeChain = await this.#debridgeValidationService.isReturnToNativeChain(submission); + if (isReturnToNativeChain) { + if (monitorSendEvent.lockedOrMintedAmount < senderBalance.amount) { + await this.#validateSynchronizationService.validate(submission, 'Locked or minted amount is less than sender balance'); + } else { + await this.#balanceValidationStatusService.complete(submission, senderBalance, receiverBalance); + } + } else { + if (monitorSendEvent.lockedOrMintedAmount > senderBalance.amount) { + await this.#validateSynchronizationService.validate(submission, 'Locked or minted amount is greater than sender balance'); + } else { + if (monitorSendEvent.lockedOrMintedAmount === monitorSendEvent.totalSupply) { + await this.#balanceValidationStatusService.complete(submission, senderBalance, receiverBalance); + } else { + await this.#balanceValidationStatusService.fail(submission, `monitorSendEvent.lockedOrMintedAmount !== monitorSendEvent.totalSupply`); + } + } + } + } +} diff --git a/debridge_node/src/modules/balance-sheet/services/utils/BalanceSheetInitializatorService.ts b/debridge_node/src/modules/balance-sheet/services/utils/BalanceSheetInitializatorService.ts new file mode 100644 index 0000000..59989bf --- /dev/null +++ b/debridge_node/src/modules/balance-sheet/services/utils/BalanceSheetInitializatorService.ts @@ -0,0 +1,65 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { BalanceSheetEntity } from '../../../../entities/BalanceSheetEntity'; +import { SubmissionEntity } from '../../../../entities/SubmissionEntity'; + +/** + * Service for managing balance sheet entities + * + * Handles the creation and retrieval of balance sheet entities for different chains + */ +@Injectable() +export class BalanceSheetInitializatorService { + readonly #logger = new Logger(BalanceSheetInitializatorService.name); + readonly #balanceSheetRepository: Repository; + + constructor( + @InjectRepository(BalanceSheetEntity) + balanceSheetRepository: Repository, + ) { + this.#balanceSheetRepository = balanceSheetRepository; + } + + /** + * Gets or creates balance sheet entities for source and destination chains + * @param submission The submission entity containing debridgeId, chainFrom, and chainTo + * @returns Promise with an array of two BalanceSheetEntity objects [sourceChainEntity, destChainEntity] + */ + async getOrCreateBalanceSheetEntities( + submission: SubmissionEntity, + ): Promise<[BalanceSheetEntity, BalanceSheetEntity]> { + // Get or create entities for both chains + const sourceChainEntity = await this.#getOrCreateBalanceSheetEntity(submission.debridgeId, submission.chainFrom); + const destChainEntity = await this.#getOrCreateBalanceSheetEntity(submission.debridgeId, submission.chainTo); + + return [sourceChainEntity, destChainEntity]; + } + + /** + * Gets or creates a single balance sheet entity for the given debridgeId and chainId + * @param debridgeId The debridge ID + * @param chainId The chain ID + * @returns Promise with the found or created BalanceSheetEntity + */ + async #getOrCreateBalanceSheetEntity( + debridgeId: string, + chainId: number, + ): Promise { + // Check if entity exists + let entity = await this.#balanceSheetRepository.findOne({ + where: { debridgeId, chainId }, + }); + + // Create entity if it doesn't exist + if (!entity) { + entity = new BalanceSheetEntity(); + entity.debridgeId = debridgeId; + entity.chainId = chainId; + entity.amount = 0n; + this.#logger.log(`Created new balance sheet entity for debridgeId ${debridgeId} on chain ${chainId}`); + } + + return entity; + } +} diff --git a/debridge_node/src/modules/balance-sheet/services/utils/BalanceValidationStatusService.ts b/debridge_node/src/modules/balance-sheet/services/utils/BalanceValidationStatusService.ts new file mode 100644 index 0000000..561ae9f --- /dev/null +++ b/debridge_node/src/modules/balance-sheet/services/utils/BalanceValidationStatusService.ts @@ -0,0 +1,66 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { EntityManager } from 'typeorm'; +import { InjectEntityManager } from '@nestjs/typeorm'; +import { ChainScanningService } from '../../../chain/scanning/services/ChainScanningService'; +import { DebrdigeApiService } from '../../../external/debridge_api/services/DebrdigeApiService'; +import { SubmissionEntity } from '../../../../entities/SubmissionEntity'; +import { BalanceValidationStatusEnum } from '../../../../enums/BalanceValidationStatusEnum'; +import { BalanceSheetEntity } from '../../../../entities/BalanceSheetEntity'; + +@Injectable() +export class BalanceValidationStatusService { + readonly #logger = new Logger(BalanceValidationStatusService.name); + readonly #entityManager: EntityManager; + readonly #debrdigeApiService: DebrdigeApiService; + readonly #chainScanningService: ChainScanningService; + + constructor( + @InjectEntityManager() + entityManager: EntityManager, + debrdigeApiService: DebrdigeApiService, + chainScanningService: ChainScanningService, + ) { + this.#entityManager = entityManager; + this.#debrdigeApiService = debrdigeApiService; + this.#chainScanningService = chainScanningService; + } + + /** + * Completes the balance validation by updating the submission status and saving balance sheets + * within a transaction + * + * @param submission The submission entity to update + * @param senderBalance The sender's balance sheet entity + * @param receiverBalance The receiver's balance sheet entity + * @returns Promise that resolves when the transaction is complete + */ + async complete(submission: SubmissionEntity, senderBalance: BalanceSheetEntity, receiverBalance: BalanceSheetEntity): Promise { + await this.#entityManager.transaction(async entityManager => { + submission.balanceValidationStatus = BalanceValidationStatusEnum.COMPLETED; + await entityManager.save(SubmissionEntity, submission); + await entityManager.save(BalanceSheetEntity, [senderBalance, receiverBalance]); + }); + this.#logger.log(`Balance validation completed for submission ${submission.submissionId}`); + } + + /** + * Marks the balance validation as failed by updating the submission status + * within a transaction + * + * @param submission The submission entity to update + * @param comment Optional comment to log + * @returns Promise that resolves when the transaction is complete + */ + async fail(submission: SubmissionEntity, comment: string): Promise { + await this.#entityManager.transaction(async entityManager => { + submission.balanceValidationStatus = BalanceValidationStatusEnum.ERROR; + await entityManager.save(SubmissionEntity, submission); + }); + const message = `Balance validation failed for submission ${submission.submissionId}: ${comment}`; + await this.#debrdigeApiService.notifyError(message); + this.#chainScanningService.pause(submission.chainFrom); + + this.#logger.error(message); + throw new Error(message); + } +} diff --git a/debridge_node/src/modules/balance-sheet/services/utils/DebridgeValidationService.ts b/debridge_node/src/modules/balance-sheet/services/utils/DebridgeValidationService.ts new file mode 100644 index 0000000..186af3a --- /dev/null +++ b/debridge_node/src/modules/balance-sheet/services/utils/DebridgeValidationService.ts @@ -0,0 +1,89 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { SubmissionEntity } from '../../../../entities/SubmissionEntity'; +import { U256Converter } from '@debridge-finance/solana-grpc'; +import { abi as deBridgeGateAbi } from '../../../../assets/DeBridgeGate.json'; +import { ChainConfigService } from '../../../chain/config/services/ChainConfigService'; +import { Web3Service } from '../../../web3/services/Web3Service'; +import { EvmChainConfig } from '../../../chain/config/models/configs/EvmChainConfig'; +import { SolanaEventsReaderService } from '../../../solana-events-reader/services/SolanaEventsReaderService'; + +@Injectable() +export class DebridgeValidationService { + readonly #logger = new Logger(DebridgeValidationService.name); + + readonly #chainConfigService: ChainConfigService; + readonly #web3Service: Web3Service; + readonly #solanaEventsReaderService: SolanaEventsReaderService; + + constructor(chainConfigService: ChainConfigService, web3Service: Web3Service, solanaEventsReaderService: SolanaEventsReaderService) { + this.#chainConfigService = chainConfigService; + this.#web3Service = web3Service; + this.#solanaEventsReaderService = solanaEventsReaderService; + } + + /** + * Checks if the chainTo in the submission is equal to the nativeChainId of the token + * @param submission The submission entity to validate + * @returns True if chainTo equals nativeChainId, false otherwise + */ + async isReturnToNativeChain(submission: SubmissionEntity): Promise { + try { + const nativeChainId = await this.#getNativeChainId(submission); + + // Compare chainTo with nativeChainId + const isValid = submission.chainTo === nativeChainId; + + return isValid; + } catch (error) { + this.#logger.error(`Error validating return native chain for submission ${submission.submissionId}: ${error.message}`, error.stack); + throw error; + } + } + + /** + * Checks if the chainFrom in the submission is different from the nativeChainId of the token + * @param submission The submission entity to validate + * @returns True if chainFrom is different from nativeChainId, false otherwise + */ + async isDeAssetTransfer(submission: SubmissionEntity): Promise { + try { + const nativeChainId = await this.#getNativeChainId(submission); + + // Compare chainFrom with nativeChainId + const isValid = submission.chainFrom !== nativeChainId; + + return isValid; + } catch (error) { + this.#logger.error(`Error validating DeAsset transfer for submission ${submission.submissionId}: ${error.message}`, error.stack); + throw error; + } + } + + /** + * Retrieves the native chain ID for a given submission + * @param submission The submission entity + * @returns The native chain ID of the token + */ + async #getNativeChainId(submission: SubmissionEntity): Promise { + const chainFromConfig = this.#chainConfigService.get(submission.chainFrom); + let nativeChainId: number; + + // Get nativeChainId based on the chain type (Solana or EVM) + if (chainFromConfig.isSolana) { + // For Solana chains + const { response: bridgeInfo } = await this.#solanaEventsReaderService + .getClient() + .getBridgeInfoByBridgeId(Buffer.from(submission.debridgeId.slice(2), 'hex')); + nativeChainId = parseInt(U256Converter.toBigInt(bridgeInfo.nativeChainId).toString()); + } else { + // For EVM chains + const evmChainConfig = chainFromConfig as EvmChainConfig; + const web3 = await this.#web3Service.web3HttpProvider(evmChainConfig); + const deBridgeGateInstance = new web3.eth.Contract(deBridgeGateAbi as any, evmChainConfig.debridgeAddr); + const debridgeInfo = await deBridgeGateInstance.methods.getDebridge(submission.debridgeId).call(); + nativeChainId = Number(debridgeInfo.chainId.toString()); + } + + return nativeChainId; + } +} diff --git a/debridge_node/src/modules/balance-sheet/services/utils/SubmissionDataService.ts b/debridge_node/src/modules/balance-sheet/services/utils/SubmissionDataService.ts new file mode 100644 index 0000000..083e8e5 --- /dev/null +++ b/debridge_node/src/modules/balance-sheet/services/utils/SubmissionDataService.ts @@ -0,0 +1,74 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { SubmissionEntity } from '../../../../entities/SubmissionEntity'; +import { ChainConfigService } from '../../../chain/config/services/ChainConfigService'; +import { buildEvmAutoParams, buildSolanaAutoParams } from '../../../../utils/buildAutoParams'; +import { SolanaEventsReaderService } from '../../../solana-events-reader/services/SolanaEventsReaderService'; +import { SubmissionTypeEnum } from '../../../../enums/SubmissionTypeEnum'; +import { U256Converter } from '@debridge-finance/solana-grpc'; + +/** + * Service for filling missing data in submission entities + * + * Extracts and populates data from raw events based on chain type: + * - For Solana chains: extracts execution fee + * - For EVM chains: extracts both event type and execution fee + */ +@Injectable() +export class SubmissionDataService { + + readonly #submissionsRepository: Repository; + readonly #chainConfigService: ChainConfigService; + readonly #solanaEventsReaderService: SolanaEventsReaderService; + + /** + * Constructor for SubmissionDataService + * + * @param submissionsRepository Repository for submission entities + * @param chainConfigService Service for chain configuration + */ + constructor( + @InjectRepository(SubmissionEntity) + submissionsRepository: Repository, + chainConfigService: ChainConfigService, + solanaEventsReaderService: SolanaEventsReaderService, + ) { + this.#submissionsRepository = submissionsRepository; + this.#chainConfigService = chainConfigService; + this.#solanaEventsReaderService = solanaEventsReaderService; + } + + /** + * Fills missing data in a submission entity based on its chain type + * + * For Solana chains, it extracts execution fee from the raw event + * For EVM chains, it extracts both the event type and execution fee + * + * @param submission The submission entity to update + * @returns Promise that resolves when the submission is updated and saved + */ + async fillMissingData(submission: SubmissionEntity): Promise { + if (submission.type) return; + + const chainDetail = this.#chainConfigService.get(submission.chainFrom); + if (chainDetail?.isSolana) { + const bridgeInfo = await this.#solanaEventsReaderService.getClient().getBridgeInfoByBridgeId(Buffer.from(submission.debridgeId.slice(2), 'hex')); + const nativeChainId = parseInt(U256Converter.toBigInt(bridgeInfo.response.nativeChainId).toString()); + const rawEvent = JSON.parse(submission.rawEvent); + submission.type = nativeChainId === submission.chainFrom ? SubmissionTypeEnum.Sent : SubmissionTypeEnum.Burn; + if ('executionFee' in rawEvent) { + submission.executionFee = rawEvent.executionFee; + } else { + submission.executionFee = buildSolanaAutoParams(rawEvent).executionFee; + } + } else { + const rawEvent = JSON.parse(submission.rawEvent); + const { event } = rawEvent; + submission.type = event; + submission.executionFee = buildEvmAutoParams(rawEvent).executionFee; + } + + await this.#submissionsRepository.save(submission); + } +} diff --git a/debridge_node/src/modules/balance-sheet/services/utils/ValidateSynchronizationService.ts b/debridge_node/src/modules/balance-sheet/services/utils/ValidateSynchronizationService.ts new file mode 100644 index 0000000..a90e689 --- /dev/null +++ b/debridge_node/src/modules/balance-sheet/services/utils/ValidateSynchronizationService.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@nestjs/common'; +import { SubmissionEntity } from 'src/entities/SubmissionEntity'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { SupportedChainEntity } from 'src/entities/SupportedChainEntity'; +import { BalanceValidationStatusService } from './BalanceValidationStatusService'; +import { BalanceSheetEntity } from 'src/entities/BalanceSheetEntity'; +import { BalanceValidationStatusEnum } from 'src/enums/BalanceValidationStatusEnum'; + +@Injectable() +export class ValidateSynchronizationService { + readonly #supportedChainRepository: Repository; + readonly #submissionsRepository: Repository; + readonly #balanceValidationStatusService: BalanceValidationStatusService; + + constructor( + @InjectRepository(SupportedChainEntity) + supportedChainRepository: Repository, + @InjectRepository(SubmissionEntity) + submissionsRepository: Repository, + balanceValidationStatusService: BalanceValidationStatusService, + ) { + this.#supportedChainRepository = supportedChainRepository; + this.#submissionsRepository = submissionsRepository; + this.#balanceValidationStatusService = balanceValidationStatusService; + } + + async validate(submission: SubmissionEntity, comment: string): Promise { + const supportedChain = await this.#supportedChainRepository.findOne({ + where: { + chainId: submission.chainTo, + }, + }); + + const result = true; + if (result) { + await this.#balanceValidationStatusService.fail(submission, comment); + } else { + submission.balanceValidationStatus = BalanceValidationStatusEnum.ON_HOLD; + await this.#submissionsRepository.save(submission); + throw new Error(`Submission ${submission.submissionId} on hold`); + } + } +} diff --git a/debridge_node/src/modules/chain/config/services/tests/ChainConfigService.spec.ts b/debridge_node/src/modules/chain/config/services/tests/ChainConfigService.spec.ts index 77ad530..933ddf4 100644 --- a/debridge_node/src/modules/chain/config/services/tests/ChainConfigService.spec.ts +++ b/debridge_node/src/modules/chain/config/services/tests/ChainConfigService.spec.ts @@ -3,7 +3,7 @@ import { ScheduleModule } from '@nestjs/schedule'; import { SolanaReaderService } from '../../../scanning/services/SolanaReaderService'; import { ChainConfigService } from '../ChainConfigService'; import { ChainProvider } from '../../models/ChainProvider'; -import { AddNewEventsAction } from '../../../scanning/services/AddNewEventsAction'; +import { EvmNewEventsReaderAction } from '../../../scanning/services/EvmNewEventsReaderAction'; import { ChainScanningService } from '../../../scanning/services/ChainScanningService'; import { EvmChainConfig } from '../../models/configs/EvmChainConfig'; @@ -58,7 +58,7 @@ describe('ChainConfigService', () => { imports: [ScheduleModule.forRoot()], providers: [ { - provide: AddNewEventsAction, + provide: EvmNewEventsReaderAction, useValue: { action: async chainId => { return chainId; diff --git a/debridge_node/src/modules/chain/scanning/ChainScanningModule.ts b/debridge_node/src/modules/chain/scanning/ChainScanningModule.ts index 7ece5f6..eacfdd9 100644 --- a/debridge_node/src/modules/chain/scanning/ChainScanningModule.ts +++ b/debridge_node/src/modules/chain/scanning/ChainScanningModule.ts @@ -4,7 +4,7 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { SubmissionEntity } from '../../../entities/SubmissionEntity'; import { SupportedChainEntity } from '../../../entities/SupportedChainEntity'; import { Web3Service } from '../../web3/services/Web3Service'; -import { AddNewEventsAction } from './services/AddNewEventsAction'; +import { EvmNewEventsReaderAction } from './services/EvmNewEventsReaderAction'; import { ChainScanningService } from './services/ChainScanningService'; import { ConfigModule } from '@nestjs/config'; import { NonceControllingService } from './services/NonceControllingService'; @@ -12,14 +12,15 @@ import { SubmissionProcessingService } from './services/SubmissionProcessingServ import { SolanaReaderService } from './services/SolanaReaderService'; import { TransformService } from './services/TransformService'; import { SubmissionIdValidationService } from './services/SubmissionIdValidationService'; +import { MonitoringSendEventEntity } from '../../../entities/MonitoringSendEventEntity'; @Module({ - imports: [ConfigModule, ScheduleModule.forRoot(), TypeOrmModule.forFeature([SubmissionEntity, SupportedChainEntity])], + imports: [ConfigModule, ScheduleModule.forRoot(), TypeOrmModule.forFeature([SubmissionEntity, SupportedChainEntity, MonitoringSendEventEntity])], providers: [ Web3Service, ChainScanningService, SubmissionProcessingService, - AddNewEventsAction, + EvmNewEventsReaderAction, NonceControllingService, SolanaReaderService, TransformService, diff --git a/debridge_node/src/modules/chain/scanning/services/ChainScanningService.ts b/debridge_node/src/modules/chain/scanning/services/ChainScanningService.ts index 06d3981..67b0eb3 100644 --- a/debridge_node/src/modules/chain/scanning/services/ChainScanningService.ts +++ b/debridge_node/src/modules/chain/scanning/services/ChainScanningService.ts @@ -1,7 +1,7 @@ import { SchedulerRegistry } from '@nestjs/schedule'; import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common'; import { ChainScanStatus } from '../../../../enums/ChainScanStatus'; -import { AddNewEventsAction } from './AddNewEventsAction'; +import { EvmNewEventsReaderAction } from './EvmNewEventsReaderAction'; import { ChainConfigService } from '../../config/services/ChainConfigService'; /** @@ -12,8 +12,8 @@ export class ChainScanningService { private readonly logger = new Logger(ChainScanningService.name); constructor( private readonly schedulerRegistry: SchedulerRegistry, - @Inject(forwardRef(() => AddNewEventsAction)) - private readonly addNewEventsAction: AddNewEventsAction, + @Inject(forwardRef(() => EvmNewEventsReaderAction)) + private readonly addNewEventsAction: EvmNewEventsReaderAction, private readonly chainConfigService: ChainConfigService, ) {} diff --git a/debridge_node/src/modules/chain/scanning/services/AddNewEventsAction.ts b/debridge_node/src/modules/chain/scanning/services/EvmNewEventsReaderAction.ts similarity index 57% rename from debridge_node/src/modules/chain/scanning/services/AddNewEventsAction.ts rename to debridge_node/src/modules/chain/scanning/services/EvmNewEventsReaderAction.ts index 3fc10c5..af71790 100644 --- a/debridge_node/src/modules/chain/scanning/services/AddNewEventsAction.ts +++ b/debridge_node/src/modules/chain/scanning/services/EvmNewEventsReaderAction.ts @@ -11,44 +11,59 @@ import { SubmissionProcessingService } from './SubmissionProcessingService'; import { TransformService } from './TransformService'; import { ProcessNewTransferResultStatusEnum } from '../enums/ProcessNewTransferResultStatusEnum'; import Contract from 'web3-eth-contract'; -import { SubmissionEntity } from 'src/entities/SubmissionEntity'; +import { SubmissionEntity } from '../../../../entities/SubmissionEntity'; @Injectable() -export class AddNewEventsAction { - private readonly logger = new Logger(AddNewEventsAction.name); - private readonly locker = new Map(); +export class EvmNewEventsReaderAction { + readonly #logger = new Logger(EvmNewEventsReaderAction.name); + readonly #locker = new Map(); + readonly #supportedChainRepository: Repository; + readonly #submissionsRepository: Repository; + readonly #chainConfigService: ChainConfigService; + readonly #web3Service: Web3Service; + readonly #solanaReaderService: SolanaReaderService; + readonly #chainProcessingService: SubmissionProcessingService; + readonly #transformService: TransformService; constructor( @InjectRepository(SupportedChainEntity) - private readonly supportedChainRepository: Repository, + supportedChainRepository: Repository, @InjectRepository(SubmissionEntity) - private readonly submissionsRepository: Repository, - private readonly chainConfigService: ChainConfigService, - private readonly web3Service: Web3Service, - private readonly solanaReaderService: SolanaReaderService, - private readonly chainProcessingService: SubmissionProcessingService, - private readonly transformService: TransformService, - ) {} + submissionsRepository: Repository, + chainConfigService: ChainConfigService, + web3Service: Web3Service, + solanaReaderService: SolanaReaderService, + chainProcessingService: SubmissionProcessingService, + transformService: TransformService, + ) { + this.#supportedChainRepository = supportedChainRepository; + this.#submissionsRepository = submissionsRepository; + this.#chainConfigService = chainConfigService; + this.#web3Service = web3Service; + this.#solanaReaderService = solanaReaderService; + this.#chainProcessingService = chainProcessingService; + this.#transformService = transformService; + } async action(chainId: number) { - if (this.locker.get(chainId)) { - this.logger.warn(`Is working now. chainId: ${chainId}`); + if (this.#locker.get(chainId)) { + this.#logger.warn(`Is working now. chainId: ${chainId}`); return; } try { - this.locker.set(chainId, true); - this.logger.log(`Is locked chainId: ${chainId}`); - const chain = this.chainConfigService.get(chainId); + this.#locker.set(chainId, true); + this.#logger.log(`Is locked chainId: ${chainId}`); + const chain = this.#chainConfigService.get(chainId); if (chain.isSolana) { - await this.solanaReaderService.syncTransactions(); + await this.#solanaReaderService.syncTransactions(); } else { await this.process(chainId); } } catch (e) { - this.logger.error(`Error while scanning chainId: ${chainId}; error: ${e.message} ${JSON.stringify(e)}`); + this.#logger.error(`Error while scanning chainId: ${chainId}; error: ${e.message} ${JSON.stringify(e)}`); } finally { - this.locker.set(chainId, false); - this.logger.log(`Is unlocked chainId: ${chainId}`); + this.#locker.set(chainId, false); + this.#logger.log(`Is unlocked chainId: ${chainId}`); } } @@ -59,19 +74,19 @@ export class AddNewEventsAction { * @param to - Optional ending block number (defaults to the latest confirmed block). */ async process(chainId: number, from?: number, to?: number): Promise { - const logger = new Logger(`${AddNewEventsAction.name} chainId ${chainId}`); + const logger = new Logger(`${EvmNewEventsReaderAction.name} chainId ${chainId}`); logger.verbose(`Processing checkNewEvents - chainId: ${chainId}; from: ${from}; to: ${to}`); // Fetch chain details and initialize Web3 provider - const supportedChain = await this.supportedChainRepository.findOne({ where: { chainId } }); - const chainConfig = this.chainConfigService.get(chainId) as EvmChainConfig; - const web3 = await this.web3Service.web3HttpProvider(chainConfig); + const supportedChain = await this.#supportedChainRepository.findOne({ where: { chainId } }); + const chainConfig = this.#chainConfigService.get(chainId) as EvmChainConfig; + const web3 = await this.#web3Service.web3HttpProvider(chainConfig); const gateContract = new web3.eth.Contract(deBridgeGateAbi as any, chainConfig.debridgeAddr); // @ts-ignore web3.eth.setProvider = gateContract.setProvider; // Set block range: use provided values or defaults - const toBlock = to ?? (await this.getConfirmedBlockNumber(web3, chainConfig.blockConfirmation)); + const toBlock = to ?? (await this.#getConfirmedBlockNumber(web3, chainConfig.blockConfirmation)); let fromBlock = from ?? supportedChain.latestBlock; logger.debug(`Getting events from block ${fromBlock} to ${toBlock} on ${supportedChain.network}`); @@ -80,7 +95,7 @@ export class AddNewEventsAction { logger.error(`Invalid block range: fromBlock (${fromBlock}) > toBlock (${toBlock})`); // Find the latest block number for the given chainId from the submissions repository - const lastEvent = await this.submissionsRepository.findOne({ + const lastEvent = await this.#submissionsRepository.findOne({ where: { chainFrom: chainId }, order: { blockNumber: 'DESC' }, // Get the highest block number }); @@ -92,7 +107,7 @@ export class AddNewEventsAction { logger.debug(`Found last event block number: ${newLatestBlock} for chainId ${chainId}`); } - await this.supportedChainRepository.update(chainId, { latestBlock: newLatestBlock }); + await this.#supportedChainRepository.update(chainId, { latestBlock: newLatestBlock }); logger.log(`Updated latestBlock for chainId ${chainId} to ${newLatestBlock}`); return; } @@ -104,11 +119,13 @@ export class AddNewEventsAction { logger.warn(`latestBlock in db ${supportedChain.latestBlock} == lastBlockOfPage ${lastBlockOfPage}`); continue; } - const sentEvents = await this.getEvents(gateContract, fromBlock, lastBlockOfPage); + const sentEvents = await this.#getSentEvents(gateContract, fromBlock, lastBlockOfPage); + const monitoringSendEvents = await this.#getMonitoringSendEvents(gateContract, fromBlock, lastBlockOfPage); + logger.log(`sentEvents: ${JSON.stringify(sentEvents)}`); if (!sentEvents || sentEvents.length === 0) { logger.verbose(`Not found any events for ${chainId} ${fromBlock} - ${lastBlockOfPage}`); - await this.supportedChainRepository.update(chainId, { + await this.#supportedChainRepository.update(chainId, { latestBlock: lastBlockOfPage, }); continue; @@ -119,14 +136,14 @@ export class AddNewEventsAction { if (sendEvent.returnValues.chainIdFrom === undefined || sendEvent.returnValues.chainIdFrom === null) { sendEvent.returnValues.chainIdFrom = chainId; } - return this.transformService.generateSubmissionFromSentEvent(sendEvent); + return this.#transformService.generateSubmissionFromSentEvent(sendEvent); } catch (e) { - this.logger.error(`Error in transforming sent event to submission ${submissionId}: ${e.message}`); + this.#logger.error(`Error in transforming sent event to submission ${submissionId}: ${e.message}`); } }); submissions.sort((a, b) => { if (a.blockNumber === b.blockNumber) { - logger.log( + this.#logger.log( `Submissions in block#${a.blockNumber} submissionId: ${a.submissionId} nonce:${a.nonce}; submissionId: ${b.submissionId} nonce: ${b.nonce}`, ); @@ -135,7 +152,8 @@ export class AddNewEventsAction { return 0; }); - const status = await this.chainProcessingService.process(submissions, chainId, lastBlockOfPage, web3); + const monitoringEvents = monitoringSendEvents.map(rawEvent => this.#transformService.generateMonitoringSendEventFromEvmEvent(rawEvent)); + const status = await this.#chainProcessingService.process(submissions, monitoringEvents, chainId, lastBlockOfPage, web3); if (status !== ProcessNewTransferResultStatusEnum.SUCCESS) { break; } @@ -148,18 +166,25 @@ export class AddNewEventsAction { * @param blockConfirmation - The number of blocks to subtract from the latest block to ensure confirmation. * @returns A promise resolving to the block number that has the specified number of confirmations. */ - private async getConfirmedBlockNumber(web3: Web3Custom, blockConfirmation: number): Promise { + async #getConfirmedBlockNumber(web3: Web3Custom, blockConfirmation: number): Promise { // Get the latest block number from the RPC (the most recent block in the blockchain) const lastRPCBlock = await web3.eth.getBlockNumber(); - this.logger.debug(`Last rpc block is ${lastRPCBlock}`); + this.#logger.debug(`Last rpc block is ${lastRPCBlock}`); // Subtract the confirmation count to get the block number considered confirmed return lastRPCBlock - blockConfirmation; } - async getEvents(gateContract: Contract, fromBlock: number, toBlock: number) { + async #getSentEvents(registerInstance: Contract, fromBlock: number, toBlock: number) { + if (fromBlock >= toBlock) return; + + /* get events */ + return await registerInstance.getPastEvents('Sent', { fromBlock, toBlock }); + } + + async #getMonitoringSendEvents(registerInstance: Contract, fromBlock: number, toBlock: number) { if (fromBlock >= toBlock) return; /* get events */ - return await gateContract.getPastEvents('Sent', { fromBlock, toBlock }); + return await registerInstance.getPastEvents('MonitoringSendEvent', { fromBlock, toBlock }); } } diff --git a/debridge_node/src/modules/chain/scanning/services/SolanaReaderService.ts b/debridge_node/src/modules/chain/scanning/services/SolanaReaderService.ts index d34fd05..1d0fb27 100644 --- a/debridge_node/src/modules/chain/scanning/services/SolanaReaderService.ts +++ b/debridge_node/src/modules/chain/scanning/services/SolanaReaderService.ts @@ -11,6 +11,7 @@ import { SolanaEventsReaderService } from '../../../solana-events-reader/service import { ProcessNewTransferResultStatusEnum } from '../enums/ProcessNewTransferResultStatusEnum'; import { SolanaGrpcClient, U256Converter } from '@debridge-finance/solana-grpc'; import { SolanaHearbeat } from '../entities/SolanaHearbeat'; +import { MonitoringSendEventEntity } from '../../../../entities/MonitoringSendEventEntity'; /** * Service for reading transaction from solana @@ -19,26 +20,36 @@ import { SolanaHearbeat } from '../entities/SolanaHearbeat'; export class SolanaReaderService implements OnModuleInit { readonly #logger = new Logger(SolanaReaderService.name); readonly #solanaGrpcClient: SolanaGrpcClient; + readonly #supportedChainRepository: Repository; + readonly #transformService: TransformService; + readonly #configService: ConfigService; + readonly #chainProcessingService: SubmissionProcessingService; + #duplex: ReturnType; #submissionsFromSync: SubmissionEntity[] = []; + #monitoringSendEvents: MonitoringSendEventEntity[] = []; #PAGE_SIZE = 100; #heartbeatIntervalInstance: NodeJS.Timeout; #abortController = new AbortController(); constructor( @InjectRepository(SupportedChainEntity) - private readonly supportedChainRepository: Repository, - private readonly transformService: TransformService, - private readonly configService: ConfigService, - private readonly chainProcessingService: SubmissionProcessingService, + supportedChainRepository: Repository, + transformService: TransformService, + configService: ConfigService, + chainProcessingService: SubmissionProcessingService, solanaEventsReaderService: SolanaEventsReaderService, ) { this.#solanaGrpcClient = solanaEventsReaderService.getClient(); + this.#supportedChainRepository = supportedChainRepository; + this.#transformService = transformService; + this.#configService = configService; + this.#chainProcessingService = chainProcessingService; } async syncTransactions() { - const chain = await this.supportedChainRepository.findOne({ + const chain = await this.#supportedChainRepository.findOne({ where: { chainId: solanaChainId, }, @@ -49,36 +60,46 @@ export class SolanaReaderService implements OnModuleInit { return; } const submissions = [...this.#submissionsFromSync].filter(s => s.nonce >= chain.latestNonce); + const monitoringSendEvents = [...this.#monitoringSendEvents].filter(s => s.nonce >= chain.latestNonce); + submissions.sort((a, b) => a.nonce - b.nonce); this.#submissionsFromSync = []; + this.#monitoringSendEvents = []; const size = Math.ceil(submissions.length / this.#PAGE_SIZE); //pagination for (let pageNumber = 0; pageNumber < size; pageNumber++) { const skip = pageNumber * this.#PAGE_SIZE; const end = Math.min((pageNumber + 1) * this.#PAGE_SIZE, submissions.length); const submissionsForProcessing = submissions.slice(skip, end); + const monitoringSendForProcessing = monitoringSendEvents.slice(skip, end); const lastSubmission = submissionsForProcessing.at(-1); - const processingResult = await this.chainProcessingService.process(submissionsForProcessing, solanaChainId, lastSubmission.nonce); + const processingResult = await this.#chainProcessingService.process( + submissionsForProcessing, + monitoringSendForProcessing, + solanaChainId, + lastSubmission.nonce, + ); if ( [ProcessNewTransferResultStatusEnum.ERROR_SUBMISSION_VALIDATION, ProcessNewTransferResultStatusEnum.ERROR_NONCE_VALIDATION].includes( processingResult, ) ) { this.#submissionsFromSync = []; - this.createSubscription(); + this.#monitoringSendEvents = []; + this.#createSubscription(); break; } } } - private async createSubscription() { + async #createSubscription() { if (this.#duplex) { this.#abortController.abort(); this.#abortController = new AbortController(); this.#solanaGrpcClient.abortSignal = this.#abortController.signal; } this.#submissionsFromSync = []; - const chain = await this.supportedChainRepository.findOne({ + const chain = await this.#supportedChainRepository.findOne({ where: { chainId: solanaChainId, }, @@ -103,20 +124,22 @@ export class SolanaReaderService implements OnModuleInit { // @ts-ignore this.#logger.verbose(`Heartbeat: ${JSON.stringify(response.sendEventMessage.heartbeat)}`); - this.heartbeat(); + this.#heartbeat(); // @ts-ignore - this.updateLastSyncedBlock(response.sendEventMessage.heartbeat as SolanaHearbeat); + this.#updateLastSyncedBlock(response.sendEventMessage.heartbeat as SolanaHearbeat); break; } case 'event': { - this.heartbeat(); + this.#heartbeat(); // @ts-ignore const event = response.sendEventMessage.event; const nonce = Number(U256Converter.toBigInt(event.submission?.nonce).toString()); this.#logger.log(`new event is received nonce: ${nonce}`); - const submission = this.transformService.generateSubmissionFromSolanaSendEvent(event); + const submission = this.#transformService.generateSubmissionFromSolanaSendEvent(event); + const monitoringSendEvent = this.#transformService.generateMonitoringSendEventFromSolanaEvent(event); this.#submissionsFromSync.push(submission); + this.#monitoringSendEvents.push(monitoringSendEvent); break; } } @@ -128,8 +151,8 @@ export class SolanaReaderService implements OnModuleInit { } } - private async updateLastSyncedBlock(solanaHearbeat: SolanaHearbeat) { - const chain = await this.supportedChainRepository.findOne({ + async #updateLastSyncedBlock(solanaHearbeat: SolanaHearbeat) { + const chain = await this.#supportedChainRepository.findOne({ where: { chainId: solanaChainId, }, @@ -141,7 +164,7 @@ export class SolanaReaderService implements OnModuleInit { if (chain.lastTransactionSlotNumber >= parseInt(solanaHearbeat.lastEventBlock)) { const lastBlock = parseInt(solanaHearbeat.resyncLastBlock); if (lastBlock > chain.lastTransactionSlotNumber) { - await this.supportedChainRepository.update(chain.chainId, { + await this.#supportedChainRepository.update(chain.chainId, { lastTransactionSlotNumber: lastBlock, latestBlock: lastBlock, }); @@ -149,16 +172,16 @@ export class SolanaReaderService implements OnModuleInit { } } - private heartbeat() { + #heartbeat() { clearTimeout(this.#heartbeatIntervalInstance); - const timeout = this.configService.get('DEBRIDGE_EVENTS_CONSISTENCY_CHECK_TIMEOUT_SECS') * 10 * 1000; + const timeout = this.#configService.get('DEBRIDGE_EVENTS_CONSISTENCY_CHECK_TIMEOUT_SECS') * 10 * 1000; this.#heartbeatIntervalInstance = setTimeout(async () => { - this.createSubscription(); + this.#createSubscription(); this.#logger.error(`Duplex is not active for ${timeout}s`); }, timeout); } onModuleInit() { - this.createSubscription(); + this.#createSubscription(); } } diff --git a/debridge_node/src/modules/chain/scanning/services/SubmissionProcessingService.ts b/debridge_node/src/modules/chain/scanning/services/SubmissionProcessingService.ts index d3ea424..7119d80 100644 --- a/debridge_node/src/modules/chain/scanning/services/SubmissionProcessingService.ts +++ b/debridge_node/src/modules/chain/scanning/services/SubmissionProcessingService.ts @@ -11,28 +11,47 @@ import { ChainConfigService } from '../../config/services/ChainConfigService'; import { ChainConfig } from '../../config/models/configs/ChainConfig'; import { Web3Custom } from '../../../web3/services/Web3Service'; import { SubmissionIdValidationService } from './SubmissionIdValidationService'; +import { MonitoringSendEventEntity } from '../../../../entities/MonitoringSendEventEntity'; @Injectable() export class SubmissionProcessingService { + + readonly #supportedChainRepository: Repository; + readonly #submissionsRepository: Repository; + readonly #monitoringSendEventRepository: Repository; + readonly #nonceControllingService: NonceControllingService; + readonly #chainConfigService: ChainConfigService; + readonly #submissionIdValidationService: SubmissionIdValidationService; + constructor( @InjectRepository(SupportedChainEntity) - private readonly supportedChainRepository: Repository, + supportedChainRepository: Repository, @InjectRepository(SubmissionEntity) - private readonly submissionsRepository: Repository, - private readonly nonceControllingService: NonceControllingService, - private readonly chainConfigService: ChainConfigService, - private readonly submissionIdValidationService: SubmissionIdValidationService, - ) {} + submissionsRepository: Repository, + @InjectRepository(MonitoringSendEventEntity) + monitoringSendEventRepository: Repository, + nonceControllingService: NonceControllingService, + chainConfigService: ChainConfigService, + submissionIdValidationService: SubmissionIdValidationService, + ) { + this.#supportedChainRepository = supportedChainRepository; + this.#submissionsRepository = submissionsRepository; + this.#monitoringSendEventRepository = monitoringSendEventRepository; + this.#nonceControllingService = nonceControllingService; + this.#chainConfigService = chainConfigService; + this.#submissionIdValidationService = submissionIdValidationService; + } async process( submissions: SubmissionEntity[], + monitoringEvents: MonitoringSendEventEntity[], chainId: number, lastBlockOrNonceOfPage: number, web3?: Web3Custom, ): Promise { const logger = new Logger(`${SubmissionProcessingService.name} chainId ${chainId}`); - const chainDetail = this.chainConfigService.get(chainId); - const result = await this.processNewTransfers(logger, submissions, chainDetail); + const chainDetail = this.#chainConfigService.get(chainId); + const result = await this.processNewTransfers(logger, submissions, monitoringEvents, chainDetail); const updatedBlockOrNonce: number | string = result.status === ProcessNewTransferResultStatusEnum.SUCCESS ? lastBlockOrNonceOfPage : result.blockOrNonceToOverwrite; @@ -41,13 +60,13 @@ export class SubmissionProcessingService { logger.log(`updateSupportedChainBlock; key: latestBlock; value: ${updatedBlockOrNonce};`); if (chainDetail.isSolana) { //check type - const lastSubmission = await this.submissionsRepository.findOne({ + const lastSubmission = await this.#submissionsRepository.findOne({ where: { nonce: updatedBlockOrNonce, chainFrom: chainId, }, }); - await this.supportedChainRepository.update(chainId, { + await this.#supportedChainRepository.update(chainId, { latestBlock: lastSubmission.blockNumber, latestNonce: lastSubmission.nonce, lastTxTimestamp: lastSubmission.blockTime, @@ -55,18 +74,18 @@ export class SubmissionProcessingService { latestSolanaTransaction: lastSubmission.txHash, }); } else { - await this.supportedChainRepository.update(chainId, { + await this.#supportedChainRepository.update(chainId, { latestBlock: updatedBlockOrNonce as number, }); } } switch (result.status) { case ProcessNewTransferResultStatusEnum.ERROR_NONCE_VALIDATION: { - await this.nonceControllingService.processValidationNonceError(result, chainId, web3, chainDetail); + await this.#nonceControllingService.processValidationNonceError(result, chainId, web3, chainDetail); break; } case ProcessNewTransferResultStatusEnum.ERROR_SUBMISSION_VALIDATION: { - await this.submissionIdValidationService.processValidationSubmissionIdError( + await this.#submissionIdValidationService.processValidationSubmissionIdError( web3, chainDetail, result.submissionId, @@ -85,9 +104,19 @@ export class SubmissionProcessingService { * @param {ChainConfig} chainDetail * @private */ - async processNewTransfers(logger: Logger, submissions: SubmissionEntity[], chainDetail: ChainConfig): Promise { + async processNewTransfers( + logger: Logger, + submissions: SubmissionEntity[], + monitoringEvents: MonitoringSendEventEntity[], + chainDetail: ChainConfig, + ): Promise { const { chainId: chainIdFrom } = chainDetail; let blockOrNonceToOverwrite; + const groupedMonitoringEvents = monitoringEvents.reduce((acc, item) => { + const key = item.submissionId; + acc[key] = item; + return acc; + }, {}); for (const submission of submissions) { const submissionId = submission.submissionId; @@ -97,7 +126,7 @@ export class SubmissionProcessingService { // check nonce collission // check if submission from rpc with the same submissionId have the same nonce - const submissionInDb = await this.submissionsRepository.findOne({ + const submissionInDb = await this.#submissionsRepository.findOne({ where: { submissionId, }, @@ -105,27 +134,28 @@ export class SubmissionProcessingService { if (submissionInDb) { logger.verbose(`Submission already found in db submissionId: ${submissionId}`); blockOrNonceToOverwrite = this.getBlockNumberOrNonce(submissionInDb); - this.nonceControllingService.setMaxNonce(chainIdFrom, submissionInDb.nonce); + this.#nonceControllingService.setMaxNonce(chainIdFrom, submissionInDb.nonce); + await this.#processMonitoringEvents(groupedMonitoringEvents[submissionId], logger); continue; } - const chainMaxNonce = this.nonceControllingService.getMaxNonce(chainIdFrom); + const chainMaxNonce = this.#nonceControllingService.getMaxNonce(chainIdFrom); - const submissionWithMaxNonceDb = await this.submissionsRepository.findOne({ + const submissionWithMaxNonceDb = await this.#submissionsRepository.findOne({ where: { chainFrom: chainIdFrom, nonce: chainMaxNonce, }, }); - const submissionWithCurNonce = await this.submissionsRepository.findOne({ + const submissionWithCurNonce = await this.#submissionsRepository.findOne({ where: { chainFrom: chainIdFrom, nonce, }, }); const nonceExists = !!submissionWithCurNonce; - const nonceValidationStatus = this.nonceControllingService.validateNonce(chainMaxNonce, nonce, nonceExists); + const nonceValidationStatus = this.#nonceControllingService.validateNonce(chainMaxNonce, nonce, nonceExists); logger.verbose(`Nonce validation status ${nonceValidationStatus}; maxNonceFromDb: ${chainMaxNonce}; nonce: ${nonce};`); if (nonceValidationStatus !== NonceValidationEnum.SUCCESS) { @@ -141,7 +171,7 @@ export class SubmissionProcessingService { }; } - const submissionIdValidation = await this.submissionIdValidationService.validate(submission); + const submissionIdValidation = await this.#submissionIdValidationService.validate(submission); if (!submissionIdValidation.status) { return { status: ProcessNewTransferResultStatusEnum.ERROR_SUBMISSION_VALIDATION, @@ -154,10 +184,11 @@ export class SubmissionProcessingService { try { logger.verbose(`Saving submission ${submissionId} is started`); - await this.submissionsRepository.save(submission); + await this.#submissionsRepository.save(submission); logger.verbose(`Saving submission ${submissionId} is finished`); + await this.#processMonitoringEvents(groupedMonitoringEvents[submissionId], logger); blockOrNonceToOverwrite = this.getBlockNumberOrNonce(submission); - this.nonceControllingService.setMaxNonce(chainIdFrom, nonce); + this.#nonceControllingService.setMaxNonce(chainIdFrom, nonce); } catch (e) { logger.error(`Error in saving ${submissionId}`); throw e; @@ -169,11 +200,38 @@ export class SubmissionProcessingService { }; } + /** + * Process monitoring events for a submission + * @param event Monitoring event to process + * @param logger Logger instance for logging + */ + async #processMonitoringEvents(event: MonitoringSendEventEntity, logger: Logger): Promise { + if (!event) { + logger.error(`Monitoring event is empty`); + throw new Error(`Monitoring event is empty`); + } + try { + const exists = await this.#monitoringSendEventRepository.exists({ + where: { submissionId: event.submissionId } + }); + + if (!exists) { + await this.#monitoringSendEventRepository.save(event); + logger.verbose(`Saved monitoring event for submission ${event.submissionId}`); + } else { + logger.verbose(`Monitoring event for submission ${event.submissionId} already exists`); + } + } catch (error) { + logger.error(`Error processing monitoring event for submission ${event.submissionId}: ${error.message}`); + throw error; + } + } + private getBlockNumberOrNonce(submission: SubmissionEntity): number { if (!submission) { return; } - const chainDetail = this.chainConfigService.get(submission.chainFrom); + const chainDetail = this.#chainConfigService.get(submission.chainFrom); if (chainDetail?.isSolana) { return submission.nonce; } else { diff --git a/debridge_node/src/modules/chain/scanning/services/TransformService.ts b/debridge_node/src/modules/chain/scanning/services/TransformService.ts index 1bd35bf..93af1ee 100644 --- a/debridge_node/src/modules/chain/scanning/services/TransformService.ts +++ b/debridge_node/src/modules/chain/scanning/services/TransformService.ts @@ -1,11 +1,15 @@ import { Injectable } from '@nestjs/common'; import { SubmissionEntity } from '../../../../entities/SubmissionEntity'; -import { SubmisionStatusEnum } from '../../../../enums/SubmisionStatusEnum'; +import { SubmissionStatusEnum } from '../../../../enums/SubmissionStatusEnum'; import { UploadStatusEnum } from '../../../../enums/UploadStatusEnum'; -import { SubmisionAssetsStatusEnum } from '../../../../enums/SubmisionAssetsStatusEnum'; +import { SubmissionAssetsStatusEnum } from '../../../../enums/SubmissionAssetsStatusEnum'; import { solanaChainId } from '../../config/services/ChainConfigService'; import { BundlrStatusEnum } from '../../../../enums/BundlrStatusEnum'; import { U256Converter } from '@debridge-finance/solana-grpc'; +import { buildEvmAutoParams, buildSolanaAutoParams } from '../../../../utils/buildAutoParams'; +import { MonitoringSendEventEntity } from '../../../../entities/MonitoringSendEventEntity'; +import { BalanceValidationStatusEnum } from '../../../../enums/BalanceValidationStatusEnum'; +import { SubmissionTypeEnum } from '../../../../enums/SubmissionTypeEnum'; /** * Service for data transormation @@ -13,6 +17,7 @@ import { U256Converter } from '@debridge-finance/solana-grpc'; @Injectable() export class TransformService { generateSubmissionFromSolanaSendEvent(sendEvent): SubmissionEntity { + const isSent = sendEvent.submission?.bridgeInfo?.nativeChainId === sendEvent.submission?.sourceChainId; const submission = new SubmissionEntity(); submission.submissionId = '0x' + U256Converter.toBytesBE(sendEvent.submissionId).toString('hex'); submission.txHash = '0x' + sendEvent.transactionMetadata.transactionHash.toString('hex'); @@ -28,12 +33,15 @@ export class TransformService { //submission.externalId = transaction.; //submission.signature = transaction. // - submission.status = SubmisionStatusEnum.NEW; + submission.status = SubmissionStatusEnum.NEW; submission.ipfsStatus = UploadStatusEnum.NEW; submission.apiStatus = UploadStatusEnum.NEW; submission.decimalDenominator = Number(sendEvent.denominator.toString()); - submission.assetsStatus = SubmisionAssetsStatusEnum.NEW; + submission.assetsStatus = SubmissionAssetsStatusEnum.NEW; submission.bundlrStatus = BundlrStatusEnum.NEW; + submission.executionFee = buildSolanaAutoParams(sendEvent).executionFee; + submission.balanceValidationStatus = BalanceValidationStatusEnum.RECEIVED; + submission.type = isSent ? SubmissionTypeEnum.Sent : SubmissionTypeEnum.Burn; return submission; } @@ -48,16 +56,38 @@ export class TransformService { debridgeId: sendEvent.returnValues.debridgeId, receiverAddr: sendEvent.returnValues.receiver, amount: sendEvent.returnValues.amount, - status: SubmisionStatusEnum.NEW, + status: SubmissionStatusEnum.NEW, ipfsStatus: UploadStatusEnum.NEW, apiStatus: UploadStatusEnum.NEW, - assetsStatus: SubmisionAssetsStatusEnum.NEW, + assetsStatus: SubmissionAssetsStatusEnum.NEW, rawEvent: JSON.stringify(sendEvent), blockNumber: sendEvent.blockNumber, nonce: parseInt(sendEvent.returnValues.nonce), bundlrStatus: BundlrStatusEnum.NEW, + executionFee: buildEvmAutoParams(sendEvent).executionFee, + balanceValidationStatus: BalanceValidationStatusEnum.RECEIVED, } as SubmissionEntity; return submission; } + + generateMonitoringSendEventFromEvmEvent(sendEvent): MonitoringSendEventEntity { + return { + nonce: sendEvent.nonce, + submissionId: sendEvent.submissionId, + lockedOrMintedAmount: BigInt(sendEvent.lockedOrMintedAmount), + totalSupply: BigInt(sendEvent.totalSupply), + rawEvent: JSON.stringify(sendEvent), + } as MonitoringSendEventEntity; + } + + generateMonitoringSendEventFromSolanaEvent(sendEvent): MonitoringSendEventEntity { + return { + nonce: Number(U256Converter.toBigInt(sendEvent.submission?.nonce).toString()), + submissionId: '0x' + U256Converter.toBytesBE(sendEvent.submissionId).toString('hex'), + lockedOrMintedAmount: U256Converter.toBigInt(sendEvent.bridgeBalanceUpdate.bridgeBalance), + totalSupply: U256Converter.toBigInt(sendEvent.bridgeBalanceUpdate.totalSupply), + rawEvent: JSON.stringify(sendEvent), + } as MonitoringSendEventEntity; + } } diff --git a/debridge_node/src/modules/chain/scanning/services/tests/AddNewEventsAction.spec.ts b/debridge_node/src/modules/chain/scanning/services/tests/AddNewEventsAction.spec.ts index 5c10a72..56e1e98 100644 --- a/debridge_node/src/modules/chain/scanning/services/tests/AddNewEventsAction.spec.ts +++ b/debridge_node/src/modules/chain/scanning/services/tests/AddNewEventsAction.spec.ts @@ -1,4 +1,4 @@ -import { AddNewEventsAction } from '../AddNewEventsAction'; +import { EvmNewEventsReaderAction } from '../EvmNewEventsReaderAction'; import { ChainConfigService } from '../../../config/services/ChainConfigService'; import { Web3Service } from '../../../../web3/services/Web3Service'; import { SolanaReaderService } from '../SolanaReaderService'; @@ -10,7 +10,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { SupportedChainEntity } from '../../../../../entities/SupportedChainEntity'; describe('AddNewEventsAction', () => { - let service: AddNewEventsAction; + let service: EvmNewEventsReaderAction; let processMock; let syncTransactionsMock; let getPastEventsMock; @@ -114,10 +114,10 @@ describe('AddNewEventsAction', () => { }, }, TransformService, - AddNewEventsAction, + EvmNewEventsReaderAction, ], }).compile(); - service = module.get(AddNewEventsAction); + service = module.get(EvmNewEventsReaderAction); }); it('should solana be executed', async () => { diff --git a/debridge_node/src/modules/chain/scanning/services/tests/ChainScanningService.spec.ts b/debridge_node/src/modules/chain/scanning/services/tests/ChainScanningService.spec.ts index c900651..f5dac35 100644 --- a/debridge_node/src/modules/chain/scanning/services/tests/ChainScanningService.spec.ts +++ b/debridge_node/src/modules/chain/scanning/services/tests/ChainScanningService.spec.ts @@ -2,7 +2,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ScheduleModule } from '@nestjs/schedule'; import { ChainScanStatus } from '../../../../../enums/ChainScanStatus'; import { ChainScanningService } from '../ChainScanningService'; -import { AddNewEventsAction } from '../AddNewEventsAction'; +import { EvmNewEventsReaderAction } from '../EvmNewEventsReaderAction'; import { ChainConfigService } from '../../../config/services/ChainConfigService'; jest.mock('../../../../../config/chains_config.json', () => { @@ -28,7 +28,7 @@ describe('ChainScanningService', () => { imports: [ScheduleModule.forRoot()], providers: [ { - provide: AddNewEventsAction, + provide: EvmNewEventsReaderAction, useValue: { action: async chainId => { return chainId; diff --git a/debridge_node/src/modules/jobs/JobModule.ts b/debridge_node/src/modules/jobs/JobModule.ts index 7106e94..287a6f8 100644 --- a/debridge_node/src/modules/jobs/JobModule.ts +++ b/debridge_node/src/modules/jobs/JobModule.ts @@ -9,6 +9,7 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { SubmissionEntity } from '../../entities/SubmissionEntity'; import { SupportedChainEntity } from '../../entities/SupportedChainEntity'; import { ConfirmNewAssetEntity } from '../../entities/ConfirmNewAssetEntity'; +import { MonitoringSendEventEntity } from '../../entities/MonitoringSendEventEntity'; import { StartScanningService } from './services/StartScanningService'; import { ChainScanningModule } from '../chain/scanning/ChainScanningModule'; import { UploadToArweaveAction } from './services/actions/UploadToArweaveAction'; @@ -18,7 +19,7 @@ import { ArweaveModule } from '../external/arweave/ArweaveModule'; imports: [ ArweaveModule, ConfigModule, - TypeOrmModule.forFeature([SubmissionEntity, SupportedChainEntity, ConfirmNewAssetEntity]), + TypeOrmModule.forFeature([SubmissionEntity, SupportedChainEntity, ConfirmNewAssetEntity, MonitoringSendEventEntity]), ChainScanningModule, ], providers: [StartScanningService, CheckAssetsEventAction, SignAction, StatisticToApiAction, UploadToApiAction, UploadToArweaveAction, JobService], diff --git a/debridge_node/src/modules/jobs/services/actions/CheckAssetsEventAction.ts b/debridge_node/src/modules/jobs/services/actions/CheckAssetsEventAction.ts index 5813478..1d96e49 100644 --- a/debridge_node/src/modules/jobs/services/actions/CheckAssetsEventAction.ts +++ b/debridge_node/src/modules/jobs/services/actions/CheckAssetsEventAction.ts @@ -4,9 +4,9 @@ import { InjectRepository } from '@nestjs/typeorm'; import { In, Repository } from 'typeorm'; import { SubmissionEntity } from '../../../../entities/SubmissionEntity'; import { ConfirmNewAssetEntity } from '../../../../entities/ConfirmNewAssetEntity'; -import { SubmisionStatusEnum } from '../../../../enums/SubmisionStatusEnum'; +import { SubmissionStatusEnum } from '../../../../enums/SubmissionStatusEnum'; import { UploadStatusEnum } from '../../../../enums/UploadStatusEnum'; -import { SubmisionAssetsStatusEnum } from '../../../../enums/SubmisionAssetsStatusEnum'; +import { SubmissionAssetsStatusEnum } from '../../../../enums/SubmissionAssetsStatusEnum'; import { abi as deBridgeGateAbi } from '../../../../assets/DeBridgeGate.json'; import { abi as ERC20Abi } from '../../../../assets/ERC20.json'; import { readFileSync } from 'fs'; @@ -44,7 +44,7 @@ export class CheckAssetsEventAction extends IAction { this.logger.log(`Check assets event`); const submissions = await this.submissionsRepository.find({ where: { - assetsStatus: SubmisionAssetsStatusEnum.NEW, + assetsStatus: SubmissionAssetsStatusEnum.NEW, }, }); @@ -158,7 +158,7 @@ export class CheckAssetsEventAction extends IAction { decimals: tokenDecimals, submissionChainFrom: submission.chainFrom, submissionChainTo: submission.chainTo, - status: SubmisionStatusEnum.SIGNED, + status: SubmissionStatusEnum.SIGNED, ipfsStatus: UploadStatusEnum.NEW, apiStatus: UploadStatusEnum.NEW, bundlrStatus: BundlrStatusEnum.NEW, @@ -181,7 +181,7 @@ export class CheckAssetsEventAction extends IAction { submissionId: In(newSubmitionIds), }, { - assetsStatus: SubmisionAssetsStatusEnum.ASSETS_CREATED, + assetsStatus: SubmissionAssetsStatusEnum.ASSETS_CREATED, }, ); } @@ -191,7 +191,7 @@ export class CheckAssetsEventAction extends IAction { submissionId: In(assetsWasCreatedSubmitions), }, { - assetsStatus: SubmisionAssetsStatusEnum.ASSETS_ALREADY_CREATED, + assetsStatus: SubmissionAssetsStatusEnum.ASSETS_ALREADY_CREATED, }, ); } diff --git a/debridge_node/src/modules/jobs/services/actions/SignAction.ts b/debridge_node/src/modules/jobs/services/actions/SignAction.ts index ad6655c..625eb0f 100644 --- a/debridge_node/src/modules/jobs/services/actions/SignAction.ts +++ b/debridge_node/src/modules/jobs/services/actions/SignAction.ts @@ -3,7 +3,7 @@ import { IAction } from './IAction'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { SubmissionEntity } from '../../../../entities/SubmissionEntity'; -import { SubmisionStatusEnum } from '../../../../enums/SubmisionStatusEnum'; +import { SubmissionStatusEnum } from '../../../../enums/SubmissionStatusEnum'; import { ConfirmNewAssetEntity } from '../../../../entities/ConfirmNewAssetEntity'; import Web3 from 'web3'; import { readFileSync } from 'fs'; @@ -41,7 +41,7 @@ export class SignAction extends IAction { //TODO: check is supported chainIdTo const submissions = await this.submissionsRepository.find({ where: { - status: SubmisionStatusEnum.NEW, + status: SubmissionStatusEnum.NEW, }, }); @@ -54,7 +54,7 @@ export class SignAction extends IAction { }, { signature, - status: SubmisionStatusEnum.SIGNED, + status: SubmissionStatusEnum.SIGNED, }, ); } diff --git a/debridge_node/src/modules/jobs/services/actions/StatisticToApiAction.ts b/debridge_node/src/modules/jobs/services/actions/StatisticToApiAction.ts index 03155f7..97fe16d 100644 --- a/debridge_node/src/modules/jobs/services/actions/StatisticToApiAction.ts +++ b/debridge_node/src/modules/jobs/services/actions/StatisticToApiAction.ts @@ -41,7 +41,7 @@ export class StatisticToApiAction extends IAction { lastTxHash: chain.latestSolanaTransaction, lastTransactionSlotNumber: chain.lastTransactionSlotNumber, latestNonce: chain.latestNonce, - lastTxTimestamp: chain.lastTxTimestamp, + lastTxTimestamp: chain.lastTxTimestamp?.toString(), } as ProgressInfoDTO; } return { chainId: chain.chainId, lastBlock: chain.latestBlock } as ProgressInfoDTO; diff --git a/debridge_node/src/modules/jobs/services/actions/UploadToApiAction.ts b/debridge_node/src/modules/jobs/services/actions/UploadToApiAction.ts index 39d2f5b..cfb2f12 100644 --- a/debridge_node/src/modules/jobs/services/actions/UploadToApiAction.ts +++ b/debridge_node/src/modules/jobs/services/actions/UploadToApiAction.ts @@ -3,7 +3,7 @@ import { IAction } from './IAction'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { SubmissionEntity } from '../../../../entities/SubmissionEntity'; -import { SubmisionStatusEnum } from '../../../../enums/SubmisionStatusEnum'; +import { SubmissionStatusEnum } from '../../../../enums/SubmissionStatusEnum'; import { DebrdigeApiService } from '../../../external/debridge_api/services/DebrdigeApiService'; import { UploadStatusEnum } from '../../../../enums/UploadStatusEnum'; import { ConfirmNewAssetEntity } from '../../../../entities/ConfirmNewAssetEntity'; @@ -37,7 +37,7 @@ export class UploadToApiAction extends IAction { try { const submissions = await this.submissionsRepository.find({ where: { - status: SubmisionStatusEnum.SIGNED, + status: SubmissionStatusEnum.SIGNED, apiStatus: UploadStatusEnum.NEW, }, }); @@ -58,7 +58,7 @@ export class UploadToApiAction extends IAction { //Process Assets const assets = await this.confirmNewAssetEntityRepository.find({ where: { - status: SubmisionStatusEnum.SIGNED, + status: SubmissionStatusEnum.SIGNED, apiStatus: UploadStatusEnum.NEW, }, }); diff --git a/debridge_node/src/modules/jobs/services/actions/UploadToArweaveAction.ts b/debridge_node/src/modules/jobs/services/actions/UploadToArweaveAction.ts index 6337719..cda0432 100644 --- a/debridge_node/src/modules/jobs/services/actions/UploadToArweaveAction.ts +++ b/debridge_node/src/modules/jobs/services/actions/UploadToArweaveAction.ts @@ -3,7 +3,7 @@ import { IAction } from './IAction'; import { InjectRepository } from '@nestjs/typeorm'; import { IsNull, Repository } from 'typeorm'; import { SubmissionEntity } from '../../../../entities/SubmissionEntity'; -import { SubmisionStatusEnum } from '../../../../enums/SubmisionStatusEnum'; +import { SubmissionStatusEnum } from '../../../../enums/SubmissionStatusEnum'; import { ConfirmNewAssetEntity } from '../../../../entities/ConfirmNewAssetEntity'; import { BundlrStatusEnum } from '../../../../enums/BundlrStatusEnum'; import { TurboService } from '../../../external/arweave/TurboService'; @@ -31,7 +31,7 @@ export class UploadToArweaveAction extends IAction { try { const submissions = await this.submissionsRepository.find({ where: { - status: SubmisionStatusEnum.SIGNED, + status: SubmissionStatusEnum.SIGNED, bundlrStatus: BundlrStatusEnum.NEW, }, }); @@ -95,11 +95,11 @@ export class UploadToArweaveAction extends IAction { const assets = await this.confirmNewAssetEntityRepository.find({ where: [ { - status: SubmisionStatusEnum.SIGNED, + status: SubmissionStatusEnum.SIGNED, bundlrStatus: BundlrStatusEnum.NEW, }, { - status: SubmisionStatusEnum.SIGNED, + status: SubmissionStatusEnum.SIGNED, bundlrStatus: IsNull(), }, ], diff --git a/debridge_node/src/modules/jobs/services/actions/tests/SignAction.spec.ts b/debridge_node/src/modules/jobs/services/actions/tests/SignAction.spec.ts index 6c3c58d..5b24dd9 100644 --- a/debridge_node/src/modules/jobs/services/actions/tests/SignAction.spec.ts +++ b/debridge_node/src/modules/jobs/services/actions/tests/SignAction.spec.ts @@ -6,7 +6,7 @@ import { SubmissionEntity } from '../../../../../entities/SubmissionEntity'; import { ConfirmNewAssetEntity } from '../../../../../entities/ConfirmNewAssetEntity'; import { SignAction } from '../SignAction'; import { Repository } from 'typeorm'; -import { SubmisionStatusEnum } from '../../../../../enums/SubmisionStatusEnum'; +import { SubmissionStatusEnum } from '../../../../../enums/SubmissionStatusEnum'; import { Web3Service } from '../../../../web3/services/Web3Service'; describe('SignAction', () => { @@ -83,7 +83,7 @@ describe('SignAction', () => { }, { signature: '123', - status: SubmisionStatusEnum.SIGNED, + status: SubmissionStatusEnum.SIGNED, }, ); }); diff --git a/debridge_node/src/modules/solana-events-reader/services/SolanaEventsReaderService.ts b/debridge_node/src/modules/solana-events-reader/services/SolanaEventsReaderService.ts index 07347d2..33fa549 100644 --- a/debridge_node/src/modules/solana-events-reader/services/SolanaEventsReaderService.ts +++ b/debridge_node/src/modules/solana-events-reader/services/SolanaEventsReaderService.ts @@ -6,7 +6,7 @@ import { SolanaGrpcClient } from '@debridge-finance/solana-grpc'; export class SolanaEventsReaderService { readonly #client: SolanaGrpcClient; - constructor(private readonly configService: ConfigService) { + constructor(configService: ConfigService) { const url = configService.get('SOLANA_GRPC_SERVICE_URL'); this.#client = new SolanaGrpcClient(url); } diff --git a/debridge_node/src/utils/buildAutoParams.ts b/debridge_node/src/utils/buildAutoParams.ts new file mode 100644 index 0000000..51af054 --- /dev/null +++ b/debridge_node/src/utils/buildAutoParams.ts @@ -0,0 +1,56 @@ +import Web3 from 'web3'; +import { U256Converter } from '@debridge-finance/solana-grpc'; +import { createU256 } from './createU256'; + +const web3 = new Web3(); + +export interface AutoParams { + executionFee: string; + flags: string; + fallbackAddress: string; + shortcut?: string; + nativeSender: string; + data?: string; +} + +export function buildSolanaAutoParams(rawEvent: any): AutoParams | undefined { + if (!rawEvent.submissionParams) { + return undefined; + } + return { + executionFee: U256Converter.toBigInt(createU256(rawEvent.submissionParams.executionFee)).toString(), + flags: U256Converter.toBigInt(createU256(rawEvent.submissionParams.reservedFlag)).toString(), + fallbackAddress: '0x' + Buffer.from(rawEvent.submissionParams.fallbackAddress.data).toString('hex'), + shortcut: '0x' + U256Converter.toBytesBE(createU256(rawEvent.submissionParams.hashOfExternalCall)).toString('hex'), + nativeSender: '0x' + Buffer.from(rawEvent.submissionParams.nativeSender.data).toString('hex'), + }; +} + +export function buildEvmAutoParams(rawEvent: any): AutoParams | undefined { + const { returnValues } = rawEvent; + const { autoParams: autoParamsInput } = returnValues; + if (!autoParamsInput) { + return undefined; + } + const submissionAutoParams = web3.eth.abi.decodeParameters( + [ + { + SubmissionAutoParamsTo: { + executionFee: 'uint256', + flags: 'uint256', + fallbackAddress: 'bytes', + data: 'bytes', + }, + }, + ], + autoParamsInput, + )[0]; + + return { + executionFee: submissionAutoParams.executionFee, + fallbackAddress: submissionAutoParams.fallbackAddress, + data: submissionAutoParams.data, + flags: submissionAutoParams.flags, + nativeSender: returnValues.nativeSender, + }; +} diff --git a/debridge_node/src/utils/buildSubmissionId.ts b/debridge_node/src/utils/buildSubmissionId.ts index 83489d4..be81087 100644 --- a/debridge_node/src/utils/buildSubmissionId.ts +++ b/debridge_node/src/utils/buildSubmissionId.ts @@ -1,61 +1,6 @@ -import Web3 from 'web3'; import { crypto, constants } from '@debridge-finance/solana-utils'; import { SubmissionEntity } from '../entities/SubmissionEntity'; -import { U256Converter } from '@debridge-finance/solana-grpc'; -import { createU256 } from './createU256'; - -const web3 = new Web3(); - -interface AutoParams { - executionFee: string; - flags: string; - fallbackAddress: string; - shortcut?: string; - nativeSender: string; - data?: string; -} - -function buildSolanaAutoParams(rawEvent: any): AutoParams | undefined { - if (!rawEvent.submissionParams) { - return undefined; - } - return { - executionFee: U256Converter.toBigInt(createU256(rawEvent.submissionParams.executionFee)).toString(), - flags: U256Converter.toBigInt(createU256(rawEvent.submissionParams.reservedFlag)).toString(), - fallbackAddress: '0x' + Buffer.from(rawEvent.submissionParams.fallbackAddress.data).toString('hex'), - shortcut: '0x' + U256Converter.toBytesBE(createU256(rawEvent.submissionParams.hashOfExternalCall)).toString('hex'), - nativeSender: '0x' + Buffer.from(rawEvent.submissionParams.nativeSender.data).toString('hex'), - }; -} - -function buildEvmAutoParams(rawEvent: any): AutoParams | undefined { - const { returnValues } = rawEvent; - const { autoParams: autoParamsInput } = returnValues; - if (!autoParamsInput) { - return undefined; - } - const submissionAutoParams = web3.eth.abi.decodeParameters( - [ - { - SubmissionAutoParamsTo: { - executionFee: 'uint256', - flags: 'uint256', - fallbackAddress: 'bytes', - data: 'bytes', - }, - }, - ], - autoParamsInput, - )[0]; - - return { - executionFee: submissionAutoParams.executionFee, - fallbackAddress: submissionAutoParams.fallbackAddress, - data: submissionAutoParams.data, - flags: submissionAutoParams.flags, - nativeSender: returnValues.nativeSender, - }; -} +import { buildSolanaAutoParams, buildEvmAutoParams } from './buildAutoParams'; export const buildSubmissionId = (submission: SubmissionEntity): string => { const rawEvent = JSON.parse(submission.rawEvent);