From eb29dde8c3a8950601347b9dad393f15b828742e Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 16 Aug 2025 16:38:41 +0200 Subject: [PATCH] finalize refactoring, change for using hiero instead of iota --- dlt-connector/biome.json | 154 +++ dlt-connector/bun.lock | 923 +++++++++++++++++- dlt-connector/package.json | 10 +- dlt-connector/src/KeyPairCacheManager.ts | 21 +- dlt-connector/src/client/GradidoNode/api.ts | 73 +- .../src/client/GradidoNode/input.schema.ts | 21 +- .../src/client/GradidoNode/jsonrpc.ts | 22 +- dlt-connector/src/client/HieroClient.ts | 74 ++ .../src/client/backend/BackendClient.ts | 25 +- .../client/backend/community.schema.test.ts | 26 +- .../src/client/backend/community.schema.ts | 16 +- dlt-connector/src/config/index.ts | 13 +- dlt-connector/src/config/schema.ts | 24 + .../src/data/KeyPairIdentifier.logic.ts | 45 +- dlt-connector/src/data/Uuidv4Hash.ts | 17 +- dlt-connector/src/enum/AddressType.ts | 4 +- .../src/enum/GradidoNodeErrorCodes.ts | 2 +- .../src/enum/InputTransactionType.ts | 22 +- dlt-connector/src/errors.ts | 2 +- dlt-connector/src/index.ts | 37 +- .../AbstractRemoteKeyPair.role.ts | 9 +- .../keyPairCalculation/AccountKeyPair.role.ts | 5 +- .../ForeignCommunityKeyPair.role.ts | 21 +- .../KeyPairCalculation.context.ts | 14 +- .../LinkedTransactionKeyPair.role.ts | 7 +- .../RemoteAccountKeyPair.role.ts | 13 +- .../keyPairCalculation/UserKeyPair.role.ts | 5 +- .../UserKeyPairRole.test.ts | 64 ++ .../sendToIota/AbstractTransaction.role.ts | 5 +- .../CommunityRootTransaction.role.ts | 26 +- .../sendToIota/CreationTransaction.role.ts | 75 +- .../DeferredTransferTransaction.role.ts | 53 +- .../RedeemDeferredTransferTransaction.role.ts | 91 +- .../RegisterAddressTransaction.role.ts | 77 +- .../sendToIota/SendToIota.context.ts | 145 ++- .../sendToIota/TransferTransaction.role.ts | 45 +- dlt-connector/src/schemas/account.schema.ts | 11 +- dlt-connector/src/schemas/base.schema.ts | 8 +- .../src/schemas/transaction.schema.test.ts | 295 +++--- .../src/schemas/transaction.schema.ts | 94 +- .../src/schemas/typeConverter.schema.test.ts | 19 +- .../src/schemas/typeConverter.schema.ts | 29 +- .../src/schemas/typeGuard.schema.test.ts | 14 +- dlt-connector/src/schemas/typeGuard.schema.ts | 154 +-- dlt-connector/src/server/index.ts | 142 ++- dlt-connector/src/server/input.schema.ts | 19 + .../src/utils/derivationHelper.test.ts | 2 +- dlt-connector/src/utils/network.ts | 16 +- dlt-connector/src/utils/typeConverter.ts | 29 +- 49 files changed, 2146 insertions(+), 872 deletions(-) create mode 100644 dlt-connector/biome.json create mode 100644 dlt-connector/src/client/HieroClient.ts create mode 100644 dlt-connector/src/config/schema.ts create mode 100644 dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts create mode 100644 dlt-connector/src/server/input.schema.ts diff --git a/dlt-connector/biome.json b/dlt-connector/biome.json new file mode 100644 index 000000000..3ec5af1be --- /dev/null +++ b/dlt-connector/biome.json @@ -0,0 +1,154 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.0.0/schema.json", + "vcs": { "enabled": false, "clientKind": "git", "useIgnoreFile": false }, + "files": { + "ignoreUnknown": false, + "includes": [ + "**/package.json", + "src/**/*.js", + "src/**/*.ts", + "!**/build", + "!**/node_modules", + "!**/coverage" + ] + }, + "formatter": { + "enabled": true, + "useEditorconfig": true, + "formatWithErrors": false, + "indentStyle": "space", + "indentWidth": 2, + "lineEnding": "lf", + "lineWidth": 100, + "attributePosition": "auto", + "bracketSpacing": true + }, + "assist": { "actions": { "source": { "organizeImports": "on" } } }, + "linter": { + "enabled": true, + "rules": { + "recommended": false, + "complexity": { + "noExtraBooleanCast": "error", + "noUselessCatch": "error", + "noUselessConstructor": "error", + "noUselessLoneBlockStatements": "error", + "noUselessRename": "error", + "noUselessTernary": "error", + "noUselessUndefinedInitialization": "error", + "noVoid": "error", + "useLiteralKeys": "error", + "useRegexLiterals": "error", + "noAdjacentSpacesInRegex": "error", + "noCommaOperator": "error" + }, + "correctness": { + "noConstAssign": "error", + "noConstantCondition": "error", + "noEmptyCharacterClassInRegex": "error", + "noEmptyPattern": "error", + "noGlobalObjectCalls": "error", + "noInnerDeclarations": "error", + "noInvalidConstructorSuper": "error", + "noInvalidUseBeforeDeclaration": "error", + "noNodejsModules": "off", + "noNonoctalDecimalEscape": "error", + "noPrecisionLoss": "error", + "noSelfAssign": "error", + "noSetterReturn": "error", + "noSwitchDeclarations": "error", + "noUndeclaredVariables": "error", + "noUnreachable": "error", + "noUnreachableSuper": "error", + "noUnsafeFinally": "error", + "noUnsafeOptionalChaining": "error", + "noUnusedLabels": "error", + "noUnusedVariables": "error", + "useIsNan": "error", + "useValidForDirection": "error", + "useYield": "error", + "noInvalidBuiltinInstantiation": "error", + "useValidTypeof": "error" + }, + "security": { "noGlobalEval": "error" }, + "style": { + "noDefaultExport": "error", + "noYodaExpression": "error", + "useBlockStatements": "error", + "useConsistentBuiltinInstantiation": "error", + "useConst": "error", + "useImportType": "off", + "useSingleVarDeclarator": "error", + "useArrayLiterals": "error" + }, + "suspicious": { + "noAsyncPromiseExecutor": "error", + "noCatchAssign": "error", + "noClassAssign": "error", + "noCompareNegZero": "error", + "noConsole": "error", + "noControlCharactersInRegex": "error", + "noDebugger": "error", + "noDoubleEquals": "error", + "noDuplicateCase": "error", + "noDuplicateClassMembers": "error", + "noDuplicateObjectKeys": "error", + "noDuplicateParameters": "error", + "noEmptyBlockStatements": "error", + "noFallthroughSwitchClause": "error", + "noFunctionAssign": "error", + "noGlobalAssign": "error", + "noImportAssign": "error", + "noMisleadingCharacterClass": "error", + "noPrototypeBuiltins": "error", + "noRedeclare": "error", + "noSelfCompare": "error", + "noShadowRestrictedNames": "error", + "noSparseArray": "error", + "noUnsafeNegation": "error", + "useDefaultSwitchClauseLast": "error", + "useGetterReturn": "error", + "noWith": "error", + "noVar": "warn" + } + }, + "includes": ["**", "!**/node_modules", "!**/*.min.js", "!**/build", "!**/coverage"] + }, + "javascript": { + "formatter": { + "jsxQuoteStyle": "single", + "quoteProperties": "asNeeded", + "trailingCommas": "all", + "semicolons": "asNeeded", + "arrowParentheses": "always", + "bracketSameLine": false, + "quoteStyle": "single", + "attributePosition": "auto", + "bracketSpacing": true + }, + "globals": [ + "document", + "navigator", + "window", + "describe", + "test", + "it", + "expect", + "beforeAll", + "beforeEach", + "afterAll", + "afterEach", + "jest" + ], + "parser": { + "unsafeParameterDecoratorsEnabled": true + } + }, + "overrides": [ + { + "includes": ["**/*.ts", "**/*.tsx"], + "linter": { "rules": { "complexity": { "noVoid": "error" } } } + }, + { "includes": ["**/*.test.ts"], "linter": { "rules": {} } } + ] +} diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index 2d3860900..5795142a4 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -11,10 +11,13 @@ "@biomejs/biome": "2.0.0", "@elysiajs/trpc": "^1.1.0", "@elysiajs/websocket": "^0.2.8", + "@hashgraph/sdk": "^2.70.0", + "@sinclair/typebox": "^0.34.33", + "@sinclair/typemap": "^0.10.1", "@trpc/server": "^11.4.3", "@types/bun": "^1.2.17", "dotenv": "^10.0.0", - "elysia": "^1.3.5", + "elysia": "1.3.8", "graphql-request": "^7.2.0", "jose": "^5.2.2", "jsonrpc-ts-client": "^0.2.3", @@ -30,6 +33,176 @@ "@iota/client", ], "packages": { + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="], + + "@babel/core": ["@babel/core@7.28.3", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.3", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ=="], + + "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], + + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.3", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg=="], + + "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ=="], + + "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.5", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "debug": "^4.4.1", "lodash.debounce": "^4.0.8", "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="], + + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], + + "@babel/helper-remap-async-to-generator": ["@babel/helper-remap-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA=="], + + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.27.1", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA=="], + + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.28.3", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.2" } }, "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g=="], + + "@babel/helpers": ["@babel/helpers@7.28.3", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.2" } }, "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw=="], + + "@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], + + "@babel/plugin-proposal-export-default-from": ["@babel/plugin-proposal-export-default-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw=="], + + "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], + + "@babel/plugin-syntax-bigint": ["@babel/plugin-syntax-bigint@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="], + + "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="], + + "@babel/plugin-syntax-class-static-block": ["@babel/plugin-syntax-class-static-block@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="], + + "@babel/plugin-syntax-dynamic-import": ["@babel/plugin-syntax-dynamic-import@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ=="], + + "@babel/plugin-syntax-export-default-from": ["@babel/plugin-syntax-export-default-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg=="], + + "@babel/plugin-syntax-flow": ["@babel/plugin-syntax-flow@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA=="], + + "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww=="], + + "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="], + + "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], + + "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], + + "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="], + + "@babel/plugin-syntax-numeric-separator": ["@babel/plugin-syntax-numeric-separator@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="], + + "@babel/plugin-syntax-object-rest-spread": ["@babel/plugin-syntax-object-rest-spread@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="], + + "@babel/plugin-syntax-optional-catch-binding": ["@babel/plugin-syntax-optional-catch-binding@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="], + + "@babel/plugin-syntax-optional-chaining": ["@babel/plugin-syntax-optional-chaining@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="], + + "@babel/plugin-syntax-private-property-in-object": ["@babel/plugin-syntax-private-property-in-object@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg=="], + + "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="], + + "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA=="], + + "@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q=="], + + "@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA=="], + + "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q=="], + + "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA=="], + + "@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.3", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg=="], + + "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="], + + "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A=="], + + "@babel/plugin-transform-flow-strip-types": ["@babel/plugin-transform-flow-strip-types@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg=="], + + "@babel/plugin-transform-for-of": ["@babel/plugin-transform-for-of@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw=="], + + "@babel/plugin-transform-function-name": ["@babel/plugin-transform-function-name@7.27.1", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ=="], + + "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="], + + "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw=="], + + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], + + "@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="], + + "@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA=="], + + "@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw=="], + + "@babel/plugin-transform-object-rest-spread": ["@babel/plugin-transform-object-rest-spread@7.28.0", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA=="], + + "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="], + + "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg=="], + + "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg=="], + + "@babel/plugin-transform-private-methods": ["@babel/plugin-transform-private-methods@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA=="], + + "@babel/plugin-transform-private-property-in-object": ["@babel/plugin-transform-private-property-in-object@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ=="], + + "@babel/plugin-transform-react-display-name": ["@babel/plugin-transform-react-display-name@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA=="], + + "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/types": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], + + "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.28.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A=="], + + "@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg=="], + + "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="], + + "@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q=="], + + "@babel/plugin-transform-sticky-regex": ["@babel/plugin-transform-sticky-regex@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g=="], + + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg=="], + + "@babel/plugin-transform-unicode-regex": ["@babel/plugin-transform-unicode-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw=="], + + "@babel/runtime": ["@babel/runtime@7.28.3", "", {}, "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA=="], + + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + + "@babel/traverse": ["@babel/traverse@7.28.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/types": "^7.28.2", "debug": "^4.3.1" } }, "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ=="], + + "@babel/traverse--for-generate-function-map": ["@babel/traverse@7.28.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/types": "^7.28.2", "debug": "^4.3.1" } }, "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ=="], + + "@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], + "@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" }, "bin": { "biome": "bin/biome" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], @@ -48,25 +221,193 @@ "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + "@borewit/text-codec": ["@borewit/text-codec@0.1.1", "", {}, "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA=="], + "@elysiajs/trpc": ["@elysiajs/trpc@1.1.0", "", { "peerDependencies": { "elysia": ">= 1.1.0" } }, "sha512-M8QWC+Wa5Z5MWY/+uMQuwZ+JoQkp4jOc1ra4SncFy1zSjFGin59LO1AT0pE+DRJaFV17gha9y7cB6Q7GnaJEAw=="], "@elysiajs/websocket": ["@elysiajs/websocket@0.2.8", "", { "dependencies": { "nanoid": "^4.0.0", "raikiri": "^0.0.0-beta.3" }, "peerDependencies": { "elysia": ">= 0.2.2" } }, "sha512-K9KLmYL1SYuAV353GvmK0V9DG5w7XTOGsa1H1dGB5BUTzvBaMvnwNeqnJQ3cjf9V1c0EjQds0Ty4LfUFvV45jw=="], + "@ethersproject/abi": ["@ethersproject/abi@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q=="], + + "@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], + + "@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], + + "@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], + + "@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], + "@grpc/grpc-js": ["@grpc/grpc-js@1.13.4", "", { "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg=="], + + "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], + + "@hashgraph/cryptography": ["@hashgraph/cryptography@1.9.0", "", { "dependencies": { "@noble/curves": "^1.8.1", "asn1js": "^3.0.6", "bignumber.js": "^9.1.1", "bn.js": "^5.2.1", "buffer": "^6.0.3", "crypto-js": "^4.2.0", "forge-light": "1.1.4", "js-base64": "^3.7.7", "react-native-get-random-values": "^1.11.0", "spark-md5": "^3.0.2", "tweetnacl": "^1.0.3", "utf8": "^3.0.0" } }, "sha512-0UItolO1W/f8YIsGBrIxvjY+cSdvs4sEdzXOL49ThYEfPskJUprG3vhMhosRFoA4d0hxdJ7/glB7f7He8RW9xg=="], + + "@hashgraph/proto": ["@hashgraph/proto@2.20.0", "", { "dependencies": { "long": "^5.2.3", "protobufjs": "7.2.5" } }, "sha512-XGIHRE9jr4wnnmCG8JeUD/nyeCiiYoUt35oRJz0QdCUwJYtbEsR6tPQxO90PxJJVDI5smT1c5i0f9wRRtFDhIA=="], + + "@hashgraph/sdk": ["@hashgraph/sdk@2.70.0", "", { "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@grpc/grpc-js": "^1.12.6", "@hashgraph/cryptography": "1.9.0", "@hashgraph/proto": "2.20.0", "bignumber.js": "^9.1.1", "bn.js": "^5.1.1", "crypto-js": "^4.2.0", "js-base64": "^3.7.4", "long": "^5.3.1", "pino": "^9.6.0", "pino-pretty": "^13.0.0", "protobufjs": "7.2.5", "rfc4648": "^1.5.3", "utf8": "^3.0.0" } }, "sha512-naml5lWgewD3Dh8z0K7NRuKpbOpDaxpxwcLjtB9RFVmATMDU3IShSzxy24k5tUgY/0ZE7XXfCKgIpdT7TxGKqQ=="], + "@iota/client": ["@iota/client@2.2.4", "", { "dependencies": { "neon-cli": "^0.8", "prebuild-install": "^6.1.2" } }, "sha512-6zjtqJgkSgrMUFLbxr9k+zXGnEVw6gjTFn5emN2nKpR78+mwW4jUXuNcy/M194bK4sLHjj0T0L4pRWJ6XTGaew=="], - "@sinclair/typebox": ["@sinclair/typebox@0.34.37", "", {}, "sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw=="], + "@isaacs/ttlcache": ["@isaacs/ttlcache@1.4.1", "", {}, "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="], + + "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], + + "@istanbuljs/schema": ["@istanbuljs/schema@0.1.3", "", {}, "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="], + + "@jest/create-cache-key-function": ["@jest/create-cache-key-function@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3" } }, "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA=="], + + "@jest/environment": ["@jest/environment@29.7.0", "", { "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" } }, "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw=="], + + "@jest/fake-timers": ["@jest/fake-timers@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ=="], + + "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], + + "@jest/transform": ["@jest/transform@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw=="], + + "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.30", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q=="], + + "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], + + "@noble/curves": ["@noble/curves@1.9.6", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA=="], + + "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + + "@react-native/assets-registry": ["@react-native/assets-registry@0.81.0", "", {}, "sha512-rZs8ziQ1YRV3Z5Mw5AR7YcgI3q1Ya9NIx6nyuZAT9wDSSjspSi+bww+Hargh/a4JfV2Ajcxpn9X9UiFJr1ddPw=="], + + "@react-native/babel-plugin-codegen": ["@react-native/babel-plugin-codegen@0.81.0", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.0" } }, "sha512-MEMlW91+2Kk9GiObRP1Nc6oTdiyvmSEbPMSC6kzUzDyouxnh5/x28uyNySmB2nb6ivcbmQ0lxaU059+CZSkKXQ=="], + + "@react-native/babel-preset": ["@react-native/babel-preset@0.81.0", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-transform-arrow-functions": "^7.24.7", "@babel/plugin-transform-async-generator-functions": "^7.25.4", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-classes": "^7.25.4", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-for-of": "^7.24.7", "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", "@babel/plugin-transform-numeric-separator": "^7.24.7", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-react-display-name": "^7.24.7", "@babel/plugin-transform-react-jsx": "^7.25.2", "@babel/plugin-transform-react-jsx-self": "^7.24.7", "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-shorthand-properties": "^7.24.7", "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", "@react-native/babel-plugin-codegen": "0.81.0", "babel-plugin-syntax-hermes-parser": "0.29.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" } }, "sha512-RKMgCUGsso/2b32kgg24lB68LJ6qr2geLoSQTbisY6Usye0uXeXCgbZZDbILIX9upL4uzU4staMldRZ0v08F1g=="], + + "@react-native/codegen": ["@react-native/codegen@0.81.0", "", { "dependencies": { "glob": "^7.1.1", "hermes-parser": "0.29.1", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" }, "peerDependencies": { "@babel/core": "*" } }, "sha512-gPFutgtj8YqbwKKt3YpZKamUBGd9YZJV51Jq2aiDZ9oThkg1frUBa20E+Jdi7jKn982wjBMxAklAR85QGQ4xMA=="], + + "@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.81.0", "", { "dependencies": { "@react-native/dev-middleware": "0.81.0", "debug": "^4.4.0", "invariant": "^2.2.4", "metro": "^0.83.1", "metro-config": "^0.83.1", "metro-core": "^0.83.1", "semver": "^7.1.3" }, "peerDependencies": { "@react-native-community/cli": "*", "@react-native/metro-config": "*" }, "optionalPeers": ["@react-native-community/cli"] }, "sha512-n04ACkCaLR54NmA/eWiDpjC16pHr7+yrbjQ6OEdRoXbm5EfL8FEre2kDAci7pfFdiSMpxdRULDlKpfQ+EV/GAQ=="], + + "@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.81.0", "", {}, "sha512-N/8uL2CGQfwiQRYFUNfmaYxRDSoSeOmFb56rb0PDnP3XbS5+X9ee7X4bdnukNHLGfkRdH7sVjlB8M5zE8XJOhw=="], + + "@react-native/dev-middleware": ["@react-native/dev-middleware@0.81.0", "", { "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.0", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", "ws": "^6.2.3" } }, "sha512-J/HeC/+VgRyGECPPr9rAbe5S0OL6MCIrvrC/kgNKSME5+ZQLCiTpt3pdAoAMXwXiF9a02Nmido0DnyM1acXTIA=="], + + "@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.81.0", "", {}, "sha512-LGNtPXO1RKLws5ORRb4Q4YULi2qxM4qZRuARtwqM/1f2wyZVggqapoV0OXlaXaz+GiEd2ll3ROE4CcLN6J93jg=="], + + "@react-native/js-polyfills": ["@react-native/js-polyfills@0.81.0", "", {}, "sha512-whXZWIogzoGpqdyTjqT89M6DXmlOkWqNpWoVOAwVi8XFCMO+L7WTk604okIgO6gdGZcP1YtFpQf9JusbKrv/XA=="], + + "@react-native/metro-babel-transformer": ["@react-native/metro-babel-transformer@0.81.0", "", { "dependencies": { "@babel/core": "^7.25.2", "@react-native/babel-preset": "0.81.0", "hermes-parser": "0.29.1", "nullthrows": "^1.1.1" } }, "sha512-Mwovr4jJ3JTnbHEQLhdcMvS82LjijpqCydXl1aH2N16WVCrE5oSNFiqTt6NpZBw9zkJX7nijsY+xeCy6m+KK3Q=="], + + "@react-native/metro-config": ["@react-native/metro-config@0.81.0", "", { "dependencies": { "@react-native/js-polyfills": "0.81.0", "@react-native/metro-babel-transformer": "0.81.0", "metro-config": "^0.83.1", "metro-runtime": "^0.83.1" } }, "sha512-5eqLP4TCERHGRYDJSZa//O98CGDFNNEwHVvhs65Msfy6hAoSdw5pAAuTrsQwmbTBp0Fkvu7Bx8BZDhiferZsHg=="], + + "@react-native/normalize-colors": ["@react-native/normalize-colors@0.81.0", "", {}, "sha512-3gEu/29uFgz+81hpUgdlOojM4rjHTIPwxpfygFNY60V6ywZih3eLDTS8kAjNZfPFHQbcYrNorJzwnL5yFF/uLw=="], + + "@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.81.0", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-p14QC5INHkbMZ96158sUxkSwN6zp138W11G+CRGoLJY4Q9WRJBCe7wHR5Owyy3XczQXrIih/vxAXwgYeZ2XByg=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.34.39", "", {}, "sha512-keEoFsevmLwAedzacnTVmra66GViRH3fhWO1M+nZ8rUgpPJyN4mcvqlGr3QMrQXx4L8KNwW0q9/BeHSEoO4teg=="], + + "@sinclair/typemap": ["@sinclair/typemap@0.10.1", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.30", "valibot": "^1.0.0", "zod": "^3.24.1" } }, "sha512-UXR0fhu/n3c9B6lB+SLI5t1eVpt9i9CdDrp2TajRe3LbKiUhCTZN2kSfJhjPnpc3I59jMRIhgew7+0HlMi08mg=="], + + "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "@sinonjs/fake-timers": ["@sinonjs/fake-timers@10.3.0", "", { "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA=="], "@tokenizer/inflate": ["@tokenizer/inflate@0.2.7", "", { "dependencies": { "debug": "^4.4.0", "fflate": "^0.8.2", "token-types": "^6.0.0" } }, "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg=="], "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], - "@trpc/server": ["@trpc/server@11.4.3", "", { "peerDependencies": { "typescript": ">=5.7.2" } }, "sha512-wnWq3wiLlMOlYkaIZz+qbuYA5udPTLS4GVVRyFkr6aT83xpdCHyVtURT+u4hSoIrOXQM9OPCNXSXsAujWZDdaw=="], + "@trpc/server": ["@trpc/server@11.4.4", "", { "peerDependencies": { "typescript": ">=5.7.2" } }, "sha512-VkJb2xnb4rCynuwlCvgPBh5aM+Dco6fBBIo6lWAdJJRYVwtyE5bxNZBgUvRRz/cFSEAy0vmzLxF7aABDJfK5Rg=="], - "@types/bun": ["@types/bun@1.2.17", "", { "dependencies": { "bun-types": "1.2.17" } }, "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q=="], + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], - "@types/node": ["@types/node@24.0.7", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw=="], + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], + + "@types/bun": ["@types/bun@1.2.20", "", { "dependencies": { "bun-types": "1.2.20" } }, "sha512-dX3RGzQ8+KgmMw7CsW4xT5ITBSCrSbfHc36SNT31EOUg/LA9JWq0VDdEXDRSe1InVWpd2yLUM1FUF/kEOyTzYA=="], + + "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="], + + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], + + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], + + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], + + "@types/node": ["@types/node@24.3.0", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow=="], + + "@types/react": ["@types/react@19.1.10", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg=="], + + "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], + + "@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + + "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "anser": ["anser@1.4.10", "", {}, "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="], "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], @@ -74,40 +415,102 @@ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + "aproba": ["aproba@1.2.0", "", {}, "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="], "are-we-there-yet": ["are-we-there-yet@1.1.7", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g=="], + "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "array-back": ["array-back@3.1.0", "", {}, "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q=="], + "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], + + "asn1js": ["asn1js@3.0.6", "", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA=="], + + "async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="], + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], + "axios": ["axios@0.24.0", "", { "dependencies": { "follow-redirects": "^1.14.4" } }, "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA=="], + "babel-jest": ["babel-jest@29.7.0", "", { "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg=="], + + "babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="], + + "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@29.6.3", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg=="], + + "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.14", "", { "dependencies": { "@babel/compat-data": "^7.27.7", "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg=="], + + "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="], + + "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.5", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg=="], + + "babel-plugin-syntax-hermes-parser": ["babel-plugin-syntax-hermes-parser@0.29.1", "", { "dependencies": { "hermes-parser": "0.29.1" } }, "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA=="], + + "babel-plugin-transform-flow-enums": ["babel-plugin-transform-flow-enums@0.0.2", "", { "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } }, "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ=="], + + "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.2.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg=="], + + "babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="], + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + "bn.js": ["bn.js@5.2.2", "", {}, "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw=="], + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "brorand": ["brorand@1.1.0", "", {}, "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="], + + "browserslist": ["browserslist@4.25.2", "", { "dependencies": { "caniuse-lite": "^1.0.30001733", "electron-to-chromium": "^1.5.199", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA=="], + + "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], "builtins": ["builtins@1.0.3", "", {}, "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ=="], - "bun-types": ["bun-types@1.2.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ=="], + "bun-types": ["bun-types@1.2.20", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-pxTnQYOrKvdOwyiyd/7sMt9yFOenN004Y6O4lCcCUoKVej48FS5cvTw9geRaEcB9TsDZaJKAxPTVvi8tFsVuXA=="], "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + "caller-callsite": ["caller-callsite@2.0.0", "", { "dependencies": { "callsites": "^2.0.0" } }, "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ=="], + + "caller-path": ["caller-path@2.0.0", "", { "dependencies": { "caller-callsite": "^2.0.0" } }, "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A=="], + + "callsites": ["callsites@2.0.0", "", {}, "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001735", "", {}, "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w=="], + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "chardet": ["chardet@0.7.0", "", {}, "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="], "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + "chrome-launcher": ["chrome-launcher@0.15.2", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" } }, "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ=="], + + "chromium-edge-launcher": ["chromium-edge-launcher@0.2.0", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0", "mkdirp": "^1.0.4", "rimraf": "^3.0.2" } }, "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg=="], + + "ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], + "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], "cli-width": ["cli-width@3.0.0", "", {}, "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="], @@ -124,6 +527,8 @@ "color-support": ["color-support@1.1.3", "", { "bin": { "color-support": "bin.js" } }, "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="], + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], "command-line-args": ["command-line-args@5.2.1", "", { "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", "lodash.camelcase": "^4.3.0", "typical": "^4.0.0" } }, "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg=="], @@ -136,14 +541,28 @@ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + "connect": ["connect@3.7.0", "", { "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", "parseurl": "~1.3.3", "utils-merge": "1.0.1" } }, "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ=="], + "console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], + "core-js-compat": ["core-js-compat@3.45.0", "", { "dependencies": { "browserslist": "^4.25.1" } }, "sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA=="], + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + "cosmiconfig": ["cosmiconfig@5.2.1", "", { "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" } }, "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="], + + "crypto-js": ["crypto-js@4.2.0", "", {}, "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + "date-format": ["date-format@4.0.14", "", {}, "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg=="], + "dateformat": ["dateformat@4.6.3", "", {}, "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA=="], + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], "decompress-response": ["decompress-response@4.2.1", "", { "dependencies": { "mimic-response": "^2.0.0" } }, "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw=="], @@ -154,18 +573,34 @@ "delegates": ["delegates@1.0.0", "", {}, "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="], + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], "dotenv": ["dotenv@10.0.0", "", {}, "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="], "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - "elysia": ["elysia@1.3.5", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.1.2", "fast-decode-uri-component": "^1.0.1" }, "optionalDependencies": { "@sinclair/typebox": "^0.34.33", "openapi-types": "^12.1.3" }, "peerDependencies": { "file-type": ">= 20.0.0", "typescript": ">= 5.0.0" } }, "sha512-XVIKXlKFwUT7Sta8GY+wO5reD9I0rqAEtaz1Z71UgJb61csYt8Q3W9al8rtL5RgumuRR8e3DNdzlUN9GkC4KDw=="], + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.202", "", {}, "sha512-NxbYjRmiHcHXV1Ws3fWUW+SLb62isauajk45LUJ/HgIOkUA7jLZu/X2Iif+X9FBNK8QkF9Zb4Q2mcwXCcY30mg=="], + + "elliptic": ["elliptic@6.6.1", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="], + + "elysia": ["elysia@1.3.8", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.1.3", "fast-decode-uri-component": "^1.0.1" }, "optionalDependencies": { "@sinclair/typebox": "^0.34.33", "openapi-types": "^12.1.3" }, "peerDependencies": { "file-type": ">= 20.0.0", "typescript": ">= 5.0.0" } }, "sha512-kxYFhegJbUEf5otzmisEvGt3R7d/dPBNVERO2nHo0kFqKBHyj5slArc90mSRKLfi1vamMtPcz67rL6Zeg5F2yg=="], "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], @@ -176,18 +611,40 @@ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - "exact-mirror": ["exact-mirror@0.1.2", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-wFCPCDLmHbKGUb8TOi/IS7jLsgR8WVDGtDK3CzcB4Guf/weq7G+I+DkXiRSZfbemBFOxOINKpraM6ml78vo8Zw=="], + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "exact-mirror": ["exact-mirror@0.1.3", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-yI62LpSby0ItzPJF05C4DRycVAoknRiCIDOLOCCs9zaEKylOXQtOFM3flX54S44swpRz584vk3P70yWQodsLlg=="], "execspawn": ["execspawn@1.0.1", "", { "dependencies": { "util-extend": "^1.0.1" } }, "sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg=="], "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + "exponential-backoff": ["exponential-backoff@3.1.2", "", {}, "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA=="], + "external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="], + "fast-base64-decode": ["fast-base64-decode@1.0.0", "", {}, "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q=="], + + "fast-copy": ["fast-copy@3.0.2", "", {}, "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ=="], + "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="], + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-redact": ["fast-redact@3.5.0", "", {}, "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="], + + "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="], + + "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], + "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], @@ -196,13 +653,25 @@ "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "finalhandler": ["finalhandler@1.1.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA=="], + "find-replace": ["find-replace@3.0.0", "", { "dependencies": { "array-back": "^3.0.1" } }, "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ=="], + "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], - "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + "flow-enums-runtime": ["flow-enums-runtime@0.0.6", "", {}, "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="], - "form-data": ["form-data@4.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA=="], + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + + "forge-light": ["forge-light@1.1.4", "", {}, "sha512-Nr0xdu93LJawgBZVU/tC+A+4pbKqigdY5PRBz8CXNm4e5saAZIqU2Qe9+nVFtVO5TWCHSgvI0LaZZuatgE5J1g=="], + + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], @@ -212,14 +681,20 @@ "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], "gauge": ["gauge@2.7.4", "", { "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.0", "object-assign": "^4.1.0", "signal-exit": "^3.0.0", "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" } }, "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg=="], + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="], + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], "git-config": ["git-config@0.0.7", "", { "dependencies": { "iniparser": "~1.0.5" } }, "sha512-LidZlYZXWzVjS+M3TEwhtYBaYwLeOZrXci1tBgqp/vDdZTBMl02atvwb6G35L64ibscYoPnxfbwwUS+VZAISLA=="], @@ -248,12 +723,32 @@ "has-unicode": ["has-unicode@2.0.1", "", {}, "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="], + "hash.js": ["hash.js@1.1.7", "", { "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="], + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "help-me": ["help-me@5.0.0", "", {}, "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg=="], + + "hermes-estree": ["hermes-estree@0.29.1", "", {}, "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ=="], + + "hermes-parser": ["hermes-parser@0.29.1", "", { "dependencies": { "hermes-estree": "0.29.1" } }, "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA=="], + + "hmac-drbg": ["hmac-drbg@1.0.1", "", { "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + "image-size": ["image-size@1.2.1", "", { "dependencies": { "queue": "6.0.2" }, "bin": { "image-size": "bin/image-size.js" } }, "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw=="], + + "import-fresh": ["import-fresh@2.0.0", "", { "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" } }, "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -264,30 +759,140 @@ "inquirer": ["inquirer@7.3.3", "", { "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.19", "mute-stream": "0.0.8", "run-async": "^2.4.0", "rxjs": "^6.6.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" } }, "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA=="], + "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-directory": ["is-directory@0.3.1", "", {}, "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], + + "istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], + + "jest-environment-node": ["jest-environment-node@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw=="], + + "jest-get-type": ["jest-get-type@29.6.3", "", {}, "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw=="], + + "jest-haste-map": ["jest-haste-map@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA=="], + + "jest-message-util": ["jest-message-util@29.7.0", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w=="], + + "jest-mock": ["jest-mock@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" } }, "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw=="], + + "jest-regex-util": ["jest-regex-util@29.6.3", "", {}, "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg=="], + + "jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], + + "jest-validate": ["jest-validate@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" } }, "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw=="], + + "jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + "jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="], + "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="], + + "js-base64": ["js-base64@3.7.8", "", {}, "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow=="], + + "js-sha3": ["js-sha3@0.8.0", "", {}, "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "jsc-safe-url": ["jsc-safe-url@0.2.4", "", {}, "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-parse-better-errors": ["json-parse-better-errors@1.0.2", "", {}, "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], "jsonrpc-ts-client": ["jsonrpc-ts-client@0.2.3", "", { "dependencies": { "axios": "^0.24.0", "debug": "^4.3.3" } }, "sha512-9uYpKrZKN3/3+9MYA/0vdhl9/esn59u6I9Qj6ohczxKwJ+e7DD4prf3i2nSdAl0Wlw5gBHZOL3wajSa1uiE16g=="], + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "lighthouse-logger": ["lighthouse-logger@1.4.2", "", { "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g=="], + + "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + + "lodash.throttle": ["lodash.throttle@4.1.1", "", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="], + "log4js": ["log4js@6.9.1", "", { "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "flatted": "^3.2.7", "rfdc": "^1.3.0", "streamroller": "^3.1.5" } }, "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g=="], + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "make-promises-safe": ["make-promises-safe@5.1.0", "", {}, "sha512-AfdZ49rtyhQR/6cqVKGoH7y4ql7XkS5HJI1lZm0/5N6CQosy1eYbBJ/qbhkKHzo17UH7M918Bysf6XB9f3kS1g=="], + "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="], + + "marky": ["marky@1.3.0", "", {}, "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ=="], + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + "memoize-one": ["memoize-one@5.2.1", "", {}, "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="], + "memory-stream": ["memory-stream@1.0.0", "", { "dependencies": { "readable-stream": "^3.4.0" } }, "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww=="], + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "metro": ["metro@0.83.1", "", { "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/parser": "^7.25.3", "@babel/template": "^7.25.0", "@babel/traverse": "^7.25.3", "@babel/types": "^7.25.2", "accepts": "^1.3.7", "chalk": "^4.0.0", "ci-info": "^2.0.0", "connect": "^3.6.5", "debug": "^4.4.0", "error-stack-parser": "^2.0.6", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "hermes-parser": "0.29.1", "image-size": "^1.0.2", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", "metro-babel-transformer": "0.83.1", "metro-cache": "0.83.1", "metro-cache-key": "0.83.1", "metro-config": "0.83.1", "metro-core": "0.83.1", "metro-file-map": "0.83.1", "metro-resolver": "0.83.1", "metro-runtime": "0.83.1", "metro-source-map": "0.83.1", "metro-symbolicate": "0.83.1", "metro-transform-plugins": "0.83.1", "metro-transform-worker": "0.83.1", "mime-types": "^2.1.27", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", "source-map": "^0.5.6", "throat": "^5.0.0", "ws": "^7.5.10", "yargs": "^17.6.2" }, "bin": { "metro": "src/cli.js" } }, "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA=="], + + "metro-babel-transformer": ["metro-babel-transformer@0.83.1", "", { "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", "hermes-parser": "0.29.1", "nullthrows": "^1.1.1" } }, "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ=="], + + "metro-cache": ["metro-cache@0.83.1", "", { "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", "metro-core": "0.83.1" } }, "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ=="], + + "metro-cache-key": ["metro-cache-key@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg=="], + + "metro-config": ["metro-config@0.83.1", "", { "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", "metro": "0.83.1", "metro-cache": "0.83.1", "metro-core": "0.83.1", "metro-runtime": "0.83.1" } }, "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA=="], + + "metro-core": ["metro-core@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", "metro-resolver": "0.83.1" } }, "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q=="], + + "metro-file-map": ["metro-file-map@0.83.1", "", { "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "nullthrows": "^1.1.1", "walker": "^1.0.7" } }, "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w=="], + + "metro-minify-terser": ["metro-minify-terser@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" } }, "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A=="], + + "metro-resolver": ["metro-resolver@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g=="], + + "metro-runtime": ["metro-runtime@0.83.1", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA=="], + + "metro-source-map": ["metro-source-map@0.83.1", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-symbolicate": "0.83.1", "nullthrows": "^1.1.1", "ob1": "0.83.1", "source-map": "^0.5.6", "vlq": "^1.0.0" } }, "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A=="], + + "metro-symbolicate": ["metro-symbolicate@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-source-map": "0.83.1", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "bin": { "metro-symbolicate": "src/index.js" } }, "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg=="], + + "metro-transform-plugins": ["metro-transform-plugins@0.83.1", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/template": "^7.25.0", "@babel/traverse": "^7.25.3", "flow-enums-runtime": "^0.0.6", "nullthrows": "^1.1.1" } }, "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ=="], + + "metro-transform-worker": ["metro-transform-worker@0.83.1", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/parser": "^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "metro": "0.83.1", "metro-babel-transformer": "0.83.1", "metro-cache": "0.83.1", "metro-cache-key": "0.83.1", "metro-minify-terser": "0.83.1", "metro-source-map": "0.83.1", "metro-transform-plugins": "0.83.1", "nullthrows": "^1.1.1" } }, "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], @@ -296,6 +901,10 @@ "mimic-response": ["mimic-response@2.1.0", "", {}, "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="], + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], + + "minimalistic-crypto-utils": ["minimalistic-crypto-utils@1.0.1", "", {}, "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="], + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], @@ -312,12 +921,14 @@ "mute-stream": ["mute-stream@0.0.8", "", {}, "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="], - "nan": ["nan@2.22.2", "", {}, "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ=="], + "nan": ["nan@2.23.0", "", {}, "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ=="], "nanoid": ["nanoid@4.0.2", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw=="], "napi-build-utils": ["napi-build-utils@1.0.2", "", {}, "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="], + "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], "neon-cli": ["neon-cli@0.8.3", "", { "dependencies": { "chalk": "^4.1.0", "command-line-args": "^5.1.1", "command-line-commands": "^3.0.1", "command-line-usage": "^6.1.0", "git-config": "0.0.7", "handlebars": "^4.7.6", "inquirer": "^7.3.3", "make-promises-safe": "^5.1.0", "rimraf": "^3.0.2", "semver": "^7.3.2", "toml": "^3.0.0", "ts-typed-json": "^0.3.2", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^3.0.0" }, "bin": { "neon": "bin/cli.js" } }, "sha512-I44MB8PD0AEyFr/b5icR4sX1tsjdkb2T2uWEStG4Uf5C/jzalZPn7eazbQrW6KDyXNd8bc+LVuOr1v6CGTa1KQ=="], @@ -330,6 +941,12 @@ "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], + + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + "npm-path": ["npm-path@2.0.4", "", { "dependencies": { "which": "^1.2.10" }, "bin": { "npm-path": "bin/npm-path" } }, "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw=="], "npm-run-path": ["npm-run-path@3.1.0", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg=="], @@ -338,44 +955,132 @@ "npmlog": ["npmlog@4.1.2", "", { "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg=="], + "nullthrows": ["nullthrows@1.1.1", "", {}, "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw=="], + "number-is-nan": ["number-is-nan@1.0.1", "", {}, "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="], + "ob1": ["ob1@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ=="], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], + + "on-finished": ["on-finished@2.3.0", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="], + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], + "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "parse-json": ["parse-json@4.0.0", "", { "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pino": ["pino@9.9.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-zxsRIQG9HzG+jEljmvmZupOMDUQ0Jpj0yAgE28jQvvrdYTlEaiGwelJpdndMl/MBuRr70heIj83QyqJUWaU8mQ=="], + + "pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="], + + "pino-pretty": ["pino-pretty@13.1.1", "", { "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", "fast-copy": "^3.0.2", "fast-safe-stringify": "^2.1.1", "help-me": "^5.0.0", "joycon": "^3.1.1", "minimist": "^1.2.6", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pump": "^3.0.0", "secure-json-parse": "^4.0.0", "sonic-boom": "^4.0.1", "strip-json-comments": "^5.0.2" }, "bin": { "pino-pretty": "bin.js" } }, "sha512-TNNEOg0eA0u+/WuqH0MH0Xui7uqVk9D74ESOpjtebSQYbNWJk/dIxCXIxFsNfeN53JmtWqYHP2OrIZjT/CBEnA=="], + + "pino-std-serializers": ["pino-std-serializers@7.0.0", "", {}, "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA=="], + + "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + "prebuild-install": ["prebuild-install@6.1.4", "", { "dependencies": { "detect-libc": "^1.0.3", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^1.0.1", "node-abi": "^2.21.0", "npmlog": "^4.0.1", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^3.0.3", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ=="], "prebuildify": ["prebuildify@github:einhornimmond/prebuildify#65d9445", { "dependencies": { "cmake-js": "^7.2.1", "execspawn": "^1.0.1", "minimist": "^1.2.5", "mkdirp-classic": "^0.5.3", "node-abi": "^3.3.0", "npm-run-path": "^3.1.0", "npm-which": "^3.0.1", "pump": "^3.0.0", "tar-fs": "^2.1.0" }, "bin": { "prebuildify": "./bin.js" } }, "einhornimmond-prebuildify-65d9445"], + "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], + + "promise": ["promise@8.3.0", "", { "dependencies": { "asap": "~2.0.6" } }, "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg=="], + + "protobufjs": ["protobufjs@7.2.5", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A=="], + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], + "pvtsutils": ["pvtsutils@1.3.6", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg=="], + + "pvutils": ["pvutils@1.1.3", "", {}, "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ=="], + + "queue": ["queue@6.0.2", "", { "dependencies": { "inherits": "~2.0.3" } }, "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA=="], + + "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], + "raikiri": ["raikiri@0.0.0-beta.8", "", {}, "sha512-cH/yfvkiGkN8IBB2MkRHikpPurTnd2sMkQ/xtGpXrp3O76P4ppcWPb+86mJaBDzKaclLnSX+9NnT79D7ifH4/w=="], + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + "react": ["react@19.1.1", "", {}, "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ=="], + + "react-devtools-core": ["react-devtools-core@6.1.5", "", { "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" } }, "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA=="], + + "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "react-native": ["react-native@0.81.0", "", { "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.81.0", "@react-native/codegen": "0.81.0", "@react-native/community-cli-plugin": "0.81.0", "@react-native/gradle-plugin": "0.81.0", "@react-native/js-polyfills": "0.81.0", "@react-native/normalize-colors": "0.81.0", "@react-native/virtualized-lists": "0.81.0", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", "babel-plugin-syntax-hermes-parser": "0.29.1", "base64-js": "^1.5.1", "commander": "^12.0.0", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", "metro-runtime": "^0.83.1", "metro-source-map": "^0.83.1", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", "scheduler": "0.26.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", "ws": "^6.2.3", "yargs": "^17.6.2" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "^19.1.0" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-RDWhewHGsAa5uZpwIxnJNiv5tW2y6/DrQUjEBdAHPzGMwuMTshern2s4gZaWYeRU3SQguExVddCjiss9IBhxqA=="], + + "react-native-get-random-values": ["react-native-get-random-values@1.11.0", "", { "dependencies": { "fast-base64-decode": "^1.0.0" }, "peerDependencies": { "react-native": ">=0.56" } }, "sha512-4BTbDbRmS7iPdhYLRcz3PGFIpFJBwNZg9g42iwa2P6FOv9vZj/xJc678RZXnLNZzd0qd7Q3CCF6Yd+CU2eoXKQ=="], + + "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], + "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], + "reduce-flatten": ["reduce-flatten@2.0.0", "", {}, "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w=="], + "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], + + "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.0", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA=="], + + "regenerator-runtime": ["regenerator-runtime@0.13.11", "", {}, "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="], + + "regexpu-core": ["regexpu-core@6.2.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA=="], + + "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="], + + "regjsparser": ["regjsparser@0.12.0", "", { "dependencies": { "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ=="], + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], + "rfc4648": ["rfc4648@1.5.4", "", {}, "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg=="], + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], @@ -386,27 +1091,63 @@ "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], + + "secure-json-parse": ["secure-json-parse@4.0.0", "", {}, "sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA=="], + "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "serialize-error": ["serialize-error@2.1.0", "", {}, "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw=="], + + "serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], "simple-get": ["simple-get@3.1.1", "", { "dependencies": { "decompress-response": "^4.2.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA=="], + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "sonic-boom": ["sonic-boom@4.2.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww=="], + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "spark-md5": ["spark-md5@3.0.2", "", {}, "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="], + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], - "spdx-license-ids": ["spdx-license-ids@3.0.21", "", {}, "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg=="], + "spdx-license-ids": ["spdx-license-ids@3.0.22", "", {}, "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ=="], + + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + + "stackframe": ["stackframe@1.3.4", "", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="], + + "stacktrace-parser": ["stacktrace-parser@0.1.11", "", { "dependencies": { "type-fest": "^0.7.1" } }, "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg=="], + + "statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], "streamroller": ["streamroller@3.1.5", "", { "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "fs-extra": "^8.1.0" } }, "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw=="], @@ -416,12 +1157,14 @@ "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], - "strtok3": ["strtok3@10.3.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-3JWEZM6mfix/GCJBBUrkA8p2Id2pBkyTkVCJKto55w080QBKZ+8R171fGrbiSp+yMO/u6F8/yUh7K4V9K+YCnw=="], + "strtok3": ["strtok3@10.3.4", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + "table-layout": ["table-layout@1.0.2", "", { "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", "typical": "^5.2.0", "wordwrapjs": "^4.0.0" } }, "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A=="], "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], @@ -430,40 +1173,74 @@ "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + "terser": ["terser@5.43.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg=="], + + "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="], + + "throat": ["throat@5.0.0", "", {}, "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="], + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], "tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], - "token-types": ["token-types@6.0.3", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-IKJ6EzuPPWtKtEIEPpIdXv9j5j2LGJEYk0CKY2efgKoYKLBiZdh6iQkLVBow/CB3phyWAWCyk+bZeaimJn6uRQ=="], + "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "token-types": ["token-types@6.1.1", "", { "dependencies": { "@borewit/text-codec": "^0.1.0", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ=="], "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], "ts-typed-json": ["ts-typed-json@0.3.2", "", {}, "sha512-Tdu3BWzaer7R5RvBIJcg9r8HrTZgpJmsX+1meXMJzYypbkj8NK2oJN0yvm4Dp/Iv6tzFa/L5jKRmEVTga6K3nA=="], - "tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + "tweetnacl": ["tweetnacl@1.0.3", "", {}, "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="], + + "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], + "type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], - "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], "typical": ["typical@4.0.0", "", {}, "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw=="], "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], - "uint8array-extras": ["uint8array-extras@1.4.0", "", {}, "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ=="], + "uint8array-extras": ["uint8array-extras@1.4.1", "", {}, "sha512-+NWHrac9dvilNgme+gP4YrBSumsaMZP0fNBtXXFIf33RLLKEcBUKaQZ7ULUbS0sBfcjxIZ4V96OTRkCbM7hxpw=="], - "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="], + + "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], + + "unicode-match-property-ecmascript": ["unicode-match-property-ecmascript@2.0.0", "", { "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="], + + "unicode-match-property-value-ecmascript": ["unicode-match-property-value-ecmascript@2.2.0", "", {}, "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg=="], + + "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.1.0", "", {}, "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w=="], "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + "url-join": ["url-join@4.0.1", "", {}, "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="], + "utf8": ["utf8@3.0.0", "", {}, "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="], + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], "util-extend": ["util-extend@1.0.3", "", {}, "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA=="], + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], "valibot": ["valibot@1.1.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw=="], @@ -472,6 +1249,12 @@ "validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], + "vlq": ["vlq@1.0.1", "", {}, "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w=="], + + "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="], + + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], @@ -484,6 +1267,10 @@ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "write-file-atomic": ["write-file-atomic@4.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } }, "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg=="], + + "ws": ["ws@6.2.3", "", { "dependencies": { "async-limiter": "~1.0.0" } }, "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA=="], + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], @@ -492,13 +1279,35 @@ "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "zod": ["zod@3.25.67", "", {}, "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw=="], + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/plugin-transform-runtime/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], + + "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "cmake-js/axios": ["axios@1.10.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw=="], + "chrome-launcher/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "cmake-js/fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="], + "chromium-edge-launcher/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "cmake-js/axios": ["axios@1.11.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA=="], + + "cmake-js/fs-extra": ["fs-extra@11.3.1", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g=="], "cmake-js/npmlog": ["npmlog@6.0.2", "", { "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.3", "set-blocking": "^2.0.0" } }, "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg=="], @@ -510,14 +1319,44 @@ "command-line-usage/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], + "connect/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "elliptic/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], + + "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "finalhandler/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], "gauge/string-width": ["string-width@1.0.2", "", { "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw=="], "gauge/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], + "http-errors/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "import-fresh/resolve-from": ["resolve-from@3.0.0", "", {}, "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="], + + "istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "jest-util/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "memory-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "metro/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "metro-symbolicate/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], "node-abi/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], @@ -528,8 +1367,32 @@ "prebuildify/node-abi": ["node-abi@3.75.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg=="], + "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "react-devtools-core/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "react-native/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + "regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], + + "rxjs/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "send/on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "send/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + + "stacktrace-parser/type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], + "string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "table-layout/array-back": ["array-back@4.0.2", "", {}, "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="], @@ -542,9 +1405,7 @@ "wordwrapjs/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], - "bl/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], - - "cmake-js/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], + "cmake-js/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "cmake-js/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], @@ -556,13 +1417,17 @@ "command-line-usage/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + "connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "gauge/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@1.0.0", "", { "dependencies": { "number-is-nan": "^1.0.0" } }, "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw=="], "gauge/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], - "memory-stream/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + "lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "tar-stream/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "cmake-js/npmlog/are-we-there-yet/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], @@ -570,8 +1435,6 @@ "command-line-usage/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "cmake-js/npmlog/are-we-there-yet/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], - "command-line-usage/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], } } diff --git a/dlt-connector/package.json b/dlt-connector/package.json index 08804bc0f..5bb4f4f08 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -1,6 +1,11 @@ { "name": "dlt-connector", + "repository": "git@github.com:gradido/gradido.git", + "description": "Gradido DLT-Connector", + "author": "Gradido Academy - https://www.gradido.net", + "license": "Apache-2.0", "version": "1.0.50", + "private": true, "scripts": { "start": "bun run src/index.ts", "build": "bun build src/index.ts --outdir=build --target=bun --external=gradido-blockchain-js --external=@iota/client", @@ -19,10 +24,13 @@ "@biomejs/biome": "2.0.0", "@elysiajs/trpc": "^1.1.0", "@elysiajs/websocket": "^0.2.8", + "@hashgraph/sdk": "^2.70.0", + "@sinclair/typebox": "^0.34.33", + "@sinclair/typemap": "^0.10.1", "@trpc/server": "^11.4.3", "@types/bun": "^1.2.17", "dotenv": "^10.0.0", - "elysia": "^1.3.5", + "elysia": "1.3.8", "graphql-request": "^7.2.0", "jose": "^5.2.2", "jsonrpc-ts-client": "^0.2.3", diff --git a/dlt-connector/src/KeyPairCacheManager.ts b/dlt-connector/src/KeyPairCacheManager.ts index b5501132c..a74780471 100644 --- a/dlt-connector/src/KeyPairCacheManager.ts +++ b/dlt-connector/src/KeyPairCacheManager.ts @@ -1,8 +1,8 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { KeyPairIdentifier } from './data/KeyPairIdentifier.logic' import { getLogger, Logger } from 'log4js' import { LOG4JS_BASE_CATEGORY } from './config/const' +import { HieroId } from './schemas/typeGuard.schema' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts @@ -13,7 +13,7 @@ import { LOG4JS_BASE_CATEGORY } from './config/const' export class KeyPairCacheManager { private static instance: KeyPairCacheManager private cache: Map = new Map() - private homeCommunityUUID: string | undefined + private homeCommunityTopicId: HieroId | undefined private logger: Logger /** @@ -37,15 +37,15 @@ export class KeyPairCacheManager { return KeyPairCacheManager.instance } - public setHomeCommunityUUID(uuid: string): void { - this.homeCommunityUUID = uuid + public setHomeCommunityTopicId(topicId: HieroId): void { + this.homeCommunityTopicId = topicId } - public getHomeCommunityUUID(): string { - if (!this.homeCommunityUUID) { - throw new Error('home community uuid is not set') + public getHomeCommunityTopicId(): HieroId { + if (!this.homeCommunityTopicId) { + throw new Error('home community topic id is not set') } - return this.homeCommunityUUID + return this.homeCommunityTopicId } public findKeyPair(input: string): KeyPairEd25519 | undefined { @@ -63,7 +63,10 @@ export class KeyPairCacheManager { this.cache.set(input, keyPair) } - public async getKeyPair(input: string, createKeyPair: () => Promise): Promise { + public async getKeyPair( + input: string, + createKeyPair: () => Promise, + ): Promise { const keyPair = this.cache.get(input) if (!keyPair) { const keyPair = await createKeyPair() diff --git a/dlt-connector/src/client/GradidoNode/api.ts b/dlt-connector/src/client/GradidoNode/api.ts index fa8672a23..383f1c3f4 100644 --- a/dlt-connector/src/client/GradidoNode/api.ts +++ b/dlt-connector/src/client/GradidoNode/api.ts @@ -1,18 +1,18 @@ import { AddressType, ConfirmedTransaction } from 'gradido-blockchain-js' import { getLogger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../../config/const' import * as v from 'valibot' -import { addressTypeSchema, confirmedTransactionSchema } from '../../schemas/typeConverter.schema' -import { GradidoNodeErrorCodes } from '../../enum/GradidoNodeErrorCodes' -import { rpcCall, rpcCallResolved, GradidoNodeRequestError } from './jsonrpc' -import { - TransactionsRangeInput, - TransactionIdentifierInput, - transactionsRangeSchema, - transactionIdentifierSchema -} from './input.schema' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' import { Uuidv4Hash } from '../../data/Uuidv4Hash' -import { Hex32, Hex32Input, hex32Schema } from '../../schemas/typeGuard.schema' +import { GradidoNodeErrorCodes } from '../../enum/GradidoNodeErrorCodes' +import { addressTypeSchema, confirmedTransactionSchema } from '../../schemas/typeConverter.schema' +import { Hex32, Hex32Input, HieroId, hex32Schema } from '../../schemas/typeGuard.schema' +import { + TransactionIdentifierInput, + TransactionsRangeInput, + transactionIdentifierSchema, + transactionsRangeSchema, +} from './input.schema' +import { GradidoNodeRequestError, rpcCall, rpcCallResolved } from './jsonrpc' const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) @@ -21,7 +21,7 @@ const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) * get list of confirmed transactions from a specific community * @param input fromTransactionId is the id of the first transaction to return * @param input maxResultCount is the max number of transactions to return - * @param input topic is the community topic + * @param input topic is the community hiero topic id * @returns list of confirmed transactions * @throws GradidoNodeRequestError * @example @@ -35,7 +35,7 @@ const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) */ async function getTransactions(input: TransactionsRangeInput): Promise { const parameter = { ...v.parse(transactionsRangeSchema, input), format: 'base64' } - const result = await rpcCallResolved<{transactions: string[]}>('getTransactions', parameter) + const result = await rpcCallResolved<{ transactions: string[] }>('getTransactions', parameter) return result.transactions.map((transactionBase64) => v.parse(confirmedTransactionSchema, transactionBase64), ) @@ -44,12 +44,13 @@ async function getTransactions(input: TransactionsRangeInput): Promise { +async function getTransaction( + transactionIdentifier: TransactionIdentifierInput, +): Promise { const parameter = { ...v.parse(transactionIdentifierSchema, transactionIdentifier), format: 'base64', @@ -74,7 +75,9 @@ async function getTransaction(transactionIdentifier: TransactionIdentifierInput) * @throws GradidoNodeRequestError */ -async function getLastTransaction(iotaTopic: Uuidv4Hash): Promise { +async function getLastTransaction( + iotaTopic: Uuidv4Hash, +): Promise { const response = await rpcCall<{ transaction: string }>('getlasttransaction', { format: 'base64', topic: iotaTopic.getAsHexString(), @@ -92,19 +95,19 @@ async function getLastTransaction(iotaTopic: Uuidv4Hash): Promise { +async function getAddressType(pubkey: Hex32Input, hieroTopic: HieroId): Promise { const parameter = { pubkey: v.parse(hex32Schema, pubkey), - communityId: iotaTopic.getAsHexString(), + communityId: hieroTopic, } const response = await rpcCallResolved<{ addressType: string }>('getaddresstype', parameter) return v.parse(addressTypeSchema, response.addressType) @@ -118,17 +121,26 @@ async function getAddressType(pubkey: Hex32Input, iotaTopic: Uuidv4Hash): Promis * @returns the public key of the user as hex32 string or undefined if user is not found * @throws GradidoNodeRequestError */ -async function findUserByNameHash(nameHash: Uuidv4Hash, iotaTopic: Uuidv4Hash): Promise { +async function findUserByNameHash( + nameHash: Uuidv4Hash, + hieroTopic: HieroId, +): Promise { const parameter = { nameHash: nameHash.getAsHexString(), - communityId: iotaTopic.getAsHexString(), + communityId: hieroTopic, } - const response = await rpcCall<{ pubkey: string; timeUsed: string }>('findUserByNameHash', parameter) - if(response.isSuccess()) { + const response = await rpcCall<{ pubkey: string; timeUsed: string }>( + 'findUserByNameHash', + parameter, + ) + if (response.isSuccess()) { logger.info(`call findUserByNameHash, used ${response.result.timeUsed}`) return v.parse(hex32Schema, response.result.pubkey) } - if (response.isError() && response.error.code === GradidoNodeErrorCodes.JSON_RPC_ERROR_ADDRESS_NOT_FOUND) { + if ( + response.isError() && + response.error.code === GradidoNodeErrorCodes.JSON_RPC_ERROR_ADDRESS_NOT_FOUND + ) { logger.debug(`call findUserByNameHash, return with error: ${response.error.message}`) } return undefined @@ -136,10 +148,10 @@ async function findUserByNameHash(nameHash: Uuidv4Hash, iotaTopic: Uuidv4Hash): /** * getTransactionsForAccount - * get list of confirmed transactions for a specific account + * get list of confirmed transactions for a specific account * @param transactionRange the range of transactions to return * @param pubkey the public key of the account - * @returns list of confirmed transactions + * @returns list of confirmed transactions * @throws GradidoNodeRequestError */ async function getTransactionsForAccount( @@ -151,7 +163,10 @@ async function getTransactionsForAccount( pubkey: v.parse(hex32Schema, pubkey), format: 'base64', } - const response = await rpcCallResolved<{transactions: string[]}>('listtransactionsforaddress', parameter) + const response = await rpcCallResolved<{ transactions: string[] }>( + 'listtransactionsforaddress', + parameter, + ) return response.transactions.map((transactionBase64) => v.parse(confirmedTransactionSchema, transactionBase64), ) diff --git a/dlt-connector/src/client/GradidoNode/input.schema.ts b/dlt-connector/src/client/GradidoNode/input.schema.ts index b207f935a..218805c3f 100644 --- a/dlt-connector/src/client/GradidoNode/input.schema.ts +++ b/dlt-connector/src/client/GradidoNode/input.schema.ts @@ -1,36 +1,35 @@ import * as v from 'valibot' -import { hex32Schema, iotaMessageIdSchema } from '../../schemas/typeGuard.schema' +import { hieroIdSchema, hieroTransactionIdSchema } from '../../schemas/typeGuard.schema' export const transactionsRangeSchema = v.object({ // default value is 1, from first transactions - fromTransactionId: v.undefinedable(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 1), + fromTransactionId: v.nullish(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 1), // default value is 100, max 100 transactions - maxResultCount: v.undefinedable(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 100), - topic: hex32Schema, + maxResultCount: v.nullish(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 100), + topic: hieroIdSchema, }) export type TransactionsRangeInput = v.InferInput - // allow TransactionIdentifier to only contain either transactionNr or iotaMessageId export const transactionIdentifierSchema = v.pipe( v.object({ transactionNr: v.nullish( v.pipe(v.number('expect number type'), v.minValue(1, 'expect number >= 1')), - undefined + undefined, ), - iotaMessageId: v.nullish(iotaMessageIdSchema, undefined), - topic: hex32Schema, + hieroTransactionId: v.nullish(hieroTransactionIdSchema, undefined), + topic: hieroIdSchema, }), v.custom((value: any) => { - const setFieldsCount = Number(value.transactionNr !== undefined) + Number(value.iotaMessageId !== undefined) + const setFieldsCount = + Number(value.transactionNr !== undefined) + Number(value.hieroTransactionId !== undefined) if (setFieldsCount !== 1) { return false } return true - }, 'expect transactionNr or iotaMessageId not both') + }, 'expect transactionNr or hieroTransactionId not both'), ) export type TransactionIdentifierInput = v.InferInput export type TransactionIdentifier = v.InferOutput - diff --git a/dlt-connector/src/client/GradidoNode/jsonrpc.ts b/dlt-connector/src/client/GradidoNode/jsonrpc.ts index 6cd053d87..b93ff65f0 100644 --- a/dlt-connector/src/client/GradidoNode/jsonrpc.ts +++ b/dlt-connector/src/client/GradidoNode/jsonrpc.ts @@ -1,9 +1,9 @@ -import { getLogger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../../config/const' -import { JsonRpcEitherResponse } from 'jsonrpc-ts-client/dist/types/utils/jsonrpc' -import { isPortOpenRetry } from '../../utils/network' -import { CONFIG } from '../../config' import JsonRpcClient from 'jsonrpc-ts-client' +import { JsonRpcEitherResponse } from 'jsonrpc-ts-client/dist/types/utils/jsonrpc' +import { getLogger } from 'log4js' +import { CONFIG } from '../../config' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' +import { isPortOpenRetry } from '../../utils/network' const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) @@ -24,7 +24,10 @@ export class GradidoNodeRequestError extends Error { } // return result on success or throw error -export function resolveResponse(response: JsonRpcEitherResponse, onSuccess: (result: T) => R): R { +export function resolveResponse( + response: JsonRpcEitherResponse, + onSuccess: (result: T) => R, +): R { if (response.isSuccess()) { return onSuccess(response.result) } else if (response.isError()) { @@ -36,7 +39,10 @@ export function resolveResponse(response: JsonRpcEitherResponse, onSucc type WithTimeUsed = T & { timeUsed?: string } // template rpcCall, check first if port is open before executing json rpc 2.0 request -export async function rpcCall(method: string, parameter: any): Promise> { +export async function rpcCall( + method: string, + parameter: any, +): Promise> { logger.debug('call %s with %s', method, parameter) await isPortOpenRetry(CONFIG.NODE_SERVER_URL) return client.exec(method, parameter) @@ -51,4 +57,4 @@ export async function rpcCallResolved(method: string, parameter: any): Promis } return result as T }) -} \ No newline at end of file +} diff --git a/dlt-connector/src/client/HieroClient.ts b/dlt-connector/src/client/HieroClient.ts new file mode 100644 index 000000000..d7be17eb3 --- /dev/null +++ b/dlt-connector/src/client/HieroClient.ts @@ -0,0 +1,74 @@ +import { + AccountBalance, + AccountBalanceQuery, + Client, + LocalProvider, + PrivateKey, + TopicMessageSubmitTransaction, + TransactionReceipt, + TransactionResponse, + Wallet, +} from '@hashgraph/sdk' +import { GradidoTransaction } from 'gradido-blockchain-js' +import { getLogger, Logger } from 'log4js' +import { CONFIG } from '../config' +import { LOG4JS_BASE_CATEGORY } from '../config/const' +import { HieroId } from '../schemas/typeGuard.schema' + +export class HieroClient { + private static instance: HieroClient + wallet: Wallet + logger: Logger + + private constructor() { + this.logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.HieroClient`) + const provider = LocalProvider.fromClient(Client.forName(CONFIG.HIERO_HEDERA_NETWORK)) + let operatorKey: PrivateKey + if (CONFIG.HIERO_OPERATOR_KEY.length === 64) { + operatorKey = PrivateKey.fromStringED25519(CONFIG.HIERO_OPERATOR_KEY) + } else { + operatorKey = PrivateKey.fromStringECDSA(CONFIG.HIERO_OPERATOR_KEY) + } + this.wallet = new Wallet(CONFIG.HIERO_OPERATOR_ID, operatorKey, provider) + } + + public static getInstance(): HieroClient { + if (!CONFIG.HIERO_ACTIVE) { + throw new Error('hiero is disabled via config...') + } + if (!HieroClient.instance) { + HieroClient.instance = new HieroClient() + } + + return HieroClient.instance + } + + public async sendMessage( + topicId: HieroId, + transaction: GradidoTransaction, + ): Promise<{ receipt: TransactionReceipt; response: TransactionResponse }> { + const serializedTransaction = transaction.getSerializedTransaction() + if (!serializedTransaction) { + throw new Error('cannot serialize transaction') + } + // send one message + const hieroTransaction = await new TopicMessageSubmitTransaction({ + topicId, + message: serializedTransaction.data(), + }).freezeWithSigner(this.wallet) + const signedHieroTransaction = await hieroTransaction.signWithSigner(this.wallet) + const sendResponse = await signedHieroTransaction.executeWithSigner(this.wallet) + const sendReceipt = await sendResponse.getReceiptWithSigner(this.wallet) + this.logger.info( + `message sent to topic ${topicId}, status: ${sendReceipt.status.toString()}, transaction id: ${sendResponse.transactionId.toString()}`, + ) + return { receipt: sendReceipt, response: sendResponse } + } + + public async getBalance(): Promise { + const balance = await new AccountBalanceQuery() + .setAccountId(this.wallet.getAccountId()) + .executeWithSigner(this.wallet) + return balance + } +} diff --git a/dlt-connector/src/client/backend/BackendClient.ts b/dlt-connector/src/client/backend/BackendClient.ts index 50904d198..7e98f82f9 100644 --- a/dlt-connector/src/client/backend/BackendClient.ts +++ b/dlt-connector/src/client/backend/BackendClient.ts @@ -1,21 +1,10 @@ -import { gql, GraphQLClient } from 'graphql-request' +import { GraphQLClient, gql } from 'graphql-request' import { SignJWT } from 'jose' - -import { CONFIG } from '../../config' -import { communitySchema, type Community } from './community.schema' import { getLogger, Logger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../../config/const' import * as v from 'valibot' - -const homeCommunity = gql` - query { - homeCommunity { - uuid - foreign - creationDate - } - } -` +import { CONFIG } from '../../config' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' +import { type Community, communitySchema, homeCommunityGraphqlQuery } from './community.schema' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts @@ -26,7 +15,7 @@ const homeCommunity = gql` export class BackendClient { private static instance: BackendClient client: GraphQLClient - logger: Logger + logger: Logger /** * The Singleton's constructor should always be private to prevent direct @@ -56,14 +45,14 @@ export class BackendClient { public static getInstance(): BackendClient | undefined { if (!BackendClient.instance) { BackendClient.instance = new BackendClient() - } + } return BackendClient.instance } public async getHomeCommunityDraft(): Promise { this.logger.info('check home community on backend') const { data, errors } = await this.client.rawRequest<{ homeCommunity: Community }>( - homeCommunity, + homeCommunityGraphqlQuery, {}, // empty variables await this.getRequestHeader(), ) diff --git a/dlt-connector/src/client/backend/community.schema.test.ts b/dlt-connector/src/client/backend/community.schema.test.ts index 42cf9dc7e..4d2931ed0 100644 --- a/dlt-connector/src/client/backend/community.schema.test.ts +++ b/dlt-connector/src/client/backend/community.schema.test.ts @@ -1,21 +1,21 @@ -import { communitySchema } from './community.schema' -import { uuidv4Schema } from '../../schemas/typeGuard.schema' -import * as v from 'valibot' // only for IDE, bun don't need this to work import { describe, expect, it } from 'bun:test' +import * as v from 'valibot' +import { uuidv4Schema } from '../../schemas/typeGuard.schema' +import { communitySchema } from './community.schema' describe('community.schema', () => { it('community', () => { - expect(v.parse(communitySchema, { - uuid: '4f28e081-5c39-4dde-b6a4-3bde71de8d65', - foreign: false, - createdAt: '2021-01-01', - })).toEqual( - { - uuid: v.parse(uuidv4Schema, '4f28e081-5c39-4dde-b6a4-3bde71de8d65'), + expect( + v.parse(communitySchema, { + uuid: '4f28e081-5c39-4dde-b6a4-3bde71de8d65', foreign: false, - createdAt: new Date('2021-01-01'), - }, - ) + createdAt: '2021-01-01', + }), + ).toEqual({ + uuid: v.parse(uuidv4Schema, '4f28e081-5c39-4dde-b6a4-3bde71de8d65'), + foreign: false, + createdAt: new Date('2021-01-01'), + }) }) }) diff --git a/dlt-connector/src/client/backend/community.schema.ts b/dlt-connector/src/client/backend/community.schema.ts index af8cf01bd..182a41368 100644 --- a/dlt-connector/src/client/backend/community.schema.ts +++ b/dlt-connector/src/client/backend/community.schema.ts @@ -1,6 +1,7 @@ +import { gql } from 'graphql-request' import * as v from 'valibot' -import { uuidv4Schema } from '../../schemas/typeGuard.schema' import { dateSchema } from '../../schemas/typeConverter.schema' +import { hieroIdSchema, uuidv4Schema } from '../../schemas/typeGuard.schema' /** * Schema Definitions for rpc call parameter, when dlt-connector is called from backend @@ -11,9 +12,22 @@ import { dateSchema } from '../../schemas/typeConverter.schema' */ export const communitySchema = v.object({ uuid: uuidv4Schema, + topicId: hieroIdSchema, foreign: v.boolean('expect boolean type'), createdAt: dateSchema, }) export type CommunityInput = v.InferInput export type Community = v.InferOutput + +// graphql query for getting home community in tune with community schema +export const homeCommunityGraphqlQuery = gql` + query { + homeCommunity { + uuid + topicId + foreign + creationDate + } + } +` diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index 2d016eee2..9a9889cda 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -1,5 +1,6 @@ /* eslint-disable n/no-process-env */ import dotenv from 'dotenv' + dotenv.config() const logging = { @@ -25,7 +26,16 @@ const iota = { IOTA_HOME_COMMUNITY_SEED: process.env.IOTA_HOME_COMMUNITY_SEED ?? null, } -const apis = { +const hiero = { + HIERO_ACTIVE: process.env.HIERO_ACTIVE === 'true' || false, + HIERO_HEDERA_NETWORK: process.env.HIERO_HEDERA_NETWORK ?? 'testnet', + HIERO_OPERATOR_ID: process.env.HIERO_OPERATOR_ID ?? '0.0.2', + HIERO_OPERATOR_KEY: + process.env.HIERO_OPERATOR_KEY ?? + '302e020100300506032b65700422042091132178e72057a1d7528025956fe39b0b847f200ab59b2fdd367017f3087137', +} + +const apis = { CONNECT_TIMEOUT_MS: process.env.CONNECT_TIMEOUT_MS ? Number.parseInt(process.env.CONNECT_TIMEOUT_MS) : 1000, @@ -45,5 +55,6 @@ export const CONFIG = { ...server, ...secrets, ...iota, + ...hiero, ...apis, } diff --git a/dlt-connector/src/config/schema.ts b/dlt-connector/src/config/schema.ts new file mode 100644 index 000000000..b9a170e43 --- /dev/null +++ b/dlt-connector/src/config/schema.ts @@ -0,0 +1,24 @@ +import * as v from 'valibot' + +export const HIERO_ACTIVE = v.nullish( + v.boolean('Flag to indicate if the Hiero (Hedera Hashgraph Ledger) service is used.'), + false, +) + +export const HIERO_HEDERA_NETWORK = v.nullish( + v.union([v.literal('mainnet'), v.literal('testnet'), v.literal('previewnet')]), + 'testnet', +) + +export const HIERO_OPERATOR_ID = v.nullish( + v.pipe(v.string('The operator ID for Hiero integration'), v.regex(/^[0-9]+\.[0-9]+\.[0-9]+$/)), + '0.0.2', +) + +export const HIERO_OPERATOR_KEY = v.nullish( + v.pipe( + v.string('The operator key for Hiero integration, default is for local default node'), + v.regex(/^[0-9a-fA-F]{64,96}$/), + ), + '302e020100300506032b65700422042091132178e72057a1d7528025956fe39b0b847f200ab59b2fdd367017f3087137', +) diff --git a/dlt-connector/src/data/KeyPairIdentifier.logic.ts b/dlt-connector/src/data/KeyPairIdentifier.logic.ts index b0bade47b..437d9a458 100644 --- a/dlt-connector/src/data/KeyPairIdentifier.logic.ts +++ b/dlt-connector/src/data/KeyPairIdentifier.logic.ts @@ -1,14 +1,10 @@ import { MemoryBlock } from 'gradido-blockchain-js' -import { IdentifierAccount, IdentifierAccountInput, identifierAccountSchema } from '../schemas/account.schema' import { ParameterError } from '../errors' -import * as v from 'valibot' +import { IdentifierAccount } from '../schemas/account.schema' +import { HieroId } from '../schemas/typeGuard.schema' export class KeyPairIdentifierLogic { - public identifier: IdentifierAccount - public constructor(identifier: IdentifierAccountInput) { - // check if data structure is like expected and fill in defaults - this.identifier = v.parse(identifierAccountSchema, identifier) - } + public constructor(public identifier: IdentifierAccount) {} isCommunityKeyPair(): boolean { return !this.identifier.seed && !this.identifier.account @@ -36,19 +32,21 @@ export class KeyPairIdentifierLogic { getSeed(): string { if (!this.identifier.seed) { - throw new Error('get seed called on non seed key pair identifier, please check first with isSeedKeyPair()') + throw new Error( + 'get seed called on non seed key pair identifier, please check first with isSeedKeyPair()', + ) } return this.identifier.seed.seed } - getCommunityUuid(): string { - return this.identifier.communityUuid + getCommunityTopicId(): HieroId { + return this.identifier.communityTopicId } getUserUuid(): string { if (!this.identifier.account) { throw new Error( - 'get user uuid called on non user key pair identifier, please check first with isUserKeyPair() or isAccountKeyPair()' + 'get user uuid called on non user key pair identifier, please check first with isUserKeyPair() or isAccountKeyPair()', ) } return this.identifier.account.userUuid @@ -57,19 +55,23 @@ export class KeyPairIdentifierLogic { getAccountNr(): number { if (!this.identifier.account?.accountNr) { throw new Error( - 'get account nr called on non account key pair identifier, please check first with isAccountKeyPair()' + 'get account nr called on non account key pair identifier, please check first with isAccountKeyPair()', ) } return this.identifier.account.accountNr } - getSeedKey(): string { return this.getSeed() } - getCommunityKey(): string { return this.getCommunityUuid() } - getCommunityUserKey(): string { + getSeedKey(): string { + return this.getSeed() + } + getCommunityKey(): HieroId { + return this.getCommunityTopicId() + } + getCommunityUserKey(): string { return this.createCommunityUserHash() } - getCommunityUserAccountKey(): string { - return this.createCommunityUserHash() + this.getAccountNr().toString() + getCommunityUserAccountKey(): string { + return this.createCommunityUserHash() + this.getAccountNr().toString() } getKey(): string { @@ -86,12 +88,11 @@ export class KeyPairIdentifierLogic { } private createCommunityUserHash(): string { - if (!this.identifier.account?.userUuid || !this.identifier.communityUuid) { - throw new ParameterError('userUuid and/or communityUuid is undefined') + if (!this.identifier.account?.userUuid || !this.identifier.communityTopicId) { + throw new ParameterError('userUuid and/or communityTopicId is undefined') } - const resultHexString = - this.identifier.communityUuid.replace(/-/g, '') - + this.identifier.account.userUuid.replace(/-/g, '') + const resultHexString = + this.identifier.communityTopicId + this.identifier.account.userUuid.replace(/-/g, '') return MemoryBlock.fromHex(resultHexString).calculateHash().convertToHex() } } diff --git a/dlt-connector/src/data/Uuidv4Hash.ts b/dlt-connector/src/data/Uuidv4Hash.ts index 541f412d2..338dd4d4d 100644 --- a/dlt-connector/src/data/Uuidv4Hash.ts +++ b/dlt-connector/src/data/Uuidv4Hash.ts @@ -1,13 +1,19 @@ import { MemoryBlock } from 'gradido-blockchain-js' -import { Uuidv4, Hex32, hex32Schema, MemoryBlock32, memoryBlock32Schema } from '../schemas/typeGuard.schema' import * as v from 'valibot' +import { + Hex32, + hex32Schema, + MemoryBlock32, + memoryBlock32Schema, + Uuidv4, +} from '../schemas/typeGuard.schema' /** * Uuidv4Hash is a class that represents a uuidv4 BLAKE2b hash * to get the hash, the - in the uuidv4 will be removed and the result interpreted as hex string - * then the hash will be calculated with BLAKE2b algorithm + * then the hash will be calculated with BLAKE2b algorithm * crypto_generichash from libsodium will be called when calling MemoryBlock.calculateHash() - * + * * This will be used as NameHash for user identification (user uuid as input) * This will be used as IotaTopic for transactions (community uuid as input) */ @@ -17,7 +23,10 @@ export class Uuidv4Hash { uuidv4HashString: Hex32 | undefined constructor(uuidv4: Uuidv4) { - this.uuidv4Hash = v.parse(memoryBlock32Schema, MemoryBlock.fromHex(uuidv4.replace(/-/g, '')).calculateHash()) + this.uuidv4Hash = v.parse( + memoryBlock32Schema, + MemoryBlock.fromHex(uuidv4.replace(/-/g, '')).calculateHash(), + ) } getAsMemoryBlock(): MemoryBlock32 { diff --git a/dlt-connector/src/enum/AddressType.ts b/dlt-connector/src/enum/AddressType.ts index 8ac2f05fc..a19abbf78 100644 --- a/dlt-connector/src/enum/AddressType.ts +++ b/dlt-connector/src/enum/AddressType.ts @@ -4,9 +4,9 @@ import { AddressType_COMMUNITY_HUMAN, AddressType_COMMUNITY_PROJECT, AddressType_CRYPTO_ACCOUNT, + AddressType_DEFERRED_TRANSFER, AddressType_NONE, AddressType_SUBACCOUNT, - AddressType_DEFERRED_TRANSFER, } from 'gradido-blockchain-js' export enum AddressType { @@ -18,4 +18,4 @@ export enum AddressType { NONE = AddressType_NONE, SUBACCOUNT = AddressType_SUBACCOUNT, DEFERRED_TRANSFER = AddressType_DEFERRED_TRANSFER, -} \ No newline at end of file +} diff --git a/dlt-connector/src/enum/GradidoNodeErrorCodes.ts b/dlt-connector/src/enum/GradidoNodeErrorCodes.ts index 49153dc15..afbf9dd4d 100644 --- a/dlt-connector/src/enum/GradidoNodeErrorCodes.ts +++ b/dlt-connector/src/enum/GradidoNodeErrorCodes.ts @@ -17,4 +17,4 @@ export enum GradidoNodeErrorCodes { // -32603 Internal error Internal JSON - RPC error. INTERNAL_ERROR = -32603, // -32000 to -32099 Server error Reserved for implementation-defined server-errors. -} \ No newline at end of file +} diff --git a/dlt-connector/src/enum/InputTransactionType.ts b/dlt-connector/src/enum/InputTransactionType.ts index 65c806afc..4aa4fc8cf 100755 --- a/dlt-connector/src/enum/InputTransactionType.ts +++ b/dlt-connector/src/enum/InputTransactionType.ts @@ -1,11 +1,11 @@ -// enum for graphql but with int because it is the same in backend -// for transaction type from backend -export enum InputTransactionType { - GRADIDO_TRANSFER = 'GRADIDO_TRANSFER', - GRADIDO_CREATION = 'GRADIDO_CREATION', - GROUP_FRIENDS_UPDATE = 'GROUP_FRIENDS_UPDATE', - REGISTER_ADDRESS = 'REGISTER_ADDRESS', - GRADIDO_DEFERRED_TRANSFER = 'GRADIDO_DEFERRED_TRANSFER', - GRADIDO_REDEEM_DEFERRED_TRANSFER = 'GRADIDO_REDEEM_DEFERRED_TRANSFER', - COMMUNITY_ROOT = 'COMMUNITY_ROOT', -} +// enum for graphql but with int because it is the same in backend +// for transaction type from backend +export enum InputTransactionType { + GRADIDO_TRANSFER = 'GRADIDO_TRANSFER', + GRADIDO_CREATION = 'GRADIDO_CREATION', + GROUP_FRIENDS_UPDATE = 'GROUP_FRIENDS_UPDATE', + REGISTER_ADDRESS = 'REGISTER_ADDRESS', + GRADIDO_DEFERRED_TRANSFER = 'GRADIDO_DEFERRED_TRANSFER', + GRADIDO_REDEEM_DEFERRED_TRANSFER = 'GRADIDO_REDEEM_DEFERRED_TRANSFER', + COMMUNITY_ROOT = 'COMMUNITY_ROOT', +} diff --git a/dlt-connector/src/errors.ts b/dlt-connector/src/errors.ts index 73e6fd0f4..c9be7c2a2 100644 --- a/dlt-connector/src/errors.ts +++ b/dlt-connector/src/errors.ts @@ -1,5 +1,5 @@ -import { TransactionIdentifier } from './schemas/transaction.schema' import { IdentifierAccount } from './schemas/account.schema' +import { TransactionIdentifier } from './schemas/transaction.schema' export class GradidoNodeError extends Error { constructor(message: string) { diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index 7681719ed..68b7f4803 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -1,16 +1,16 @@ -import { Elysia } from 'elysia' -import { CONFIG } from './config' -import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' -import { getLogger, configure } from 'log4js' import { readFileSync } from 'node:fs' -import { isPortOpenRetry } from './utils/network' -import { BackendClient } from './client/backend/BackendClient' -import { KeyPairCacheManager } from './KeyPairCacheManager' -import { getTransaction } from './client/GradidoNode/api' -import { Uuidv4Hash } from './data/Uuidv4Hash' -import { SendToIotaContext } from './interactions/sendToIota/SendToIota.context' -import { keyGenerationSeedSchema } from './schemas/base.schema' +import { Elysia } from 'elysia' +import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' +import { configure, getLogger } from 'log4js' import * as v from 'valibot' +import { BackendClient } from './client/backend/BackendClient' +import { getTransaction } from './client/GradidoNode/api' +import { CONFIG } from './config' +import { SendToIotaContext } from './interactions/sendToIota/SendToIota.context' +import { KeyPairCacheManager } from './KeyPairCacheManager' +import { keyGenerationSeedSchema } from './schemas/base.schema' +import { isPortOpenRetry } from './utils/network' +import { appRoutes } from './server' async function main() { // configure log4js @@ -23,7 +23,7 @@ async function main() { logger.error('IOTA_HOME_COMMUNITY_SEED must be a valid hex string, at least 64 characters long') process.exit(1) } - + // load crypto keys for gradido blockchain lib loadCryptoKeys( MemoryBlock.fromHex(CONFIG.GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET), @@ -38,22 +38,21 @@ async function main() { // wait for backend server await isPortOpenRetry(CONFIG.BACKEND_SERVER_URL) const homeCommunity = await backend.getHomeCommunityDraft() - KeyPairCacheManager.getInstance().setHomeCommunityUUID(homeCommunity.uuid) - const topic = new Uuidv4Hash(homeCommunity.uuid).getAsHexString() - logger.info('home community topic: %s', topic) + KeyPairCacheManager.getInstance().setHomeCommunityTopicId(homeCommunity.topicId) + logger.info('home community topic: %s', homeCommunity.topicId) logger.info('gradido node server: %s', CONFIG.NODE_SERVER_URL) // ask gradido node if community blockchain was created try { - if (!await getTransaction({ transactionNr: 1, topic })) { + if (!(await getTransaction({ transactionNr: 1, topic: homeCommunity.topicId }))) { // if not exist, create community root transaction await SendToIotaContext(homeCommunity) } } catch (e) { logger.error('error requesting gradido node: ', e) } - // listen for rpc request from backend (replace graphql with json rpc) - const app = new Elysia() - .get('/', () => "Hello Elysia") + // listen for rpc request from backend (graphql replaced with trpc and elysia) + new Elysia() + .use(appRoutes) .listen(CONFIG.DLT_CONNECTOR_PORT, () => { logger.info(`Server is running at http://localhost:${CONFIG.DLT_CONNECTOR_PORT}`) }) diff --git a/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts index 235deadac..30b824d86 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts @@ -1,11 +1,10 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { communityUuidToTopicSchema } from '../../client/backend/community.schema' -import * as v from 'valibot' +import { HieroId } from '../../schemas/typeGuard.schema' export abstract class AbstractRemoteKeyPairRole { - protected topic: string - public constructor(communityUuid: string) { - this.topic = v.parse(communityUuidToTopicSchema, communityUuid) + protected topic: HieroId + public constructor(communityTopicId: HieroId) { + this.topic = communityTopicId } public abstract retrieveKeyPair(): Promise } diff --git a/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts index 517d33ae1..62ce06ecf 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts @@ -3,7 +3,10 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' import { AbstractKeyPairRole } from './AbstractKeyPair.role' export class AccountKeyPairRole extends AbstractKeyPairRole { - public constructor(private accountNr: number, private userKeyPair: KeyPairEd25519) { + public constructor( + private accountNr: number, + private userKeyPair: KeyPairEd25519, + ) { super() } diff --git a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts index 803b1d216..0d73d891d 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts @@ -1,19 +1,22 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' import { getTransaction } from '../../client/GradidoNode/api' - +import { + GradidoNodeInvalidTransactionError, + GradidoNodeMissingTransactionError, +} from '../../errors' +import { HieroId } from '../../schemas/typeGuard.schema' import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' -import { GradidoNodeInvalidTransactionError, GradidoNodeMissingTransactionError } from '../../errors' export class ForeignCommunityKeyPairRole extends AbstractRemoteKeyPairRole { - public constructor(communityUuid: string) { - super(communityUuid) + public constructor(communityTopicId: HieroId) { + super(communityTopicId) } public async retrieveKeyPair(): Promise { const transactionIdentifier = { transactionNr: 1, - iotaTopic: this.topic, + topic: this.topic, } const firstTransaction = await getTransaction(transactionIdentifier) if (!firstTransaction) { @@ -22,21 +25,21 @@ export class ForeignCommunityKeyPairRole extends AbstractRemoteKeyPairRole { const transactionBody = firstTransaction.getGradidoTransaction()?.getTransactionBody() if (!transactionBody) { throw new GradidoNodeInvalidTransactionError( - 'Invalid transaction, body is missing', - transactionIdentifier + 'Invalid transaction, body is missing', + transactionIdentifier, ) } if (!transactionBody.isCommunityRoot()) { throw new GradidoNodeInvalidTransactionError( 'Invalid transaction, community root type expected', - transactionIdentifier + transactionIdentifier, ) } const communityRoot = transactionBody.getCommunityRoot() if (!communityRoot) { throw new GradidoNodeInvalidTransactionError( 'Invalid transaction, community root is missing', - transactionIdentifier + transactionIdentifier, ) } return new KeyPairEd25519(communityRoot.getPublicKey()) diff --git a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts index c6164119c..883b214e8 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts @@ -20,11 +20,10 @@ export async function KeyPairCalculation(input: KeyPairIdentifierLogic): Promise return new LinkedTransactionKeyPairRole(input.getSeed()).generateKeyPair() } // If input does not belong to the home community, handle as remote key pair - if (cache.getHomeCommunityUUID() !== input.getCommunityUuid()) { - const role = - input.isAccountKeyPair() - ? new RemoteAccountKeyPairRole(input.identifier) - : new ForeignCommunityKeyPairRole(input.getCommunityUuid()) + if (cache.getHomeCommunityTopicId() !== input.getCommunityTopicId()) { + const role = input.isAccountKeyPair() + ? new RemoteAccountKeyPairRole(input.identifier) + : new ForeignCommunityKeyPairRole(input.getCommunityTopicId()) return await role.retrieveKeyPair() } const communityKeyPair = await cache.getKeyPair(input.getCommunityKey(), async () => { @@ -37,10 +36,7 @@ export async function KeyPairCalculation(input: KeyPairIdentifierLogic): Promise return communityKeyPair } const userKeyPair = await cache.getKeyPair(input.getCommunityUserKey(), async () => { - return new UserKeyPairRole( - input.getUserUuid(), - communityKeyPair, - ).generateKeyPair() + return new UserKeyPairRole(input.getUserUuid(), communityKeyPair).generateKeyPair() }) if (!userKeyPair) { throw new Error("couldn't generate user key pair") diff --git a/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts index d31fd9814..bb4aeedd8 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts @@ -1,7 +1,6 @@ import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' - -import { AbstractKeyPairRole } from './AbstractKeyPair.role' import { ParameterError } from '../../errors' +import { AbstractKeyPairRole } from './AbstractKeyPair.role' export class LinkedTransactionKeyPairRole extends AbstractKeyPairRole { public constructor(private seed: string) { @@ -14,7 +13,9 @@ export class LinkedTransactionKeyPairRole extends AbstractKeyPairRole { const hash = new MemoryBlock(this.seed).calculateHash() const keyPair = KeyPairEd25519.create(hash) if (!keyPair) { - throw new ParameterError(`error creating Ed25519 KeyPair from seed: ${this.seed.substring(0, 5)}...`) + throw new ParameterError( + `error creating Ed25519 KeyPair from seed: ${this.seed.substring(0, 5)}...`, + ) } return keyPair } diff --git a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts index 4ae1af7d9..d1658d608 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts @@ -1,15 +1,14 @@ -import { KeyPairEd25519 } from 'gradido-blockchain-js' +import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' import { findUserByNameHash } from '../../client/GradidoNode/api' -import { IdentifierAccount } from '../../schemas/account.schema' +import { Uuidv4Hash } from '../../data/Uuidv4Hash' import { GradidoNodeMissingUserError, ParameterError } from '../../errors' +import { IdentifierAccount } from '../../schemas/account.schema' import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' -import { uuid4ToHashSchema } from '../../schemas/typeConverter.schema' -import * as v from 'valibot' export class RemoteAccountKeyPairRole extends AbstractRemoteKeyPairRole { public constructor(private identifier: IdentifierAccount) { - super(identifier.communityUuid) + super(identifier.communityTopicId) } public async retrieveKeyPair(): Promise { @@ -18,11 +17,11 @@ export class RemoteAccountKeyPairRole extends AbstractRemoteKeyPairRole { } const accountPublicKey = await findUserByNameHash( - v.parse(uuid4ToHashSchema, this.identifier.account.userUuid), + new Uuidv4Hash(this.identifier.account.userUuid), this.topic, ) if (accountPublicKey) { - return new KeyPairEd25519(accountPublicKey) + return new KeyPairEd25519(MemoryBlock.createPtr(MemoryBlock.fromHex(accountPublicKey))) } throw new GradidoNodeMissingUserError('cannot find remote user', this.identifier) } diff --git a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts index 3762266b2..a2f57898c 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts @@ -4,7 +4,10 @@ import { hardenDerivationIndex } from '../../utils/derivationHelper' import { AbstractKeyPairRole } from './AbstractKeyPair.role' export class UserKeyPairRole extends AbstractKeyPairRole { - public constructor(private userUuid: string, private communityKeys: KeyPairEd25519) { + public constructor( + private userUuid: string, + private communityKeys: KeyPairEd25519, + ) { super() } diff --git a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts new file mode 100644 index 000000000..bf05b584c --- /dev/null +++ b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts @@ -0,0 +1,64 @@ +import { beforeAll, describe, expect, it } from 'bun:test' +import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' +import { v4 as uuidv4 } from 'uuid' +import { UserKeyPairRole } from './UserKeyPair.role' + +let communityKeyPair: KeyPairEd25519 +describe('UserKeyPairRole', () => { + beforeAll(() => { + communityKeyPair = KeyPairEd25519.create(new MemoryBlock('test').calculateHash())! + }) + it('should generate key pair', () => { + const userUUidPublicKeyPairs = [ + { + userUuid: '648f28cc-209c-4696-b381-5156fc1a7bcb', + publicKeyHex: 'ebd636d7e1e7177c0990d2ce836d8ced8b05ad75d62a7120a5d4a67bdd9dddb9', + }, + { + userUuid: 'fb65ef70-4c33-4dbc-aca8-3bae2609b04b', + publicKeyHex: 'd89fe30c53852dc2c8281581e6904da396c3104fc11c0a6d9b4a0afa5ce54dc1', + }, + { + userUuid: 'd58b6355-a337-4c80-b593-18d78b5cdab0', + publicKeyHex: 'dafb51eb8143cc7b2559235978ab845922ca8efa938ece078f45957ae3b92458', + }, + { + userUuid: '61144289-f69b-43a7-8b7d-5dcf3fa8ca68', + publicKeyHex: '8d4db4ecfb65e40d1a4d4d4858be1ddd54b64aa845ceaa6698c336424ae0fc58', + }, + { + userUuid: 'c63e6870-196c-4013-b30a-d0a5170e8150', + publicKeyHex: 'c240a8978da03f24d75108c4f06550a9bde46c902684a6d19d8b990819f518c8', + }, + { + userUuid: '6b40a2c9-4c0f-426d-bb55-353967e89aa2', + publicKeyHex: '75531146e27b557085c09545e7a5e95f7bfd66d0de30c31befc34e4061f4e148', + }, + { + userUuid: '50c47820-6d15-449d-89c3-b1fd02674c80', + publicKeyHex: '2c9ccb9914009bb6f24e41659223a5f8ce200cb5a4abdd808db57819f43c0ea2', + }, + { + userUuid: 'dc902954-bfc1-412e-b2f6-857e8bd45f0f', + publicKeyHex: '4546870cf56093755c1f410a53c5908a5f30f26bc553110779e8bf5b841d904a', + }, + { + userUuid: 'd77cd665-0d60-4033-a887-07944466ccbe', + publicKeyHex: '6563a5ca2944ba47391afd11a46e65bb7eb90657179dbc2d6be88af9ffa849a9', + }, + { + userUuid: 'ee83ed52-8a37-4a8a-8eed-ffaaac7d0d03', + publicKeyHex: '03968833ee5d4839cb9091f39f76c9f5ca35f117b953229b59549cce907a60ea', + }, + ] + for (let i = 0; i < userUUidPublicKeyPairs.length; i++) { + const pair = userUUidPublicKeyPairs[i] + const userKeyPairRole = new UserKeyPairRole(pair.userUuid, communityKeyPair) + const accountKeyPair = userKeyPairRole.generateKeyPair() + expect(accountKeyPair).toBeDefined() + const publicKeyHex = accountKeyPair.getPublicKey()?.convertToHex() + expect(publicKeyHex).toHaveLength(64) + expect(publicKeyHex).toBe(pair.publicKeyHex) + } + }) +}) diff --git a/dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts index ac9120e3d..df9ce2c59 100644 --- a/dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts @@ -1,7 +1,8 @@ import { GradidoTransactionBuilder } from 'gradido-blockchain-js' +import { HieroId } from '../../schemas/typeGuard.schema' export abstract class AbstractTransactionRole { abstract getGradidoTransactionBuilder(): Promise - abstract getSenderCommunityUuid(): string - abstract getRecipientCommunityUuid(): string + abstract getSenderCommunityTopicId(): HieroId + abstract getRecipientCommunityTopicId(): HieroId } diff --git a/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts index 3beaa633d..c59939ccb 100644 --- a/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts @@ -1,45 +1,41 @@ import { GradidoTransactionBuilder } from 'gradido-blockchain-js' - +import { Community } from '../../client/backend/community.schema' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' +import { HieroId } from '../../schemas/typeGuard.schema' import { AUF_ACCOUNT_DERIVATION_INDEX, GMW_ACCOUNT_DERIVATION_INDEX, hardenDerivationIndex, } from '../../utils/derivationHelper' - import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' - import { AbstractTransactionRole } from './AbstractTransaction.role' -import { Community, CommunityInput, communitySchema } from '../../client/backend/community.schema' -import * as v from 'valibot' export class CommunityRootTransactionRole extends AbstractTransactionRole { - private com: Community - constructor(input: CommunityInput) { + constructor(private readonly community: Community) { super() - this.com = v.parse(communitySchema, input) } - getSenderCommunityUuid(): string { - return this.com.uuid + getSenderCommunityTopicId(): HieroId { + return this.community.topicId } - getRecipientCommunityUuid(): string { + getRecipientCommunityTopicId(): HieroId { throw new Error('cannot be used as cross group transaction') } public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() const communityKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic({ communityUuid: this.com.uuid })) + new KeyPairIdentifierLogic({ communityTopicId: this.community.topicId }), + ) const gmwKeyPair = communityKeyPair.deriveChild( hardenDerivationIndex(GMW_ACCOUNT_DERIVATION_INDEX), - ) + ) // as unknown as KeyPairEd25519 const aufKeyPair = communityKeyPair.deriveChild( hardenDerivationIndex(AUF_ACCOUNT_DERIVATION_INDEX), - ) + ) // as unknown as KeyPairEd25519 builder - .setCreatedAt(this.com.createdAt) + .setCreatedAt(this.community.createdAt) .setCommunityRoot( communityKeyPair.getPublicKey(), gmwKeyPair.getPublicKey(), diff --git a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts index c930e1725..834f813c2 100644 --- a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts @@ -4,78 +4,69 @@ import { GradidoTransactionBuilder, TransferAmount, } from 'gradido-blockchain-js' - +import { parse } from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' -import { CreationTransactionInput, creationTransactionSchema, CreationTransaction } from '../../schemas/transaction.schema' import { KeyPairCacheManager } from '../../KeyPairCacheManager' -import { TRPCError } from '@trpc/server' - +import { + CreationTransaction, + creationTransactionSchema, + Transaction, +} from '../../schemas/transaction.schema' +import { HieroId } from '../../schemas/typeGuard.schema' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' -import * as v from 'valibot' import { AbstractTransactionRole } from './AbstractTransaction.role' -import { Uuidv4, uuidv4Schema } from '../../schemas/typeConverter.schema' export class CreationTransactionRole extends AbstractTransactionRole { - private tx: CreationTransaction - private homeCommunityUuid: Uuidv4 - constructor(input: CreationTransactionInput) { + private readonly homeCommunityTopicId: HieroId + private readonly creationTransaction: CreationTransaction + constructor(transaction: Transaction) { super() - this.tx = v.parse(creationTransactionSchema, input) - this.homeCommunityUuid = v.parse( - uuidv4Schema, - KeyPairCacheManager.getInstance().getHomeCommunityUUID() - ) + this.creationTransaction = parse(creationTransactionSchema, transaction) + this.homeCommunityTopicId = KeyPairCacheManager.getInstance().getHomeCommunityTopicId() if ( - this.homeCommunityUuid !== this.tx.user.communityUuid || - this.homeCommunityUuid !== this.tx.linkedUser.communityUuid + this.homeCommunityTopicId !== this.creationTransaction.user.communityTopicId || + this.homeCommunityTopicId !== this.creationTransaction.linkedUser.communityTopicId ) { - throw new TRPCError({ - code: 'BAD_REQUEST', - message: 'creation: both recipient and signer must belong to home community', - }) + throw new Error('creation: both recipient and signer must belong to home community') } } - getSenderCommunityUuid(): string { - return this.tx.user.communityUuid + getSenderCommunityTopicId(): HieroId { + return this.creationTransaction.user.communityTopicId } - getRecipientCommunityUuid(): string { - throw new TRPCError({ - code: 'BAD_REQUEST', - message: 'creation: cannot be used as cross group transaction', - }) + getRecipientCommunityTopicId(): HieroId { + throw new Error('creation: cannot be used as cross group transaction') } public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() // Recipient: user (account owner) const recipientKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(this.tx.user) + new KeyPairIdentifierLogic(this.creationTransaction.user), ) // Signer: linkedUser (admin/moderator) const signerKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(this.tx.linkedUser) + new KeyPairIdentifierLogic(this.creationTransaction.linkedUser), ) const homeCommunityKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic({ - communityUuid: this.homeCommunityUuid + new KeyPairIdentifierLogic({ + communityTopicId: this.homeCommunityTopicId, }), ) // Memo: encrypted, home community and recipient can decrypt it builder - .setCreatedAt(this.tx.createdAt) - .addMemo(new EncryptedMemo( - this.tx.memo, - new AuthenticatedEncryption(homeCommunityKeyPair), - new AuthenticatedEncryption(recipientKeyPair), - )) - .setTransactionCreation( - new TransferAmount( - recipientKeyPair.getPublicKey(), - this.tx.amount, + .setCreatedAt(this.creationTransaction.createdAt) + .addMemo( + new EncryptedMemo( + this.creationTransaction.memo, + new AuthenticatedEncryption(homeCommunityKeyPair), + new AuthenticatedEncryption(recipientKeyPair), ), - this.tx.targetDate, + ) + .setTransactionCreation( + new TransferAmount(recipientKeyPair.getPublicKey(), this.creationTransaction.amount), + this.creationTransaction.targetDate, ) .sign(signerKeyPair) return builder diff --git a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts index 655542537..36569d708 100644 --- a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts @@ -5,53 +5,52 @@ import { GradidoTransfer, TransferAmount, } from 'gradido-blockchain-js' - +import { parse } from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' +import { IdentifierSeed, identifierSeedSchema } from '../../schemas/account.schema' +import { + DeferredTransferTransaction, + deferredTransferTransactionSchema, + Transaction, +} from '../../schemas/transaction.schema' +import { HieroId } from '../../schemas/typeGuard.schema' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' - import { AbstractTransactionRole } from './AbstractTransaction.role' -import { DeferredTransferTransactionInput, deferredTransferTransactionSchema, DeferredTransferTransaction } from '../../schemas/transaction.schema' -import * as v from 'valibot' -import { TRPCError } from '@trpc/server' -import { identifierSeedSchema, IdentifierSeed } from '../../schemas/account.schema' export class DeferredTransferTransactionRole extends AbstractTransactionRole { - private tx: DeferredTransferTransaction - private seed: IdentifierSeed - constructor(protected input: DeferredTransferTransactionInput) { + private readonly seed: IdentifierSeed + private readonly deferredTransferTransaction: DeferredTransferTransaction + constructor(transaction: Transaction) { super() - this.tx = v.parse(deferredTransferTransactionSchema, input) - this.seed = v.parse(identifierSeedSchema, input.linkedUser.seed) + this.deferredTransferTransaction = parse(deferredTransferTransactionSchema, transaction) + this.seed = parse(identifierSeedSchema, this.deferredTransferTransaction.linkedUser.seed) } - getSenderCommunityUuid(): string { - return this.tx.user.communityUuid + getSenderCommunityTopicId(): HieroId { + return this.deferredTransferTransaction.user.communityTopicId } - getRecipientCommunityUuid(): string { - throw new TRPCError({ - code: 'NOT_IMPLEMENTED', - message: 'deferred transfer: cannot be used as cross group transaction yet', - }) + getRecipientCommunityTopicId(): HieroId { + throw new Error('deferred transfer: cannot be used as cross group transaction yet') } public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() const senderKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(this.tx.user) + new KeyPairIdentifierLogic(this.deferredTransferTransaction.user), ) const recipientKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic({ - communityUuid: this.tx.linkedUser.communityUuid, + new KeyPairIdentifierLogic({ + communityTopicId: this.deferredTransferTransaction.linkedUser.communityTopicId, seed: this.seed, - }) + }), ) builder - .setCreatedAt(this.tx.createdAt) + .setCreatedAt(this.deferredTransferTransaction.createdAt) .addMemo( new EncryptedMemo( - this.tx.memo, + this.deferredTransferTransaction.memo, new AuthenticatedEncryption(senderKeyPair), new AuthenticatedEncryption(recipientKeyPair), ), @@ -60,13 +59,13 @@ export class DeferredTransferTransactionRole extends AbstractTransactionRole { new GradidoTransfer( new TransferAmount( senderKeyPair.getPublicKey(), - this.tx.amount.calculateCompoundInterest( - this.tx.timeoutDuration.getSeconds(), + this.deferredTransferTransaction.amount.calculateCompoundInterest( + this.deferredTransferTransaction.timeoutDuration.getSeconds(), ), ), recipientKeyPair.getPublicKey(), ), - this.tx.timeoutDuration, + this.deferredTransferTransaction.timeoutDuration, ) .sign(senderKeyPair) return builder diff --git a/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts index ae9115485..3d2574681 100644 --- a/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts @@ -1,88 +1,71 @@ +import { GradidoTransactionBuilder, GradidoTransfer, TransferAmount } from 'gradido-blockchain-js' +import { parse } from 'valibot' +import { getTransactionsForAccount } from '../../client/GradidoNode/api' +import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' import { - GradidoTransactionBuilder, - GradidoTransfer, - GradidoUnit, - TransferAmount, -} from 'gradido-blockchain-js' - -import { getTransactionsForAccount } from '@/client/GradidoNode' -import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { UserIdentifier } from '@/graphql/input/UserIdentifier' -import { TransactionError } from '@/graphql/model/TransactionError' -import { communityUuidToTopic, uuid4ToHash } from '@/utils/typeConverter' - + RedeemDeferredTransferTransaction, + redeemDeferredTransferTransactionSchema, + Transaction, + UserAccount, +} from '../../schemas/transaction.schema' +import { HieroId } from '../../schemas/typeGuard.schema' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' - import { AbstractTransactionRole } from './AbstractTransaction.role' export class RedeemDeferredTransferTransactionRole extends AbstractTransactionRole { - private linkedUser: UserIdentifier - constructor(protected self: TransactionDraft) { + private linkedUser: UserAccount + private readonly redeemDeferredTransferTransaction: RedeemDeferredTransferTransaction + constructor(transaction: Transaction) { super() - if (!this.self.linkedUser) { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'transfer: linked user missing', - ) - } - this.linkedUser = this.self.linkedUser + this.redeemDeferredTransferTransaction = parse( + redeemDeferredTransferTransactionSchema, + transaction, + ) + this.linkedUser = this.redeemDeferredTransferTransaction.linkedUser } - getSenderCommunityUuid(): string { - return this.self.user.communityUuid + getSenderCommunityTopicId(): HieroId { + return this.redeemDeferredTransferTransaction.user.communityTopicId } - getRecipientCommunityUuid(): string { - return this.linkedUser.communityUuid + getRecipientCommunityTopicId(): HieroId { + return this.linkedUser.communityTopicId } public async getGradidoTransactionBuilder(): Promise { - if (!this.self.amount) { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'redeem deferred transfer: amount missing', - ) - } const builder = new GradidoTransactionBuilder() - const senderKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.self.user)) + const senderKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic(this.redeemDeferredTransferTransaction.user), + ) const senderPublicKey = senderKeyPair.getPublicKey() if (!senderPublicKey) { - throw new TransactionError( - TransactionErrorType.INVALID_PARAMETER, - "redeem deferred transfer: couldn't calculate sender public key", - ) + throw new Error("redeem deferred transfer: couldn't calculate sender public key") } // load deferred transfer transaction from gradido node const transactions = await getTransactionsForAccount( - senderPublicKey, - communityUuidToTopic(this.getSenderCommunityUuid()), + { maxResultCount: 2, topic: this.getSenderCommunityTopicId() }, + senderPublicKey.convertToHex(), ) if (!transactions || transactions.length !== 1) { - throw new TransactionError( - TransactionErrorType.NOT_FOUND, - "redeem deferred transfer: couldn't find deferred transfer on Gradido Node", - ) + throw new Error("redeem deferred transfer: couldn't find deferred transfer on Gradido Node") } const deferredTransfer = transactions[0] const deferredTransferBody = deferredTransfer.getGradidoTransaction()?.getTransactionBody() if (!deferredTransferBody) { - throw new TransactionError( - TransactionErrorType.NOT_FOUND, + throw new Error( "redeem deferred transfer: couldn't deserialize deferred transfer from Gradido Node", ) } - const recipientKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.linkedUser)) + const recipientKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(this.linkedUser)) builder - .setCreatedAt(new Date(this.self.createdAt)) + .setCreatedAt(this.redeemDeferredTransferTransaction.createdAt) .setRedeemDeferredTransfer( deferredTransfer.getId(), new GradidoTransfer( new TransferAmount( senderKeyPair.getPublicKey(), - GradidoUnit.fromString(this.self.amount), + this.redeemDeferredTransferTransaction.amount, ), recipientKeyPair.getPublicKey(), ), @@ -91,13 +74,11 @@ export class RedeemDeferredTransferTransactionRole extends AbstractTransactionRo for (let i = 0; i < memos.size(); i++) { builder.addMemo(memos.get(i)) } - const senderCommunity = this.self.user.communityUuid - const recipientCommunity = this.linkedUser.communityUuid + const senderCommunity = this.redeemDeferredTransferTransaction.user.communityTopicId + const recipientCommunity = this.linkedUser.communityTopicId if (senderCommunity !== recipientCommunity) { // we have a cross group transaction - builder - .setSenderCommunity(uuid4ToHash(senderCommunity).convertToHex()) - .setRecipientCommunity(uuid4ToHash(recipientCommunity).convertToHex()) + builder.setSenderCommunity(senderCommunity).setRecipientCommunity(recipientCommunity) } builder.sign(senderKeyPair) return builder diff --git a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts index a664a34c0..5eee0f164 100644 --- a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts @@ -1,69 +1,60 @@ -/* eslint-disable camelcase */ import { GradidoTransactionBuilder } from 'gradido-blockchain-js' - +import { parse } from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' - +import { Uuidv4Hash } from '../../data/Uuidv4Hash' +import { + IdentifierCommunityAccount, + identifierCommunityAccountSchema, +} from '../../schemas/account.schema' +import { + RegisterAddressTransaction, + registerAddressTransactionSchema, + Transaction, +} from '../../schemas/transaction.schema' +import { HieroId } from '../../schemas/typeGuard.schema' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' - import { AbstractTransactionRole } from './AbstractTransaction.role' -import { RegisterAddressTransactionInput, registerAddressTransactionSchema, RegisterAddressTransaction } from '../../schemas/transaction.schema' -import { IdentifierAccount, IdentifierCommunityAccount, identifierCommunityAccountSchema } from '../../schemas/account.schema' -import * as v from 'valibot' -import { TRPCError } from '@trpc/server' -import { uuid4ToHashSchema } from '../../schemas/typeConverter.schema' export class RegisterAddressTransactionRole extends AbstractTransactionRole { - private tx: RegisterAddressTransaction - private account: IdentifierCommunityAccount - constructor(input: RegisterAddressTransactionInput) { + private readonly registerAddressTransaction: RegisterAddressTransaction + private readonly account: IdentifierCommunityAccount + constructor(input: Transaction) { super() - this.tx = v.parse(registerAddressTransactionSchema, input) - this.account = v.parse(identifierCommunityAccountSchema, input.user.account) + this.registerAddressTransaction = parse(registerAddressTransactionSchema, input) + this.account = parse(identifierCommunityAccountSchema, input.user.account) } - getSenderCommunityUuid(): string { - return this.tx.user.communityUuid + getSenderCommunityTopicId(): HieroId { + return this.registerAddressTransaction.user.communityTopicId } - getRecipientCommunityUuid(): string { - throw new TRPCError({ - code: 'NOT_IMPLEMENTED', - message: 'register address: cannot be used as cross group transaction yet', - }) + getRecipientCommunityTopicId(): HieroId { + throw new Error('register address: cannot be used as cross group transaction yet') } public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() const communityKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic({ communityUuid: this.tx.user.communityUuid }), - ) - const userKeyPairIdentifier: IdentifierAccount = { - communityUuid: this.tx.user.communityUuid, - account: { - userUuid: this.account.userUuid, - accountNr: 0, - }, - } - const accountKeyPairIdentifier: IdentifierAccount = { - communityUuid: this.tx.user.communityUuid, - account: { - userUuid: this.account.userUuid, - accountNr: this.account.accountNr, - }, - } - const userKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(userKeyPairIdentifier) + new KeyPairIdentifierLogic({ + communityTopicId: this.registerAddressTransaction.user.communityTopicId, + }), ) + const accountKeyPairIdentifier = this.registerAddressTransaction.user + // when accountNr is 0 it is the user account + const userKeyPairIdentifier = accountKeyPairIdentifier + userKeyPairIdentifier.account.accountNr = 0 + + const userKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(userKeyPairIdentifier)) const accountKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(accountKeyPairIdentifier) + new KeyPairIdentifierLogic(accountKeyPairIdentifier), ) builder - .setCreatedAt(this.tx.createdAt) + .setCreatedAt(this.registerAddressTransaction.createdAt) .setRegisterAddress( userKeyPair.getPublicKey(), - this.tx.accountType, - v.parse(uuid4ToHashSchema, this.account.userUuid), + this.registerAddressTransaction.accountType, + new Uuidv4Hash(this.account.userUuid).getAsMemoryBlock(), accountKeyPair.getPublicKey(), ) .sign(communityKeyPair) diff --git a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts index 2607f6c8f..288ccfc77 100644 --- a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts +++ b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts @@ -1,24 +1,17 @@ /* eslint-disable camelcase */ import { GradidoTransaction, - InteractionSerialize, - InteractionValidate, - MemoryBlock, + InteractionValidate, + MemoryBlock, ValidateType_SINGLE, } from 'gradido-blockchain-js' - -import { sendMessage as iotaSendMessage } from '@/client/IotaClient' -import { InputTransactionType } from '@/graphql/enum/InputTransactionType' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { TransactionError } from '@/graphql/model/TransactionError' -import { TransactionRecipe } from '@/graphql/model/TransactionRecipe' -import { TransactionResult } from '@/graphql/model/TransactionResult' -import { logger } from '@/logging/logger' -import { LogError } from '@/server/LogError' -import { communityUuidToTopic } from '@/utils/typeConverter' - +import { getLogger } from 'log4js' +import { safeParse, parse } from 'valibot' +import { Community, communitySchema } from '../../client/backend/community.schema' +import { HieroClient } from '../../client/HieroClient' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' +import { Transaction, transactionSchema } from '../../schemas/transaction.schema' +import { HieroId, HieroTransactionId, hieroTransactionIdSchema } from '../../schemas/typeGuard.schema' import { AbstractTransactionRole } from './AbstractTransaction.role' import { CommunityRootTransactionRole } from './CommunityRootTransaction.role' import { CreationTransactionRole } from './CreationTransaction.role' @@ -26,6 +19,9 @@ import { DeferredTransferTransactionRole } from './DeferredTransferTransaction.r import { RedeemDeferredTransferTransactionRole } from './RedeemDeferredTransferTransaction.role' import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' import { TransferTransactionRole } from './TransferTransaction.role' +import { InputTransactionType } from '../../enum/InputTransactionType' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.interactions.sendToIota.SendToIotaContext`) /** * @DCI-Context @@ -33,95 +29,74 @@ import { TransferTransactionRole } from './TransferTransaction.role' * send every transaction only once to iota! */ export async function SendToIotaContext( - input: TransactionDraft | CommunityDraft, -): Promise { + input: Transaction | Community, +): Promise { + // let gradido blockchain validator run, it will throw an exception when something is wrong const validate = (transaction: GradidoTransaction): void => { - try { - // throw an exception when something is wrong - const validator = new InteractionValidate(transaction) - validator.run(ValidateType_SINGLE) - } catch (e) { - if (e instanceof Error) { - throw new TransactionError(TransactionErrorType.VALIDATION_ERROR, e.message) - } else if (typeof e === 'string') { - throw new TransactionError(TransactionErrorType.VALIDATION_ERROR, e) - } else { - throw e - } - } + const validator = new InteractionValidate(transaction) + validator.run(ValidateType_SINGLE) } - const sendViaIota = async ( + // send transaction as hiero topic message + const sendViaHiero = async ( gradidoTransaction: GradidoTransaction, - topic: string, - ): Promise => { - // protobuf serializing function - const serialized = new InteractionSerialize(gradidoTransaction).run() - if (!serialized) { - throw new TransactionError( - TransactionErrorType.PROTO_ENCODE_ERROR, - 'cannot serialize transaction', - ) - } - const resultMessage = await iotaSendMessage( - Uint8Array.from(serialized.data()), - Uint8Array.from(Buffer.from(topic, 'hex')), - ) - logger.info('transmitted Gradido Transaction to Iota', { - messageId: resultMessage.messageId, - }) - return MemoryBlock.fromHex(resultMessage.messageId) + topic: HieroId, + ): Promise => { + const client = HieroClient.getInstance() + const resultMessage = await client.sendMessage(topic, gradidoTransaction) + const transactionId = resultMessage.response.transactionId.toString() + logger.info('transmitted Gradido Transaction to Iota', { transactionId }) + return transactionId } - let role: AbstractTransactionRole - if (input instanceof TransactionDraft) { - switch (input.type) { - case InputTransactionType.GRADIDO_CREATION: - role = new CreationTransactionRole(input) - break - case InputTransactionType.GRADIDO_TRANSFER: - role = new TransferTransactionRole(input) - break - case InputTransactionType.REGISTER_ADDRESS: - role = new RegisterAddressTransactionRole(input) - break - case InputTransactionType.GRADIDO_DEFERRED_TRANSFER: - role = new DeferredTransferTransactionRole(input) - break - case InputTransactionType.GRADIDO_REDEEM_DEFERRED_TRANSFER: - role = new RedeemDeferredTransferTransactionRole(input) - break - default: - throw new TransactionError( - TransactionErrorType.NOT_IMPLEMENTED_YET, - 'not supported transaction type: ' + input.type, - ) + // choose correct role based on transaction type and input type + const chooseCorrectRole = (input: Transaction | Community): AbstractTransactionRole => { + const transactionParsingResult = safeParse(transactionSchema, input) + const communityParsingResult = safeParse(communitySchema, input) + if (transactionParsingResult.success) { + const transaction = transactionParsingResult.output + switch (transaction.type) { + case InputTransactionType.GRADIDO_CREATION: + return new CreationTransactionRole(transaction) + case InputTransactionType.GRADIDO_TRANSFER: + return new TransferTransactionRole(transaction) + case InputTransactionType.REGISTER_ADDRESS: + return new RegisterAddressTransactionRole(transaction) + case InputTransactionType.GRADIDO_DEFERRED_TRANSFER: + return new DeferredTransferTransactionRole(transaction) + case InputTransactionType.GRADIDO_REDEEM_DEFERRED_TRANSFER: + return new RedeemDeferredTransferTransactionRole(transaction) + default: + throw new Error('not supported transaction type: ' + transaction.type) + } + } else if (communityParsingResult.success) { + return new CommunityRootTransactionRole(communityParsingResult.output) + } else { + throw new Error('not expected input') } - } else if (input instanceof CommunityDraft) { - role = new CommunityRootTransactionRole(input) - } else { - throw new LogError('not expected input') } + + const role = chooseCorrectRole(input) const builder = await role.getGradidoTransactionBuilder() if (builder.isCrossCommunityTransaction()) { const outboundTransaction = builder.buildOutbound() validate(outboundTransaction) - const outboundIotaMessageId = await sendViaIota( + const outboundIotaMessageId = await sendViaHiero( outboundTransaction, - communityUuidToTopic(role.getSenderCommunityUuid()), + role.getSenderCommunityTopicId(), ) - builder.setParentMessageId(outboundIotaMessageId) + builder.setParentMessageId(MemoryBlock.createPtr(new MemoryBlock(outboundIotaMessageId))) const inboundTransaction = builder.buildInbound() validate(inboundTransaction) - await sendViaIota(inboundTransaction, communityUuidToTopic(role.getRecipientCommunityUuid())) - return new TransactionResult(new TransactionRecipe(outboundTransaction, outboundIotaMessageId)) + await sendViaHiero(inboundTransaction, role.getRecipientCommunityTopicId()) + return parse(hieroTransactionIdSchema, outboundIotaMessageId) } else { const transaction = builder.build() validate(transaction) - const iotaMessageId = await sendViaIota( + const iotaMessageId = await sendViaHiero( transaction, - communityUuidToTopic(role.getSenderCommunityUuid()), + role.getSenderCommunityTopicId(), ) - return new TransactionResult(new TransactionRecipe(transaction, iotaMessageId)) + return parse(hieroTransactionIdSchema, iotaMessageId) } } diff --git a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts index 344efeba5..f244bf472 100644 --- a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts @@ -4,60 +4,61 @@ import { GradidoTransactionBuilder, TransferAmount, } from 'gradido-blockchain-js' - +import { parse } from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' +import { + TransferTransaction, + transferTransactionSchema, + Transaction, +} from '../../schemas/transaction.schema' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' import { AbstractTransactionRole } from './AbstractTransaction.role' -import { TransferTransactionInput, transferTransactionSchema, TransferTransaction } from '../../schemas/transaction.schema' -import * as v from 'valibot' -import { uuid4ToTopicSchema } from '../../schemas/typeConverter.schema' +import { HieroId } from '../../schemas/typeGuard.schema' export class TransferTransactionRole extends AbstractTransactionRole { - private tx: TransferTransaction - constructor(input: TransferTransactionInput) { + private transferTransaction: TransferTransaction + constructor(input: Transaction) { super() - this.tx = v.parse(transferTransactionSchema, input) + this.transferTransaction = parse(transferTransactionSchema, input) } - getSenderCommunityUuid(): string { - return this.tx.user.communityUuid + getSenderCommunityTopicId(): HieroId { + return this.transferTransaction.user.communityTopicId } - getRecipientCommunityUuid(): string { - return this.tx.linkedUser.communityUuid + getRecipientCommunityTopicId(): HieroId { + return this.transferTransaction.linkedUser.communityTopicId } public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() // sender + signer - const senderKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(this.tx.user) - ) + const senderKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(this.transferTransaction.user)) // recipient const recipientKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(this.tx.linkedUser) + new KeyPairIdentifierLogic(this.transferTransaction.linkedUser), ) builder - .setCreatedAt(new Date(this.tx.createdAt)) + .setCreatedAt(this.transferTransaction.createdAt) .addMemo( new EncryptedMemo( - this.tx.memo, + this.transferTransaction.memo, new AuthenticatedEncryption(senderKeyPair), new AuthenticatedEncryption(recipientKeyPair), ), ) .setTransactionTransfer( - new TransferAmount(senderKeyPair.getPublicKey(), this.tx.amount), + new TransferAmount(senderKeyPair.getPublicKey(), this.transferTransaction.amount), recipientKeyPair.getPublicKey(), ) - const senderCommunity = this.tx.user.communityUuid - const recipientCommunity = this.tx.linkedUser.communityUuid + const senderCommunity = this.transferTransaction.user.communityTopicId + const recipientCommunity = this.transferTransaction.linkedUser.communityTopicId if (senderCommunity !== recipientCommunity) { // we have a cross group transaction builder - .setSenderCommunity(v.parse(uuid4ToTopicSchema, senderCommunity)) - .setRecipientCommunity(v.parse(uuid4ToTopicSchema, recipientCommunity)) + .setSenderCommunity(senderCommunity) + .setRecipientCommunity(recipientCommunity) } builder.sign(senderKeyPair) return builder diff --git a/dlt-connector/src/schemas/account.schema.ts b/dlt-connector/src/schemas/account.schema.ts index ee85b5cea..7be2cd4f2 100644 --- a/dlt-connector/src/schemas/account.schema.ts +++ b/dlt-connector/src/schemas/account.schema.ts @@ -1,12 +1,9 @@ import * as v from 'valibot' -import { uuidv4Schema } from './typeGuard.schema' +import { hieroIdSchema, uuidv4Schema } from './typeGuard.schema' // use code from transaction links export const identifierSeedSchema = v.object({ - seed: v.pipe( - v.string('expect string type'), - v.length(24, 'expect seed length 24') - ) + seed: v.pipe(v.string('expect string type'), v.length(24, 'expect seed length 24')), }) export type IdentifierSeed = v.InferOutput @@ -22,7 +19,7 @@ export type IdentifierCommunityAccount = v.InferOutput diff --git a/dlt-connector/src/schemas/base.schema.ts b/dlt-connector/src/schemas/base.schema.ts index 8a9f3af3d..2e065f55d 100644 --- a/dlt-connector/src/schemas/base.schema.ts +++ b/dlt-connector/src/schemas/base.schema.ts @@ -1,11 +1,9 @@ -import * as v from 'valibot' import { MemoryBlock } from 'gradido-blockchain-js' +import * as v from 'valibot' export const keyGenerationSeedSchema = v.pipe( v.string('expect string type'), v.hexadecimal('expect hexadecimal string'), v.length(64, 'expect seed length minimum 64 characters (32 Bytes)'), - v.transform( - (input: string) => MemoryBlock.fromHex(input), - ), -) \ No newline at end of file + v.transform((input: string) => MemoryBlock.fromHex(input)), +) diff --git a/dlt-connector/src/schemas/transaction.schema.test.ts b/dlt-connector/src/schemas/transaction.schema.test.ts index e7459175c..2c4da487a 100644 --- a/dlt-connector/src/schemas/transaction.schema.test.ts +++ b/dlt-connector/src/schemas/transaction.schema.test.ts @@ -1,10 +1,26 @@ -import { describe, it, expect } from 'bun:test' -import { transactionIdentifierSchema, transactionSchema, TransactionInput, memoSchema } from './transaction.schema' -import { InputTransactionType } from '../enum/InputTransactionType' -import { v4 as uuidv4 } from 'uuid' -import * as v from 'valibot' -import { GradidoUnit, DurationSeconds } from 'gradido-blockchain-js' +import { describe, expect, it, beforeAll } from 'bun:test' import { randomBytes } from 'crypto' +import { DurationSeconds, GradidoUnit } from 'gradido-blockchain-js' +import { v4 as uuidv4 } from 'uuid' +import { parse } from 'valibot' +import { InputTransactionType } from '../enum/InputTransactionType' +import { + TransactionInput, + transactionSchema, +} from './transaction.schema' +import { transactionIdentifierSchema } from '../client/GradidoNode/input.schema' +import { + gradidoAmountSchema, + HieroId, + hieroIdSchema, + HieroTransactionId, + hieroTransactionIdSchema, + Memo, + memoSchema, + timeoutDurationSchema, + Uuidv4, + uuidv4Schema +} from '../schemas/typeGuard.schema' const transactionLinkCode = (date: Date): string => { const time = date.getTime().toString(16) @@ -14,149 +30,154 @@ const transactionLinkCode = (date: Date): string => { .substring(0, 24 - time.length) + time ) } +let topic: HieroId +const topicString = '0.0.261' +let hieroTransactionId: HieroTransactionId +beforeAll(() => { + topic = parse(hieroIdSchema, topicString) + hieroTransactionId = parse(hieroTransactionIdSchema, '0.0.261-1755348116-1281621') +}) describe('transaction schemas', () => { - describe('transactionIdentifierSchema ', () => { it('valid, transaction identified by transactionNr and topic', () => { - expect(v.parse(transactionIdentifierSchema, { - transactionNr: 1, - iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' - })).toEqual({ - transactionNr: 1, - iotaMessageId: undefined, - iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' + expect( + parse(transactionIdentifierSchema, { + transactionNr: 1, + topic: topicString, + }), + ).toEqual({ + transactionNr: 1, + hieroTransactionId: undefined, + topic, }) }) - it('valid, transaction identified by iotaMessageId and topic', () => { - expect(v.parse(transactionIdentifierSchema, { - iotaMessageId: '1b33a3cf7eb5dde04ed7ae571db1763006811ff6b7bb35b3d1c780de153af9dd', - iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' - })).toEqual({ - transactionNr: 0, - iotaMessageId: '1b33a3cf7eb5dde04ed7ae571db1763006811ff6b7bb35b3d1c780de153af9dd', - iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' + it('valid, transaction identified by hieroTransactionId and topic', () => { + expect( + parse(transactionIdentifierSchema, { + hieroTransactionId: '0.0.261-1755348116-1281621', + topic: topicString, + }), + ).toEqual({ + hieroTransactionId, + topic }) }) it('invalid, missing topic', () => { - expect(() => v.parse(transactionIdentifierSchema, { - transactionNr: 1, - iotaMessageId: '1b33a3cf7eb5dde04ed7ae571db1763006811ff6b7bb35b3d1c780de153af9dd', - })).toThrowError(new Error('Invalid key: Expected "iotaTopic" but received undefined')) + expect(() => + parse(transactionIdentifierSchema, { + transactionNr: 1, + hieroTransactionId: '0.0.261-1755348116-1281621', + }), + ).toThrowError(new Error('Invalid key: Expected "topic" but received undefined')) }) it('invalid, transactionNr and iotaMessageId set', () => { - expect(() => v.parse(transactionIdentifierSchema, { - transactionNr: 1, - iotaMessageId: '1b33a3cf7eb5dde04ed7ae571db1763006811ff6b7bb35b3d1c780de153af9dd', - iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' - })).toThrowError(new Error('expect transactionNr or iotaMessageId not both')) + expect(() => + parse(transactionIdentifierSchema, { + transactionNr: 1, + hieroTransactionId: '0.0.261-1755348116-1281621', + topic + }), + ).toThrowError(new Error('expect transactionNr or hieroTransactionId not both')) }) }) - describe('transactionSchema', () => { + describe('transactionSchema', () => { + let userUuid: Uuidv4 + let userUuidString: string + let memoString: string + let memo: Memo + beforeAll(() => { + userUuidString = uuidv4() + userUuid = parse(uuidv4Schema, userUuidString) + memoString = 'TestMemo' + memo = parse(memoSchema, memoString) + }) it('valid, register new user address', () => { const registerAddress: TransactionInput = { - user: { - communityUuid: uuidv4(), - account: { - userUuid: uuidv4(), - } - }, - type: InputTransactionType.REGISTER_ADDRESS, + user: { + communityTopicId: topicString, + account: { userUuid: userUuidString }, + }, + type: InputTransactionType.REGISTER_ADDRESS, createdAt: '2022-01-01T00:00:00.000Z', } - expect(v.parse(transactionSchema, registerAddress)).toEqual({ + expect(parse(transactionSchema, registerAddress)).toEqual({ user: { - communityUuid: registerAddress.user.communityUuid, + communityTopicId: topic, account: { - userUuid: registerAddress.user.account!.userUuid, - accountNr: 1, - } + userUuid, + accountNr: 0, + }, }, type: registerAddress.type, createdAt: new Date(registerAddress.createdAt), }) - }) + }) it('valid, gradido transfer', () => { - const communityUuid = uuidv4() const gradidoTransfer: TransactionInput = { - user: { - communityUuid, - account: { - userUuid: uuidv4(), - } - }, - linkedUser: { - communityUuid, - account: { - userUuid: uuidv4(), - } - }, - amount: '100', - memo: 'TestMemo', - type: InputTransactionType.GRADIDO_TRANSFER, - createdAt: '2022-01-01T00:00:00.000Z', - } - expect(v.parse(transactionSchema, gradidoTransfer)).toEqual({ user: { - communityUuid, - account: { - userUuid: gradidoTransfer.user.account!.userUuid, - accountNr: 1, - } + communityTopicId: topicString, + account: { userUuid: userUuidString }, }, linkedUser: { - communityUuid, - account: { - userUuid: gradidoTransfer.linkedUser!.account!.userUuid, - accountNr: 1, - } + communityTopicId: topicString, + account: { userUuid: userUuidString }, }, - amount: GradidoUnit.fromString(gradidoTransfer.amount!), - memo: gradidoTransfer.memo, + amount: '100', + memo: memoString, + type: InputTransactionType.GRADIDO_TRANSFER, + createdAt: '2022-01-01T00:00:00.000Z', + } + expect(parse(transactionSchema, gradidoTransfer)).toEqual({ + user: { + communityTopicId: topic, + account: { + userUuid, + accountNr: 0, + }, + }, + linkedUser: { + communityTopicId: topic, + account: { + userUuid, + accountNr: 0, + }, + }, + amount: parse(gradidoAmountSchema, gradidoTransfer.amount!), + memo, type: gradidoTransfer.type, createdAt: new Date(gradidoTransfer.createdAt), }) }) it('valid, gradido creation', () => { - const communityUuid = uuidv4() const gradidoCreation: TransactionInput = { - user: { - communityUuid, - account: { - userUuid: uuidv4(), - } - }, - linkedUser: { - communityUuid, - account: { - userUuid: uuidv4(), - } - }, - amount: '1000', - memo: 'For your help', - type: InputTransactionType.GRADIDO_CREATION, - createdAt: '2022-01-01T00:00:00.000Z', - targetDate: '2021-11-01T10:00' - } - expect(v.parse(transactionSchema, gradidoCreation)).toEqual({ user: { - communityUuid, - account: { - userUuid: gradidoCreation.user.account!.userUuid, - accountNr: 1, - } + communityTopicId: topicString, + account: { userUuid: userUuidString }, }, linkedUser: { - communityUuid, - account: { - userUuid: gradidoCreation.linkedUser!.account!.userUuid, - accountNr: 1, - } + communityTopicId: topicString, + account: { userUuid: userUuidString }, }, - amount: GradidoUnit.fromString(gradidoCreation.amount!), - memo: gradidoCreation.memo, + amount: '1000', + memo: memoString, + type: InputTransactionType.GRADIDO_CREATION, + createdAt: '2022-01-01T00:00:00.000Z', + targetDate: '2021-11-01T10:00', + } + expect(parse(transactionSchema, gradidoCreation)).toEqual({ + user: { + communityTopicId: topic, + account: { userUuid, accountNr: 0 }, + }, + linkedUser: { + communityTopicId: topic, + account: { userUuid, accountNr: 0 }, + }, + amount: parse(gradidoAmountSchema, gradidoCreation.amount!), + memo, type: gradidoCreation.type, createdAt: new Date(gradidoCreation.createdAt), targetDate: new Date(gradidoCreation.targetDate!), @@ -164,44 +185,44 @@ describe('transaction schemas', () => { }) it('valid, gradido transaction link / deferred transfer', () => { const gradidoTransactionLink: TransactionInput = { - user: { - communityUuid: uuidv4(), - account: { - userUuid: uuidv4(), - } - }, - linkedUser: { - communityUuid: uuidv4(), - seed: { - seed: transactionLinkCode(new Date()), - } - }, - amount: '100', - memo: 'use link wisely', - type: InputTransactionType.GRADIDO_DEFERRED_TRANSFER, - createdAt: '2022-01-01T00:00:00.000Z', - timeoutDuration: 60*60*24*30, - } - expect(v.parse(transactionSchema, gradidoTransactionLink)).toEqual({ user: { - communityUuid: gradidoTransactionLink.user.communityUuid, + communityTopicId: topicString, account: { - userUuid: gradidoTransactionLink.user.account!.userUuid, - accountNr: 1, - } + userUuid: userUuidString, + }, }, linkedUser: { - communityUuid: gradidoTransactionLink.linkedUser!.communityUuid, + communityTopicId: topicString, + seed: { + seed: transactionLinkCode(new Date()), + }, + }, + amount: '100', + memo: memoString, + type: InputTransactionType.GRADIDO_DEFERRED_TRANSFER, + createdAt: '2022-01-01T00:00:00.000Z', + timeoutDuration: 60 * 60 * 24 * 30, + } + expect(parse(transactionSchema, gradidoTransactionLink)).toEqual({ + user: { + communityTopicId: topic, + account: { + userUuid, + accountNr: 0, + }, + }, + linkedUser: { + communityTopicId: topic, seed: { seed: gradidoTransactionLink.linkedUser!.seed!.seed, - } + }, }, - amount: GradidoUnit.fromString(gradidoTransactionLink.amount!), - memo: gradidoTransactionLink.memo, + amount: parse(gradidoAmountSchema, gradidoTransactionLink.amount!), + memo, type: gradidoTransactionLink.type, createdAt: new Date(gradidoTransactionLink.createdAt), - timeoutDuration: new DurationSeconds(gradidoTransactionLink.timeoutDuration!), + timeoutDuration: parse(timeoutDurationSchema, gradidoTransactionLink.timeoutDuration!), }) }) }) -}) \ No newline at end of file +}) diff --git a/dlt-connector/src/schemas/transaction.schema.ts b/dlt-connector/src/schemas/transaction.schema.ts index ac654da5e..de75bda89 100644 --- a/dlt-connector/src/schemas/transaction.schema.ts +++ b/dlt-connector/src/schemas/transaction.schema.ts @@ -1,43 +1,66 @@ import * as v from 'valibot' -import { dateFromStringSchema } from './typeConverter.schema' -import { identifierAccountSchema } from './account.schema' import { InputTransactionType } from '../enum/InputTransactionType' -import { accountTypeToAddressTypeSchema } from './typeConverter.schema' - +import { + identifierAccountSchema, + identifierCommunityAccountSchema, + identifierSeedSchema, +} from './account.schema' +import { accountTypeSchema, addressTypeSchema, dateSchema } from './typeConverter.schema' +import { + gradidoAmountSchema, + hieroIdSchema, + memoSchema, + timeoutDurationSchema, +} from './typeGuard.schema' export const transactionSchema = v.object({ - user: identifierAccountScmhema, + user: identifierAccountSchema, linkedUser: v.nullish(identifierAccountSchema, undefined), - amount: v.nullish(amountToGradidoUnitSchema, undefined), + amount: v.nullish(gradidoAmountSchema, undefined), memo: v.nullish(memoSchema, undefined), type: v.enum(InputTransactionType), - createdAt: dateFromStringSchema, - targetDate: v.nullish(dateFromStringSchema, undefined), + createdAt: dateSchema, + targetDate: v.nullish(dateSchema, undefined), timeoutDuration: v.nullish(timeoutDurationSchema, undefined), - accountType: v.nullish(accountTypeToAddressTypeSchema, undefined), + accountType: v.nullish(accountTypeSchema, undefined), }) export type TransactionInput = v.InferInput export type Transaction = v.InferOutput +// if the account is identified by seed +export const seedAccountSchema = v.object({ + communityTopicId: hieroIdSchema, + seed: identifierSeedSchema, +}) + +// if the account is identified by userUuid and accountNr +export const userAccountSchema = v.object({ + communityTopicId: hieroIdSchema, + account: identifierCommunityAccountSchema, +}) + +export type UserAccountInput = v.InferInput +export type UserAccount = v.InferOutput + export const creationTransactionSchema = v.object({ - user: identifierAccountSchema, - linkedUser: identifierAccountSchema, - amount: amountToGradidoUnitSchema, + user: userAccountSchema, + linkedUser: userAccountSchema, + amount: gradidoAmountSchema, memo: memoSchema, - createdAt: dateFromStringSchema, - targetDate: dateFromStringSchema, + createdAt: dateSchema, + targetDate: dateSchema, }) export type CreationTransactionInput = v.InferInput export type CreationTransaction = v.InferOutput export const transferTransactionSchema = v.object({ - user: identifierAccountSchema, - linkedUser: identifierAccountSchema, - amount: amountToGradidoUnitSchema, + user: userAccountSchema, + linkedUser: userAccountSchema, + amount: gradidoAmountSchema, memo: memoSchema, - createdAt: dateFromStringSchema, + createdAt: dateSchema, }) export type TransferTransactionInput = v.InferInput @@ -45,23 +68,40 @@ export type TransferTransaction = v.InferOutput export type RegisterAddressTransaction = v.InferOutput - +// deferred transfer transaction: from user account to seed export const deferredTransferTransactionSchema = v.object({ - user: identifierAccountSchema, - linkedUser: identifierAccountSchema, - amount: amountToGradidoUnitSchema, + user: userAccountSchema, + linkedUser: seedAccountSchema, + amount: gradidoAmountSchema, memo: memoSchema, - createdAt: dateFromStringSchema, + createdAt: dateSchema, timeoutDuration: timeoutDurationSchema, }) -export type DeferredTransferTransactionInput = v.InferInput +export type DeferredTransferTransactionInput = v.InferInput< + typeof deferredTransferTransactionSchema +> export type DeferredTransferTransaction = v.InferOutput + +// redeem deferred transaction: from seed to user account +export const redeemDeferredTransferTransactionSchema = v.object({ + user: seedAccountSchema, + linkedUser: userAccountSchema, + amount: gradidoAmountSchema, + createdAt: dateSchema, +}) + +export type RedeemDeferredTransferTransactionInput = v.InferInput< + typeof redeemDeferredTransferTransactionSchema +> +export type RedeemDeferredTransferTransaction = v.InferOutput< + typeof redeemDeferredTransferTransactionSchema +> diff --git a/dlt-connector/src/schemas/typeConverter.schema.test.ts b/dlt-connector/src/schemas/typeConverter.schema.test.ts index 7537e3b59..2ec02d12e 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.test.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.test.ts @@ -1,14 +1,16 @@ - -import { accountTypeSchema, addressTypeSchema, confirmedTransactionSchema } from './typeConverter.schema' -import * as v from 'valibot' // only for IDE, bun don't need this to work import { describe, expect, it } from 'bun:test' -import { dateSchema } from './typeConverter.schema' import { AddressType_COMMUNITY_AUF, AddressType_COMMUNITY_PROJECT } from 'gradido-blockchain-js' +import * as v from 'valibot' import { AccountType } from '../enum/AccountType' +import { + accountTypeSchema, + addressTypeSchema, + confirmedTransactionSchema, + dateSchema, +} from './typeConverter.schema' describe('basic.schema', () => { - describe('date', () => { it('from string', () => { const date = v.parse(dateSchema, '2021-01-01:10:10') @@ -45,9 +47,12 @@ describe('basic.schema', () => { expect(accountType).toBe(AccountType.COMMUNITY_AUF) }) }) - + it('confirmedTransactionSchema', () => { - const confirmedTransaction = v.parse(confirmedTransactionSchema, 'CAcSAgoAGgYIwvK5/wUiAzMuNCogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA') + const confirmedTransaction = v.parse( + confirmedTransactionSchema, + 'CAcSAgoAGgYIwvK5/wUiAzMuNCogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + ) expect(confirmedTransaction.getId()).toBe(7) expect(confirmedTransaction.getConfirmedAt().getSeconds()).toBe(1609464130) expect(confirmedTransaction.getVersionNumber()).toBe('3.4') diff --git a/dlt-connector/src/schemas/typeConverter.schema.ts b/dlt-connector/src/schemas/typeConverter.schema.ts index 4f6eb6b42..3fb6e55ba 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.ts @@ -1,21 +1,20 @@ -import { - AddressType as AddressType, - ConfirmedTransaction, -} from 'gradido-blockchain-js' -import { AccountType } from '../enum/AccountType' +import { AddressType, ConfirmedTransaction } from 'gradido-blockchain-js' import * as v from 'valibot' -import { confirmedTransactionFromBase64, isAddressType, toAddressType, toAccountType } from '../utils/typeConverter' +import { AccountType } from '../enum/AccountType' +import { + confirmedTransactionFromBase64, + isAddressType, + toAccountType, + toAddressType, +} from '../utils/typeConverter' /** * dateSchema for creating a date from string or Date object */ export const dateSchema = v.pipe( - v.union([ - v.string('expect valid date string'), - v.instance(Date, 'expect Date object') - ]), + v.union([v.string('expect valid date string'), v.instance(Date, 'expect Date object')]), v.transform((input) => { - let date: Date + let date: Date if (input instanceof Date) { date = input } else { @@ -25,7 +24,7 @@ export const dateSchema = v.pipe( throw new Error('invalid date') } return date - }) + }), ) /** @@ -39,7 +38,7 @@ export const addressTypeSchema = v.pipe( v.enum(AccountType, 'expect account type'), v.custom(isAddressType, 'expect AddressType'), ]), - v.transform((value) => toAddressType(value)), + v.transform((value) => toAddressType(value)), ) /** @@ -58,7 +57,7 @@ export const confirmedTransactionSchema = v.pipe( v.instance(ConfirmedTransaction, 'expect ConfirmedTransaction'), v.pipe( v.string('expect confirmed Transaction base64 as string type'), - v.base64('expect to be valid base64') + v.base64('expect to be valid base64'), ), ]), v.transform( @@ -70,5 +69,3 @@ export const confirmedTransactionSchema = v.pipe( }, ), ) - - diff --git a/dlt-connector/src/schemas/typeGuard.schema.test.ts b/dlt-connector/src/schemas/typeGuard.schema.test.ts index 27781c868..ecd9eca7a 100644 --- a/dlt-connector/src/schemas/typeGuard.schema.test.ts +++ b/dlt-connector/src/schemas/typeGuard.schema.test.ts @@ -1,7 +1,7 @@ -import { describe, it, expect } from 'bun:test' -import { uuidv4Schema, memoSchema } from './typeGuard.schema' -import * as v from 'valibot' +import { describe, expect, it } from 'bun:test' import { v4 as uuidv4 } from 'uuid' +import * as v from 'valibot' +import { memoSchema, uuidv4Schema } from './typeGuard.schema' describe('typeGuard.schema', () => { describe('Uuidv4', () => { @@ -14,7 +14,7 @@ describe('typeGuard.schema', () => { }) describe('Basic Type Schemas for transactions', () => { describe('Memo', () => { - it('min length', () => { + it('min length', () => { const memoValue = 'memo1' const memoValueParsed = v.parse(memoSchema, memoValue) expect(memoValueParsed.toString()).toBe(memoValue) @@ -30,8 +30,10 @@ describe('typeGuard.schema', () => { }) it('to long', () => { const memoValue = 's'.repeat(256) - expect(() => v.parse(memoSchema, memoValue)).toThrow(new Error('expect string length <= 255')) + expect(() => v.parse(memoSchema, memoValue)).toThrow( + new Error('expect string length <= 255'), + ) }) }) }) -}) \ No newline at end of file +}) diff --git a/dlt-connector/src/schemas/typeGuard.schema.ts b/dlt-connector/src/schemas/typeGuard.schema.ts index d5a1a32dd..bddb7048f 100644 --- a/dlt-connector/src/schemas/typeGuard.schema.ts +++ b/dlt-connector/src/schemas/typeGuard.schema.ts @@ -1,24 +1,24 @@ /** - * # TypeGuards + * # TypeGuards * Expand TypeScript Default Types with custom type which a based on a default type (or class) * Use valibot, so we can describe the type and validate it easy at runtime * After transpiling TypeScript unique symbol are gone * Infos at opaque type in typescript: https://evertpot.com/opaque-ts-types/ - * + * * declare const validAmount: unique symbol * export type Amount = number & { [validAmount]: true }; * Can be compared with using `typedef int Amount;` in C/C++ - * Example: + * Example: * To create a instance of Amount: - * `const amount: Amount = v.parse(amountSchema, 1.21)` + * `const amount: Amount = v.parse(amountSchema, 1.21)` * must be called and ensure the value is valid * If it isn't valid, v.parse will throw an error * Alternatively v.safeParse can be used, this don't throw but it return null on error */ +import { DurationSeconds, GradidoUnit, MemoryBlock, MemoryBlockPtr } from 'gradido-blockchain-js' import { validate, version } from 'uuid' import * as v from 'valibot' -import { MemoryBlock, DurationSeconds, GradidoUnit } from 'gradido-blockchain-js' /** * type guard for uuid v4 @@ -26,17 +26,15 @@ import { MemoryBlock, DurationSeconds, GradidoUnit } from 'gradido-blockchain-js * uuidv4 is used for communityUuid and userUuid */ declare const validUuidv4: unique symbol -export type Uuidv4 = string & { [validUuidv4]: true }; +export type Uuidv4 = string & { [validUuidv4]: true } export const uuidv4Schema = v.pipe( v.string('expect string type'), - v.custom((value) => - (typeof value === 'string' && validate(value) && version(value) === 4), - 'uuid v4 expected' - ), - v.transform( - (input: string) => input as Uuidv4, + v.custom( + (value) => typeof value === 'string' && validate(value) && version(value) === 4, + 'uuid v4 expected', ), + v.transform((input: string) => input as Uuidv4), ) export type Uuidv4Input = v.InferInput @@ -48,16 +46,30 @@ export type Uuidv4Input = v.InferInput */ declare const validMemoryBlock32: unique symbol -export type MemoryBlock32 = MemoryBlock & { [validMemoryBlock32]: true }; +export type MemoryBlock32 = MemoryBlockPtr & { [validMemoryBlock32]: true } export const memoryBlock32Schema = v.pipe( - v.instance(MemoryBlock, 'expect MemoryBlock type'), - v.custom( - (val): boolean => val instanceof MemoryBlock && val.size() === 32 && !val.isEmpty(), - 'expect MemoryBlock size = 32 and not empty' - ), - v.transform( - (input: MemoryBlock) => input as MemoryBlock32, + v.union([ + v.instance(MemoryBlock, 'expect MemoryBlock type'), + v.instance(MemoryBlockPtr, 'expect MemoryBlockPtr type'), + ]), + v.custom((val): boolean => { + if (val instanceof MemoryBlockPtr) { + return val.size() === 32 && !val.isEmpty() + } + if (val instanceof MemoryBlock) { + return val.size() === 32 && !val.isEmpty() + } + return false + }, 'expect MemoryBlock size = 32 and not empty'), + v.transform( + (input: MemoryBlock | MemoryBlockPtr) => { + let memoryBlock: MemoryBlockPtr = input as MemoryBlockPtr + if (input instanceof MemoryBlock) { + memoryBlock = MemoryBlock.createPtr(input) + } + return memoryBlock as MemoryBlock32 + }, ), ) @@ -68,7 +80,7 @@ export const memoryBlock32Schema = v.pipe( * hex32 is a hex string of length 64 (binary size = 32) */ declare const validHex32: unique symbol -export type Hex32 = string & { [validHex32]: true }; +export type Hex32 = string & { [validHex32]: true } export const hex32Schema = v.pipe( v.union([ @@ -79,40 +91,50 @@ export const hex32Schema = v.pipe( ), memoryBlock32Schema, ]), - v.transform( - (input: string | MemoryBlock32 | Hex32) => { - if (typeof input === 'string') { - return input as Hex32 - } - return input.convertToHex() as Hex32 - }, - ), + v.transform((input: string | MemoryBlock32 | Hex32) => { + if (typeof input === 'string') { + return input as Hex32 + } + return input.convertToHex() as Hex32 + }), ) export type Hex32Input = v.InferInput /** - * type guard for iota message id - * create with `v.parse(iotaMessageIdSchema, '822387692a7cfd3f07f25742e91e248af281d771ee03a432c2e178e5533f786c')` - * iota message id is a hex string of length 64 + * type guard for hiero id + * create with `v.parse(hieroIdSchema, '0.0.2')` + * hiero id is a hiero id of the form 0.0.2 */ -declare const validIotaMessageId: unique symbol -export type IotaMessageId = Hex32 & { [validIotaMessageId]: true }; +declare const validHieroId: unique symbol +export type HieroId = string & { [validHieroId]: true } -export const iotaMessageIdSchema = v.pipe( - v.union([ - v.pipe( - v.string('expect string type'), - v.hexadecimal('expect hexadecimal string'), - v.length(64, 'expect string length = 64'), - ), - memoryBlock32Schema, - ]), - v.transform( - (input: string | MemoryBlock32) => v.parse(hex32Schema, input) as IotaMessageId, - ), +export const hieroIdSchema = v.pipe( + v.string('expect hiero id type, three 64 Bit Numbers separated by . for example 0.0.2'), + v.regex(/^[0-9]+\.[0-9]+\.[0-9]+$/), + v.transform((input: string) => input as HieroId), ) +export type HieroIdInput = v.InferInput + +/** + * type guard for hiero transaction id + * create with `v.parse(hieroTransactionIdSchema, '0.0.141760-1755138896-607329203')` + * hiero transaction id is a hiero transaction id of the form 0.0.141760-1755138896-607329203 + * basically it is a Hiero id with a timestamp seconds-nanoseconds since 1970-01-01T00:00:00Z + * seconds is int64, nanoseconds int32 + */ +declare const validHieroTransactionId: unique symbol +export type HieroTransactionId = string & { [validHieroTransactionId]: true } + +export const hieroTransactionIdSchema = v.pipe( + v.string('expect hiero transaction id type, for example 0.0.141760-1755138896-607329203'), + v.regex(/^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-[0-9]+$/), + v.transform((input: string) => input as HieroTransactionId), +) + +export type HieroTransactionIdInput = v.InferInput + /** * type guard for memo * create with `v.parse(memoSchema, 'memo')` @@ -122,38 +144,36 @@ export const MEMO_MIN_CHARS = 5 export const MEMO_MAX_CHARS = 255 declare const validMemo: unique symbol -export type Memo = string & { [validMemo]: true }; +export type Memo = string & { [validMemo]: true } export const memoSchema = v.pipe( - v.string('expect string type'), + v.string('expect string type'), v.maxLength(MEMO_MAX_CHARS, `expect string length <= ${MEMO_MAX_CHARS}`), v.minLength(MEMO_MIN_CHARS, `expect string length >= ${MEMO_MIN_CHARS}`), - v.transform( - (input: string) => input as Memo, - ), + v.transform((input: string) => input as Memo), ) /** * type guard for timeout duration * create with `v.parse(timeoutDurationSchema, 123)` - * timeout duration is a number in seconds inside bounds + * timeout duration is a number in seconds inside bounds * [1 hour, 3 months] * for Transaction Links / Deferred Transactions * seconds starting from createdAt Date in which the transaction link can be redeemed */ -const LINKED_TRANSACTION_TIMEOUT_DURATION_MIN = 60*60 -const LINKED_TRANSACTION_TIMEOUT_DURATION_MAX = 60*60*24*31*3 +const LINKED_TRANSACTION_TIMEOUT_DURATION_MIN = 60 * 60 +const LINKED_TRANSACTION_TIMEOUT_DURATION_MAX = 60 * 60 * 24 * 31 * 3 declare const validTimeoutDuration: unique symbol -export type TimeoutDuration = DurationSeconds & { [validTimeoutDuration]: true }; +export type TimeoutDuration = DurationSeconds & { [validTimeoutDuration]: true } export const timeoutDurationSchema = v.pipe( - v.number('expect number type'), - v.minValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MIN, 'expect number >= 1 hour'), - v.maxValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MAX, 'expect number <= 3 months'), - v.transform( - (input: number) => new DurationSeconds(input) as TimeoutDuration, - ), + v.number('expect number type'), + v.minValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MIN, 'expect number >= 1 hour'), + v.maxValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MAX, 'expect number <= 3 months'), + v.transform( + (input: number) => new DurationSeconds(input) as TimeoutDuration, + ), ) /** @@ -162,14 +182,12 @@ export const timeoutDurationSchema = v.pipe( * amount is a string representing a positive decimal number, compatible with decimal.js */ declare const validAmount: unique symbol -export type Amount = string & { [validAmount]: true }; +export type Amount = string & { [validAmount]: true } export const amountSchema = v.pipe( - v.string('expect string type'), + v.string('expect string type'), v.regex(/^[0-9]+(\.[0-9]+)?$/, 'expect positive number'), - v.transform( - (input: string) => input as Amount, - ), + v.transform((input: string) => input as Amount), ) /** @@ -179,11 +197,11 @@ export const amountSchema = v.pipe( * GradidoUnit is native implemented in gradido-blockchain-js in c++ and has functions for decay calculation */ declare const validGradidoAmount: unique symbol -export type GradidoAmount = GradidoUnit & { [validGradidoAmount]: true }; +export type GradidoAmount = GradidoUnit & { [validGradidoAmount]: true } export const gradidoAmountSchema = v.pipe( amountSchema, v.transform( (input: Amount) => GradidoUnit.fromString(input) as GradidoAmount, ), -) \ No newline at end of file +) diff --git a/dlt-connector/src/server/index.ts b/dlt-connector/src/server/index.ts index b9bd3c06c..1a6ac945b 100644 --- a/dlt-connector/src/server/index.ts +++ b/dlt-connector/src/server/index.ts @@ -1,77 +1,75 @@ -import { initTRPC, TRPCError } from '@trpc/server' -import * as v from 'valibot' -import { identifierAccountSchema } from '../schemas/account.schema' -import { KeyPairIdentifierLogic } from '../data/KeyPairIdentifier.logic' -import { getLogger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../config/const' -import { KeyPairCalculation } from '../interactions/keyPairCalculation/KeyPairCalculation.context' -import { getAddressType } from '../client/GradidoNode/api' -import { Uuidv4Hash } from '../data/Uuidv4Hash' -import { hex32Schema } from '../schemas/typeGuard.schema' +import { Elysia, status } from 'elysia' import { AddressType_NONE } from 'gradido-blockchain-js' +import { getLogger } from 'log4js' +import * as v from 'valibot' +import { getAddressType } from '../client/GradidoNode/api' +import { LOG4JS_BASE_CATEGORY } from '../config/const' +import { KeyPairIdentifierLogic } from '../data/KeyPairIdentifier.logic' +import { KeyPairCalculation } from '../interactions/keyPairCalculation/KeyPairCalculation.context' +import { SendToIotaContext } from '../interactions/sendToIota/SendToIota.context' +import { IdentifierAccount, identifierAccountSchema } from '../schemas/account.schema' +import { + accountIdentifierSeedSchema, + accountIdentifierUserSchema, + existSchema, +} from './input.schema' -export const t = initTRPC.create() -const publicProcedure = t.procedure const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.server`) -export const appRouter = t.router({ - isAccountExist: publicProcedure - .input(identifierAccountSchema) - .output(v.boolean()) - .query(async ({ input: userIdentifier }) => { - const accountKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(userIdentifier)) - const publicKey = accountKeyPair.getPublicKey() - if (!publicKey) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: "couldn't calculate account key pair", - }) - } - - // ask gradido node server for account type, if type !== NONE account exist - const addressType = await getAddressType( - v.parse(hex32Schema, publicKey.get()), - new Uuidv4Hash(userIdentifier.communityUuid), - ) - logger.info('isAccountExist') - if(logger.isDebugEnabled()) { - logger.debug('params', userIdentifier) - } - return addressType !== AddressType_NONE - }), - - sendTransaction: publicProcedure - .input(transactionDraftSchema) - .output(v.instanceof(TransactionResult)) - .mutation(async ({ input: transactionDraft }) => { - try { - return await SendToIotaContext(transactionDraft) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (error: any) { - if (error instanceof TransactionError) { - return new TransactionResult(error) - } else { - throw error - } - } - }) -}) - -/* - -async sendTransaction( - @Arg('data') - transactionDraft: TransactionDraft, - ): Promise { - try { - return await SendToIotaContext(transactionDraft) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (error: any) { - if (error instanceof TransactionError) { - return new TransactionResult(error) - } else { - throw error - } - } +async function isAccountExist(identifierAccount: IdentifierAccount): Promise { + const startTime = Date.now() + const accountKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(identifierAccount)) + const publicKey = accountKeyPair.getPublicKey() + if (!publicKey) { + throw status(404, "couldn't calculate account key pair") } - */ \ No newline at end of file + + // ask gradido node server for account type, if type !== NONE account exist + const addressType = await getAddressType( + publicKey.convertToHex(), + identifierAccount.communityTopicId, + ) + const endTime = Date.now() + logger.info( + `isAccountExist: ${addressType !== AddressType_NONE}, time used: ${endTime - startTime}ms`, + ) + if (logger.isDebugEnabled()) { + logger.debug('params', identifierAccount) + } + return addressType !== AddressType_NONE +} + +export const appRoutes = new Elysia() + .get( + '/isAccountExist/:communityTopicId/:userUuid/:accountNr', + async ({ params: { communityTopicId, userUuid, accountNr } }) => { + const accountIdentifier = v.parse(identifierAccountSchema, { + communityTopicId, + account: { userUuid, accountNr }, + }) + return { exists: await isAccountExist(accountIdentifier) } + }, + // validation schemas + { params: accountIdentifierUserSchema, response: existSchema }, + ) + .get( + '/isAccountExist/:communityTopicId/:seed', + async ({ params: { communityTopicId, seed } }) => { + const accountIdentifier = v.parse(identifierAccountSchema, { + communityTopicId, + seed: { seed }, + }) + return { exists: await isAccountExist(accountIdentifier) } + }, + // validation schemas + { params: accountIdentifierSeedSchema, response: existSchema }, + ) + .post( + '/sendTransaction', + async ({ body }) => { + const transactionDraft = v.parse(transactionDraftSchema, body) + return await SendToIotaContext(transactionDraft) + }, + // validation schemas + { body: transactionDraftSchema, response: v.instanceof(TransactionResult) }, + ) diff --git a/dlt-connector/src/server/input.schema.ts b/dlt-connector/src/server/input.schema.ts new file mode 100644 index 000000000..c6aa463e5 --- /dev/null +++ b/dlt-connector/src/server/input.schema.ts @@ -0,0 +1,19 @@ +import { TypeBoxFromValibot } from '@sinclair/typemap' +import { t } from 'elysia' +import { hieroIdSchema, uuidv4Schema } from '../schemas/typeGuard.schema' + +export const accountIdentifierUserSchema = t.Object({ + communityTopicId: TypeBoxFromValibot(hieroIdSchema), + userUuid: TypeBoxFromValibot(uuidv4Schema), + accountNr: t.Number().positive(), +}) + +// identifier for a gradido account created by transaction link / deferred transfer +export const accountIdentifierSeedSchema = t.Object({ + communityTopicId: TypeBoxFromValibot(hieroIdSchema), + seed: TypeBoxFromValibot(uuidv4Schema), +}) + +export const existSchema = t.Object({ + exists: t.Boolean(), +}) diff --git a/dlt-connector/src/utils/derivationHelper.test.ts b/dlt-connector/src/utils/derivationHelper.test.ts index 63e7b6993..994d36f28 100644 --- a/dlt-connector/src/utils/derivationHelper.test.ts +++ b/dlt-connector/src/utils/derivationHelper.test.ts @@ -1,6 +1,6 @@ -import { hardenDerivationIndex, HARDENED_KEY_BITMASK } from './derivationHelper' // only for IDE, bun don't need this to work import { describe, expect, it } from 'bun:test' +import { HARDENED_KEY_BITMASK, hardenDerivationIndex } from './derivationHelper' describe('utils', () => { it('test bitmask for hardened keys', () => { diff --git a/dlt-connector/src/utils/network.ts b/dlt-connector/src/utils/network.ts index 8c4244c36..5f348c640 100644 --- a/dlt-connector/src/utils/network.ts +++ b/dlt-connector/src/utils/network.ts @@ -1,16 +1,16 @@ import net from 'node:net' import { getLogger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../config/const' import { CONFIG } from '../config' +import { LOG4JS_BASE_CATEGORY } from '../config/const' export async function isPortOpen( - url: string, + url: string, timeoutMs: number = CONFIG.CONNECT_TIMEOUT_MS, ): Promise { return new Promise((resolve) => { const socket = new net.Socket() const { hostname, port } = new URL(url) - + // auto-destroy socket after timeout const timer = setTimeout(() => { socket.destroy() @@ -35,17 +35,19 @@ export async function isPortOpen( }) } -const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)) +const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) export async function isPortOpenRetry( - url: string, + url: string, timeoutMs: number = CONFIG.CONNECT_TIMEOUT_MS, delayMs: number = CONFIG.CONNECT_RETRY_DELAY_MS, retries: number = CONFIG.CONNECT_RETRY_COUNT, ): Promise { for (let i = 0; i < retries; i++) { - if (await isPortOpen(url, timeoutMs)) return true + if (await isPortOpen(url, timeoutMs)) { + return true + } await wait(delayMs) } throw new Error(`${url} port is not open after ${retries} retries`) -} \ No newline at end of file +} diff --git a/dlt-connector/src/utils/typeConverter.ts b/dlt-connector/src/utils/typeConverter.ts index a1f912581..6ab72b069 100644 --- a/dlt-connector/src/utils/typeConverter.ts +++ b/dlt-connector/src/utils/typeConverter.ts @@ -1,17 +1,17 @@ -import { - ConfirmedTransaction, - MemoryBlock, - InteractionDeserialize, - DeserializeType_CONFIRMED_TRANSACTION, +import { + AddressType, AddressType_COMMUNITY_AUF, AddressType_COMMUNITY_GMW, AddressType_COMMUNITY_HUMAN, AddressType_COMMUNITY_PROJECT, AddressType_CRYPTO_ACCOUNT, - AddressType_SUBACCOUNT, AddressType_DEFERRED_TRANSFER, AddressType_NONE, - AddressType, + AddressType_SUBACCOUNT, + ConfirmedTransaction, + DeserializeType_CONFIRMED_TRANSACTION, + InteractionDeserialize, + MemoryBlock, } from 'gradido-blockchain-js' import { AccountType } from '../enum/AccountType' @@ -44,17 +44,22 @@ const accountToAddressMap: Record = { [AccountType.NONE]: AddressType_NONE, } -const addressToAccountMap: Record = Object.entries(accountToAddressMap).reduce((acc, [accKey, addrVal]) => { - acc[addrVal] = String(accKey) as AccountType - return acc; -}, {} as Record) +const addressToAccountMap: Record = Object.entries( + accountToAddressMap, +).reduce( + (acc, [accKey, addrVal]) => { + acc[addrVal] = String(accKey) as AccountType + return acc + }, + {} as Record, +) export function isAddressType(val: unknown): val is AddressType { return typeof val === 'number' && Object.keys(addressToAccountMap).includes(val.toString()) } export function isAccountType(val: unknown): val is AccountType { - return Object.values(AccountType).includes(val as AccountType); + return Object.values(AccountType).includes(val as AccountType) } export function toAddressType(input: AccountType | AddressType): AddressType {