From 6f7ae241b74883436daa24eb12c92405ceef30b2 Mon Sep 17 00:00:00 2001 From: Rishabh Singh Date: Wed, 25 Feb 2026 16:56:08 +0530 Subject: [PATCH 1/5] feat: token registry command --- package-lock.json | 1039 ++++++++--------- package.json | 2 +- src/commands/helpers.ts | 62 +- .../title-escrow/accept-return-to-issuer.ts | 8 +- .../title-escrow/reject-return-to-issuer.ts | 8 +- src/commands/token-registry/deploy.ts | 256 ++++ src/utils/cli-options.ts | 17 +- tests/commands/token-registry/deploy.test.ts | 685 +++++++++++ 8 files changed, 1515 insertions(+), 562 deletions(-) create mode 100644 src/commands/token-registry/deploy.ts create mode 100644 tests/commands/token-registry/deploy.test.ts diff --git a/package-lock.json b/package-lock.json index 7b3224c..646518a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@inquirer/prompts": "^5.3.8", - "@trustvc/trustvc": "^2.8.0", + "@trustvc/trustvc": "^2.9.1", "@types/yargs": "^17.0.32", "chalk": "^4.1.2", "ethers": "^6.15.0", @@ -179,98 +179,49 @@ } }, "node_modules/@aws-sdk/client-kms": { - "version": "3.989.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.989.0.tgz", - "integrity": "sha512-QjDyXQYXsS7KJJI2Qz+AXMifSMLy8Ojiy9G8dXTgyqASlH/uufRw0+FSbV0Gvv60VyfQg0bwgvnzPZKZuK+8NA==", + "version": "3.997.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.997.0.tgz", + "integrity": "sha512-9Tc9TjS159b7THJnGvTc27tZ2ywh98yinpoCIxltfqmviRsQgQbveb8PT1k2UsJEQVG3YG0yDME6ZCLwjUJmLg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.9", - "@aws-sdk/credential-provider-node": "^3.972.8", - "@aws-sdk/middleware-host-header": "^3.972.3", - "@aws-sdk/middleware-logger": "^3.972.3", - "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.9", - "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.989.0", - "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.7", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.989.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.989.0.tgz", - "integrity": "sha512-3sC+J1ru5VFXLgt9KZmXto0M7mnV5RkS6FNGwRMK3XrojSjHso9DLOWjbnXhbNv4motH8vu53L1HK2VC1+Nj5w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.9", - "@aws-sdk/middleware-host-header": "^3.972.3", - "@aws-sdk/middleware-logger": "^3.972.3", - "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.9", - "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.989.0", - "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.7", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", + "@aws-sdk/core": "^3.973.13", + "@aws-sdk/credential-provider-node": "^3.972.12", + "@aws-sdk/middleware-host-header": "^3.972.4", + "@aws-sdk/middleware-logger": "^3.972.4", + "@aws-sdk/middleware-recursion-detection": "^3.972.4", + "@aws-sdk/middleware-user-agent": "^3.972.13", + "@aws-sdk/region-config-resolver": "^3.972.4", + "@aws-sdk/types": "^3.973.2", + "@aws-sdk/util-endpoints": "^3.996.1", + "@aws-sdk/util-user-agent-browser": "^3.972.4", + "@aws-sdk/util-user-agent-node": "^3.972.12", + "@smithy/config-resolver": "^4.4.7", + "@smithy/core": "^3.23.4", + "@smithy/fetch-http-handler": "^5.3.10", + "@smithy/hash-node": "^4.2.9", + "@smithy/invalid-dependency": "^4.2.9", + "@smithy/middleware-content-length": "^4.2.9", + "@smithy/middleware-endpoint": "^4.4.18", + "@smithy/middleware-retry": "^4.4.35", + "@smithy/middleware-serde": "^4.2.10", + "@smithy/middleware-stack": "^4.2.9", + "@smithy/node-config-provider": "^4.3.9", + "@smithy/node-http-handler": "^4.4.11", + "@smithy/protocol-http": "^5.3.9", + "@smithy/smithy-client": "^4.11.7", + "@smithy/types": "^4.12.1", + "@smithy/url-parser": "^4.2.9", + "@smithy/util-base64": "^4.3.1", + "@smithy/util-body-length-browser": "^4.2.1", + "@smithy/util-body-length-node": "^4.2.2", + "@smithy/util-defaults-mode-browser": "^4.3.34", + "@smithy/util-defaults-mode-node": "^4.2.37", + "@smithy/util-endpoints": "^3.2.9", + "@smithy/util-middleware": "^4.2.9", + "@smithy/util-retry": "^4.2.9", + "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" }, "engines": { @@ -278,23 +229,23 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.973.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.9.tgz", - "integrity": "sha512-cyUOfJSizn8da7XrBEFBf4UMI4A6JQNX6ZFcKtYmh/CrwfzsDcabv3k/z0bNwQ3pX5aeq5sg/8Bs/ASiL0bJaA==", + "version": "3.973.13", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.13.tgz", + "integrity": "sha512-eCFiLyBhJR7c/i8hZOETdzj2wsLFzi2L/w9/jajOgwmGqO8xrUExqkTZqdjROkwU62owqeqSuw4sIzlCv1E/ww==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/xml-builder": "^3.972.4", - "@smithy/core": "^3.23.0", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", + "@aws-sdk/types": "^3.973.2", + "@aws-sdk/xml-builder": "^3.972.6", + "@smithy/core": "^3.23.4", + "@smithy/node-config-provider": "^4.3.9", + "@smithy/property-provider": "^4.2.9", + "@smithy/protocol-http": "^5.3.9", + "@smithy/signature-v4": "^5.3.9", + "@smithy/smithy-client": "^4.11.7", + "@smithy/types": "^4.12.1", + "@smithy/util-base64": "^4.3.1", + "@smithy/util-middleware": "^4.2.9", + "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" }, "engines": { @@ -302,15 +253,15 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.7.tgz", - "integrity": "sha512-r8kBtglvLjGxBT87l6Lqkh9fL8yJJ6O4CYQPjKlj3AkCuL4/4784x3rxxXWw9LTKXOo114VB6mjxAuy5pI7XIg==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.11.tgz", + "integrity": "sha512-hbyoFuVm3qOAGfIPS9t7jCs8GFLFoaOs8ZmYp/chqciuHDyEGv+J365ip7YSvXSrxxUbeW9NyB1hTLt40NBMRg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.9", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.973.13", + "@aws-sdk/types": "^3.973.2", + "@smithy/property-provider": "^4.2.9", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -318,20 +269,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.9.tgz", - "integrity": "sha512-40caFblEg/TPrp9EpvyMxp4xlJ5TuTI+A8H6g8FhHn2hfH2PObFAPLF9d5AljK/G69E1YtTklkuQeAwPlV3w8Q==", + "version": "3.972.13", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.13.tgz", + "integrity": "sha512-a864QxQWFkdCZ5wQF0QZNKTbqAc/DFQNeARp4gOyZZdql5RHjj4CppUSfwAzS9cpw2IPY3eeJjWqLZ1QiDB/6w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.9", - "@aws-sdk/types": "^3.973.1", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/node-http-handler": "^4.4.10", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", - "@smithy/types": "^4.12.0", - "@smithy/util-stream": "^4.5.12", + "@aws-sdk/core": "^3.973.13", + "@aws-sdk/types": "^3.973.2", + "@smithy/fetch-http-handler": "^5.3.10", + "@smithy/node-http-handler": "^4.4.11", + "@smithy/property-provider": "^4.2.9", + "@smithy/protocol-http": "^5.3.9", + "@smithy/smithy-client": "^4.11.7", + "@smithy/types": "^4.12.1", + "@smithy/util-stream": "^4.5.14", "tslib": "^2.6.2" }, "engines": { @@ -339,24 +290,24 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.7.tgz", - "integrity": "sha512-zeYKrMwM5bCkHFho/x3+1OL0vcZQ0OhTR7k35tLq74+GP5ieV3juHXTZfa2LVE0Bg75cHIIerpX0gomVOhzo/w==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.11.tgz", + "integrity": "sha512-kvPFn626ABLzxmjFMoqMRtmFKMeiUdWPhwxhmuPu233tqHnNuXzHv0MtrZlkzHd+rwlh9j0zCbQo89B54wIazQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.9", - "@aws-sdk/credential-provider-env": "^3.972.7", - "@aws-sdk/credential-provider-http": "^3.972.9", - "@aws-sdk/credential-provider-login": "^3.972.7", - "@aws-sdk/credential-provider-process": "^3.972.7", - "@aws-sdk/credential-provider-sso": "^3.972.7", - "@aws-sdk/credential-provider-web-identity": "^3.972.7", - "@aws-sdk/nested-clients": "3.989.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/credential-provider-imds": "^4.2.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.973.13", + "@aws-sdk/credential-provider-env": "^3.972.11", + "@aws-sdk/credential-provider-http": "^3.972.13", + "@aws-sdk/credential-provider-login": "^3.972.11", + "@aws-sdk/credential-provider-process": "^3.972.11", + "@aws-sdk/credential-provider-sso": "^3.972.11", + "@aws-sdk/credential-provider-web-identity": "^3.972.11", + "@aws-sdk/nested-clients": "^3.996.1", + "@aws-sdk/types": "^3.973.2", + "@smithy/credential-provider-imds": "^4.2.9", + "@smithy/property-provider": "^4.2.9", + "@smithy/shared-ini-file-loader": "^4.4.4", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -364,18 +315,18 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.7.tgz", - "integrity": "sha512-Q103cLU6OjAllYjX7+V+PKQw654jjvZUkD+lbUUiFbqut6gR5zwl1DrelvJPM5hnzIty7BCaxaRB3KMuz3M/ug==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.11.tgz", + "integrity": "sha512-stdy09EpBTmsxGiXe1vB5qtXNww9wact36/uWLlSV0/vWbCOUAY2JjhPXoDVLk8n+E6r0M5HeZseLk+iTtifxg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.9", - "@aws-sdk/nested-clients": "3.989.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.973.13", + "@aws-sdk/nested-clients": "^3.996.1", + "@aws-sdk/types": "^3.973.2", + "@smithy/property-provider": "^4.2.9", + "@smithy/protocol-http": "^5.3.9", + "@smithy/shared-ini-file-loader": "^4.4.4", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -383,22 +334,22 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.8.tgz", - "integrity": "sha512-AaDVOT7iNJyLjc3j91VlucPZ4J8Bw+eu9sllRDugJqhHWYyR3Iyp2huBUW8A3+DfHoh70sxGkY92cThAicSzlQ==", + "version": "3.972.12", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.12.tgz", + "integrity": "sha512-gMWGnHbNSKWRj+PAiuSg0EDpEwpyIgk0v9U6EuZ1C/5/BUv25Way+E+UFB7r+YYkscuBJMJ+ai8E2K0Q8dx50g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.7", - "@aws-sdk/credential-provider-http": "^3.972.9", - "@aws-sdk/credential-provider-ini": "^3.972.7", - "@aws-sdk/credential-provider-process": "^3.972.7", - "@aws-sdk/credential-provider-sso": "^3.972.7", - "@aws-sdk/credential-provider-web-identity": "^3.972.7", - "@aws-sdk/types": "^3.973.1", - "@smithy/credential-provider-imds": "^4.2.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@aws-sdk/credential-provider-env": "^3.972.11", + "@aws-sdk/credential-provider-http": "^3.972.13", + "@aws-sdk/credential-provider-ini": "^3.972.11", + "@aws-sdk/credential-provider-process": "^3.972.11", + "@aws-sdk/credential-provider-sso": "^3.972.11", + "@aws-sdk/credential-provider-web-identity": "^3.972.11", + "@aws-sdk/types": "^3.973.2", + "@smithy/credential-provider-imds": "^4.2.9", + "@smithy/property-provider": "^4.2.9", + "@smithy/shared-ini-file-loader": "^4.4.4", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -406,16 +357,16 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.7.tgz", - "integrity": "sha512-hxMo1V3ujWWrQSONxQJAElnjredkRpB6p8SDjnvRq70IwYY38R/CZSys0IbhRPxdgWZ5j12yDRk2OXhxw4Gj3g==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.11.tgz", + "integrity": "sha512-B049fvbv41vf0Fs5bCtbzHpruBDp61sPiFDxUmkAJ/zvgSAturpj2rqzV1rj2clg4mb44Uxp9rgpcODexNFlFA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.9", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.973.13", + "@aws-sdk/types": "^3.973.2", + "@smithy/property-provider": "^4.2.9", + "@smithy/shared-ini-file-loader": "^4.4.4", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -423,18 +374,18 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.7.tgz", - "integrity": "sha512-ZGKBOHEj8Ap15jhG2XMncQmKLTqA++2DVU2eZfLu3T/pkwDyhCp5eZv5c/acFxbZcA/6mtxke+vzO/n+aeHs4A==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.11.tgz", + "integrity": "sha512-vX9z8skN8vPtamVWmSCm4KQohub+1uMuRzIo4urZ2ZUMBAl1bqHatVD/roCb3qRfAyIGvZXCA/AWS03BQRMyCQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.989.0", - "@aws-sdk/core": "^3.973.9", - "@aws-sdk/token-providers": "3.989.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.973.13", + "@aws-sdk/nested-clients": "^3.996.1", + "@aws-sdk/token-providers": "3.997.0", + "@aws-sdk/types": "^3.973.2", + "@smithy/property-provider": "^4.2.9", + "@smithy/shared-ini-file-loader": "^4.4.4", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -442,17 +393,17 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.7.tgz", - "integrity": "sha512-AbYupBIoSJoVMlbMqBhNvPhqj+CdGtzW7Uk4ZIMBm2br18pc3rkG1VaKVFV85H87QCvLHEnni1idJjaX1wOmIw==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.11.tgz", + "integrity": "sha512-VR2Ju/QBdOjnWNIYuxRml63eFDLGc6Zl8aDwLi1rzgWo3rLBgtaWhWVBAijhVXzyPdQIOqdL8hvll5ybqumjeQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.9", - "@aws-sdk/nested-clients": "3.989.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.973.13", + "@aws-sdk/nested-clients": "^3.996.1", + "@aws-sdk/types": "^3.973.2", + "@smithy/property-provider": "^4.2.9", + "@smithy/shared-ini-file-loader": "^4.4.4", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -460,14 +411,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.3.tgz", - "integrity": "sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.4.tgz", + "integrity": "sha512-4q2Vg7/zOB10huDBLjzzTwVjBpG22X3J3ief2XrJEgTaANZrNfA3/cGbCVNAibSbu/nIYA7tDk8WCdsIzDDc4Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.2", + "@smithy/protocol-http": "^5.3.9", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -475,13 +426,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.3.tgz", - "integrity": "sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.4.tgz", + "integrity": "sha512-xFqPvTysuZAHSkdygT+ken/5rzkR7fhOoDPejAJQslZpp0XBepmCJnDOqA57ERtCTBpu8wpjTFI1ETd4S0AXEw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.2", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -489,15 +440,15 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.3.tgz", - "integrity": "sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.4.tgz", + "integrity": "sha512-tVbRaayUZ7y2bOb02hC3oEPTqQf2A0HpPDwdMl1qTmye/q8Mq1F1WiIoFkQwG/YQFvbyErYIDMbYzIlxzzLtjQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", + "@aws-sdk/types": "^3.973.2", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@smithy/protocol-http": "^5.3.9", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -505,17 +456,17 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.9.tgz", - "integrity": "sha512-1g1B7yf7KzessB0mKNiV9gAHEwbM662xgU+VE4LxyGe6kVGZ8LqYsngjhE+Stna09CJ7Pxkjr6Uq1OtbGwJJJg==", + "version": "3.972.13", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.13.tgz", + "integrity": "sha512-p1kVYbzBxRmhuOHoL/ANJPCedqUxnVgkEjxPoxt5pQv/yzppHM7aBWciYEE9TZY59M421D3GjLfZIZBoEFboVQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.9", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.989.0", - "@smithy/core": "^3.23.0", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.973.13", + "@aws-sdk/types": "^3.973.2", + "@aws-sdk/util-endpoints": "^3.996.1", + "@smithy/core": "^3.23.4", + "@smithy/protocol-http": "^5.3.9", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -523,48 +474,48 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.989.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.989.0.tgz", - "integrity": "sha512-Dbk2HMPU3mb6RrSRzgf0WCaWSbgtZG258maCpuN2/ONcAQNpOTw99V5fU5CA1qVK6Vkm4Fwj2cnOnw7wbGVlOw==", + "version": "3.996.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.1.tgz", + "integrity": "sha512-XHVLFRGkuV2gh2uwBahCt65ALMb5wMpqplXEZIvFnWOCPlk60B7h7M5J9Em243K8iICDiWY6KhBEqVGfjTqlLA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.9", - "@aws-sdk/middleware-host-header": "^3.972.3", - "@aws-sdk/middleware-logger": "^3.972.3", - "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.9", - "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.989.0", - "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.7", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", + "@aws-sdk/core": "^3.973.13", + "@aws-sdk/middleware-host-header": "^3.972.4", + "@aws-sdk/middleware-logger": "^3.972.4", + "@aws-sdk/middleware-recursion-detection": "^3.972.4", + "@aws-sdk/middleware-user-agent": "^3.972.13", + "@aws-sdk/region-config-resolver": "^3.972.4", + "@aws-sdk/types": "^3.973.2", + "@aws-sdk/util-endpoints": "^3.996.1", + "@aws-sdk/util-user-agent-browser": "^3.972.4", + "@aws-sdk/util-user-agent-node": "^3.972.12", + "@smithy/config-resolver": "^4.4.7", + "@smithy/core": "^3.23.4", + "@smithy/fetch-http-handler": "^5.3.10", + "@smithy/hash-node": "^4.2.9", + "@smithy/invalid-dependency": "^4.2.9", + "@smithy/middleware-content-length": "^4.2.9", + "@smithy/middleware-endpoint": "^4.4.18", + "@smithy/middleware-retry": "^4.4.35", + "@smithy/middleware-serde": "^4.2.10", + "@smithy/middleware-stack": "^4.2.9", + "@smithy/node-config-provider": "^4.3.9", + "@smithy/node-http-handler": "^4.4.11", + "@smithy/protocol-http": "^5.3.9", + "@smithy/smithy-client": "^4.11.7", + "@smithy/types": "^4.12.1", + "@smithy/url-parser": "^4.2.9", + "@smithy/util-base64": "^4.3.1", + "@smithy/util-body-length-browser": "^4.2.1", + "@smithy/util-body-length-node": "^4.2.2", + "@smithy/util-defaults-mode-browser": "^4.3.34", + "@smithy/util-defaults-mode-node": "^4.2.37", + "@smithy/util-endpoints": "^3.2.9", + "@smithy/util-middleware": "^4.2.9", + "@smithy/util-retry": "^4.2.9", + "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" }, "engines": { @@ -572,15 +523,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.3.tgz", - "integrity": "sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.4.tgz", + "integrity": "sha512-3GrJYv5eI65oCKveBZP7Q246dVP+tqeys9aKMB0dfX1glUWfppWlxIu52derqdNb9BX9lxYmeiaBcBIqOAYSgQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.2", + "@smithy/config-resolver": "^4.4.7", + "@smithy/node-config-provider": "^4.3.9", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -588,17 +539,17 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.989.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.989.0.tgz", - "integrity": "sha512-OdBByMv+OjOZoekrk4THPFpLuND5aIQbDHCGh3n2rvifAbm31+6e0OLhxSeCF1UMPm+nKq12bXYYEoCIx5SQBg==", + "version": "3.997.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.997.0.tgz", + "integrity": "sha512-UdG36F7lU9aTqGFRieEyuRUJlgEJBqKeKKekC0esH21DbUSKhPR1kZBah214kYasIaWe1hLJLaqUigoTa5hZAQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.9", - "@aws-sdk/nested-clients": "3.989.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.973.13", + "@aws-sdk/nested-clients": "^3.996.1", + "@aws-sdk/types": "^3.973.2", + "@smithy/property-provider": "^4.2.9", + "@smithy/shared-ini-file-loader": "^4.4.4", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -606,12 +557,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.973.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", - "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "version": "3.973.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.2.tgz", + "integrity": "sha512-maTZwGsALtnAw4TJr/S6yERAosTwPduu0XhUV+SdbvRZtCOgSgk1ttL2R0XYzvkYSpvbtJocn77tBXq2AKglBw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -619,15 +570,15 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.989.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.989.0.tgz", - "integrity": "sha512-eKmAOeQM4Qusq0jtcbZPiNWky8XaojByKC/n+THbJ8vJf7t4ys8LlcZ4PrBSHZISe9cC484mQsPVOQh6iySjqw==", + "version": "3.996.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.1.tgz", + "integrity": "sha512-7cJyd+M5i0IoqWkJa1KFx8KNCGIx+Ywu+lT53KpqX7ReVwz03DCKUqvZ/y65vdKwo9w9/HptSAeLDluO5MpGIg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-endpoints": "^3.2.8", + "@aws-sdk/types": "^3.973.2", + "@smithy/types": "^4.12.1", + "@smithy/url-parser": "^4.2.9", + "@smithy/util-endpoints": "^3.2.9", "tslib": "^2.6.2" }, "engines": { @@ -647,27 +598,27 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.3.tgz", - "integrity": "sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.4.tgz", + "integrity": "sha512-GHb+8XHv6hfLWKQKAKaSOm+vRvogg07s+FWtbR3+eCXXPSFn9XVmiYF4oypAxH7dGIvoxkVG/buHEnzYukyJiA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.2", + "@smithy/types": "^4.12.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.7.tgz", - "integrity": "sha512-oyhv+FjrgHjP+F16cmsrJzNP4qaRJzkV1n9Lvv4uyh3kLqo3rIe9NSBSBa35f2TedczfG2dD+kaQhHBB47D6Og==", + "version": "3.972.12", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.12.tgz", + "integrity": "sha512-c1n3wBK6te+Vd9qU86nF8AsYuiBsxLn0AADGWyFX7vEADr3btaAg5iPQT6GYj6rvzSOEVVisvaAatOWInlJUbQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.9", - "@aws-sdk/types": "^3.973.1", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/middleware-user-agent": "^3.972.13", + "@aws-sdk/types": "^3.973.2", + "@smithy/node-config-provider": "^4.3.9", + "@smithy/types": "^4.12.1", "tslib": "^2.6.2" }, "engines": { @@ -683,13 +634,13 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.4.tgz", - "integrity": "sha512-0zJ05ANfYqI6+rGqj8samZBFod0dPPousBjLEqg8WdxSgbMAkRgLyn81lP215Do0rFJ/17LIXwr7q0yK24mP6Q==", + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.6.tgz", + "integrity": "sha512-YrXu+UnfC8IdARa4ZkrpcyuRmA/TVgYW6Lcdtvi34NQgRjM1hTirNirN+rGb+s/kNomby8oJiIAu0KNbiZC7PA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", - "fast-xml-parser": "5.3.4", + "@smithy/types": "^4.12.1", + "fast-xml-parser": "5.3.6", "tslib": "^2.6.2" }, "engines": { @@ -3196,12 +3147,12 @@ "dev": true }, "node_modules/@smithy/abort-controller": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", - "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.10.tgz", + "integrity": "sha512-qocxM/X4XGATqQtUkbE9SPUB6wekBi+FyJOMbPj0AhvyvFGYEmOlz6VB22iMePCQsFmMIvFSeViDvA7mZJG47g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3209,16 +3160,16 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", - "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.9.tgz", + "integrity": "sha512-ejQvXqlcU30h7liR9fXtj7PIAau1t/sFbJpgWPfiYDs7zd16jpH0IsSXKcba2jF6ChTXvIjACs27kNMc5xxE2Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", + "@smithy/node-config-provider": "^4.3.10", + "@smithy/types": "^4.13.0", + "@smithy/util-config-provider": "^4.2.1", + "@smithy/util-endpoints": "^3.3.1", + "@smithy/util-middleware": "^4.2.10", "tslib": "^2.6.2" }, "engines": { @@ -3226,20 +3177,20 @@ } }, "node_modules/@smithy/core": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.0.tgz", - "integrity": "sha512-Yq4UPVoQICM9zHnByLmG8632t2M0+yap4T7ANVw482J0W7HW0pOuxwVmeOwzJqX2Q89fkXz0Vybz55Wj2Xzrsg==", + "version": "3.23.6", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.6.tgz", + "integrity": "sha512-4xE+0L2NrsFKpEVFlFELkIHQddBvMbQ41LRIP74dGCXnY1zQ9DgksrBcRBDJT+iOzGy4VEJIeU3hkUK5mn06kg==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.2.9", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.12", - "@smithy/util-utf8": "^4.2.0", - "@smithy/uuid": "^1.1.0", + "@smithy/middleware-serde": "^4.2.11", + "@smithy/protocol-http": "^5.3.10", + "@smithy/types": "^4.13.0", + "@smithy/util-base64": "^4.3.1", + "@smithy/util-body-length-browser": "^4.2.1", + "@smithy/util-middleware": "^4.2.10", + "@smithy/util-stream": "^4.5.15", + "@smithy/util-utf8": "^4.2.1", + "@smithy/uuid": "^1.1.1", "tslib": "^2.6.2" }, "engines": { @@ -3247,15 +3198,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", - "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.10.tgz", + "integrity": "sha512-3bsMLJJLTZGZqVGGeBVFfLzuRulVsGTj12BzRKODTHqUABpIr0jMN1vN3+u6r2OfyhAQ2pXaMZWX/swBK5I6PQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", + "@smithy/node-config-provider": "^4.3.10", + "@smithy/property-provider": "^4.2.10", + "@smithy/types": "^4.13.0", + "@smithy/url-parser": "^4.2.10", "tslib": "^2.6.2" }, "engines": { @@ -3263,15 +3214,15 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", - "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.11.tgz", + "integrity": "sha512-wbTRjOxdFuyEg0CpumjZO0hkUl+fetJFqxNROepuLIoijQh51aMBmzFLfoQdwRjxsuuS2jizzIUTjPWgd8pd7g==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.8", - "@smithy/querystring-builder": "^4.2.8", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", + "@smithy/protocol-http": "^5.3.10", + "@smithy/querystring-builder": "^4.2.10", + "@smithy/types": "^4.13.0", + "@smithy/util-base64": "^4.3.1", "tslib": "^2.6.2" }, "engines": { @@ -3279,14 +3230,14 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", - "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.10.tgz", + "integrity": "sha512-1VzIOI5CcsvMDvP3iv1vG/RfLJVVVc67dCRyLSB2Hn9SWCZrDO3zvcIzj3BfEtqRW5kcMg5KAeVf1K3dR6nD3w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/types": "^4.13.0", + "@smithy/util-buffer-from": "^4.2.1", + "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" }, "engines": { @@ -3294,12 +3245,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", - "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.10.tgz", + "integrity": "sha512-vy9KPNSFUU0ajFYk0sDZIYiUlAWGEAhRfehIr5ZkdFrRFTAuXEPUd41USuqHU6vvLX4r6Q9X7MKBco5+Il0Org==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3307,9 +3258,9 @@ } }, "node_modules/@smithy/is-array-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", - "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.1.tgz", + "integrity": "sha512-Yfu664Qbf1B4IYIsYgKoABt010daZjkaCRvdU/sPnZG6TtHOB0md0RjNdLGzxe5UIdn9js4ftPICzmkRa9RJ4Q==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3319,13 +3270,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", - "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.10.tgz", + "integrity": "sha512-TQZ9kX5c6XbjhaEBpvhSvMEZ0klBs1CFtOdPFwATZSbC9UeQfKHPLPN9Y+I6wZGMOavlYTOlHEPDrt42PMSH9w==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@smithy/protocol-http": "^5.3.10", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3333,18 +3284,18 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.14.tgz", - "integrity": "sha512-FUFNE5KVeaY6U/GL0nzAAHkaCHzXLZcY1EhtQnsAqhD8Du13oPKtMB9/0WK4/LK6a/T5OZ24wPoSShff5iI6Ag==", + "version": "4.4.20", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.20.tgz", + "integrity": "sha512-9W6Np4ceBP3XCYAGLoMCmn8t2RRVzuD1ndWPLBbv7H9CrwM9Bprf6Up6BM9ZA/3alodg0b7Kf6ftBK9R1N04vw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.0", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-middleware": "^4.2.8", + "@smithy/core": "^3.23.6", + "@smithy/middleware-serde": "^4.2.11", + "@smithy/node-config-provider": "^4.3.10", + "@smithy/shared-ini-file-loader": "^4.4.5", + "@smithy/types": "^4.13.0", + "@smithy/url-parser": "^4.2.10", + "@smithy/util-middleware": "^4.2.10", "tslib": "^2.6.2" }, "engines": { @@ -3352,19 +3303,19 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.4.31", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.31.tgz", - "integrity": "sha512-RXBzLpMkIrxBPe4C8OmEOHvS8aH9RUuCOH++Acb5jZDEblxDjyg6un72X9IcbrGTJoiUwmI7hLypNfuDACypbg==", + "version": "4.4.37", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.37.tgz", + "integrity": "sha512-/1psZZllBBSQ7+qo5+hhLz7AEPGLx3Z0+e3ramMBEuPK2PfvLK4SrncDB9VegX5mBn+oP/UTDrM6IHrFjvX1ZA==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/service-error-classification": "^4.2.8", - "@smithy/smithy-client": "^4.11.3", - "@smithy/types": "^4.12.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/uuid": "^1.1.0", + "@smithy/node-config-provider": "^4.3.10", + "@smithy/protocol-http": "^5.3.10", + "@smithy/service-error-classification": "^4.2.10", + "@smithy/smithy-client": "^4.12.0", + "@smithy/types": "^4.13.0", + "@smithy/util-middleware": "^4.2.10", + "@smithy/util-retry": "^4.2.10", + "@smithy/uuid": "^1.1.1", "tslib": "^2.6.2" }, "engines": { @@ -3372,13 +3323,13 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", - "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.11.tgz", + "integrity": "sha512-STQdONGPwbbC7cusL60s7vOa6He6A9w2jWhoapL0mgVjmR19pr26slV+yoSP76SIssMTX/95e5nOZ6UQv6jolg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@smithy/protocol-http": "^5.3.10", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3386,12 +3337,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", - "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.10.tgz", + "integrity": "sha512-pmts/WovNcE/tlyHa8z/groPeOtqtEpp61q3W0nW1nDJuMq/x+hWa/OVQBtgU0tBqupeXq0VBOLA4UZwE8I0YA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3399,14 +3350,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", - "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.10.tgz", + "integrity": "sha512-UALRbJtVX34AdP2VECKVlnNgidLHA2A7YgcJzwSBg1hzmnO/bZBHl/LDQQyYifzUwp1UOODnl9JJ3KNawpUJ9w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@smithy/property-provider": "^4.2.10", + "@smithy/shared-ini-file-loader": "^4.4.5", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3414,15 +3365,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.10.tgz", - "integrity": "sha512-u4YeUwOWRZaHbWaebvrs3UhwQwj+2VNmcVCwXcYTvPIuVyM7Ex1ftAj+fdbG/P4AkBwLq/+SKn+ydOI4ZJE9PA==", + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.12.tgz", + "integrity": "sha512-zo1+WKJkR9x7ZtMeMDAAsq2PufwiLDmkhcjpWPRRkmeIuOm6nq1qjFICSZbnjBvD09ei8KMo26BWxsu2BUU+5w==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/querystring-builder": "^4.2.8", - "@smithy/types": "^4.12.0", + "@smithy/abort-controller": "^4.2.10", + "@smithy/protocol-http": "^5.3.10", + "@smithy/querystring-builder": "^4.2.10", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3430,12 +3381,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", - "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.10.tgz", + "integrity": "sha512-5jm60P0CU7tom0eNrZ7YrkgBaoLFXzmqB0wVS+4uK8PPGmosSrLNf6rRd50UBvukztawZ7zyA8TxlrKpF5z9jw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3443,12 +3394,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", - "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.10.tgz", + "integrity": "sha512-2NzVWpYY0tRdfeCJLsgrR89KE3NTWT2wGulhNUxYlRmtRmPwLQwKzhrfVaiNlA9ZpJvbW7cjTVChYKgnkqXj1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3456,13 +3407,13 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", - "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.10.tgz", + "integrity": "sha512-HeN7kEvuzO2DmAzLukE9UryiUvejD3tMp9a1D1NJETerIfKobBUCLfviP6QEk500166eD2IATaXM59qgUI+YDA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", - "@smithy/util-uri-escape": "^4.2.0", + "@smithy/types": "^4.13.0", + "@smithy/util-uri-escape": "^4.2.1", "tslib": "^2.6.2" }, "engines": { @@ -3470,12 +3421,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", - "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.10.tgz", + "integrity": "sha512-4Mh18J26+ao1oX5wXJfWlTT+Q1OpDR8ssiC9PDOuEgVBGloqg18Fw7h5Ct8DyT9NBYwJgtJ2nLjKKFU6RP1G1Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3483,24 +3434,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", - "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.10.tgz", + "integrity": "sha512-0R/+/Il5y8nB/By90o8hy/bWVYptbIfvoTYad0igYQO5RefhNCDmNzqxaMx7K1t/QWo0d6UynqpqN5cCQt1MCg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0" + "@smithy/types": "^4.13.0" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", - "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.5.tgz", + "integrity": "sha512-pHgASxl50rrtOztgQCPmOXFjRW+mCd7ALr/3uXNzRrRoGV5G2+78GOsQ3HlQuBVHCh9o6xqMNvlIKZjWn4Euug==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3508,18 +3459,18 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.8.tgz", - "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.10.tgz", + "integrity": "sha512-Wab3wW8468WqTKIxI+aZe3JYO52/RYT/8sDOdzkUhjnLakLe9qoQqIcfih/qxcF4qWEFoWBszY0mj5uxffaVXA==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-uri-escape": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/is-array-buffer": "^4.2.1", + "@smithy/protocol-http": "^5.3.10", + "@smithy/types": "^4.13.0", + "@smithy/util-hex-encoding": "^4.2.1", + "@smithy/util-middleware": "^4.2.10", + "@smithy/util-uri-escape": "^4.2.1", + "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" }, "engines": { @@ -3527,17 +3478,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.11.3.tgz", - "integrity": "sha512-Q7kY5sDau8OoE6Y9zJoRGgje8P4/UY0WzH8R2ok0PDh+iJ+ZnEKowhjEqYafVcubkbYxQVaqwm3iufktzhprGg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.0.tgz", + "integrity": "sha512-R8bQ9K3lCcXyZmBnQqUZJF4ChZmtWT5NLi6x5kgWx5D+/j0KorXcA0YcFg/X5TOgnTCy1tbKc6z2g2y4amFupQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.0", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-stream": "^4.5.12", + "@smithy/core": "^3.23.6", + "@smithy/middleware-endpoint": "^4.4.20", + "@smithy/middleware-stack": "^4.2.10", + "@smithy/protocol-http": "^5.3.10", + "@smithy/types": "^4.13.0", + "@smithy/util-stream": "^4.5.15", "tslib": "^2.6.2" }, "engines": { @@ -3545,9 +3496,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", - "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.0.tgz", + "integrity": "sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3557,13 +3508,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", - "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.10.tgz", + "integrity": "sha512-uypjF7fCDsRk26u3qHmFI/ePL7bxxB9vKkE+2WKEciHhz+4QtbzWiHRVNRJwU3cKhrYDYQE3b0MRFtqfLYdA4A==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.2.8", - "@smithy/types": "^4.12.0", + "@smithy/querystring-parser": "^4.2.10", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3571,13 +3522,13 @@ } }, "node_modules/@smithy/util-base64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", - "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.1.tgz", + "integrity": "sha512-BKGuawX4Doq/bI/uEmg+Zyc36rJKWuin3py89PquXBIBqmbnJwBBsmKhdHfNEp0+A4TDgLmT/3MSKZ1SxHcR6w==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/util-buffer-from": "^4.2.1", + "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" }, "engines": { @@ -3585,9 +3536,9 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", - "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.1.tgz", + "integrity": "sha512-SiJeLiozrAoCrgDBUgsVbmqHmMgg/2bA15AzcbcW+zan7SuyAVHN4xTSbq0GlebAIwlcaX32xacnrG488/J/6g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3597,9 +3548,9 @@ } }, "node_modules/@smithy/util-body-length-node": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", - "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.2.tgz", + "integrity": "sha512-4rHqBvxtJEBvsZcFQSPQqXP2b/yy/YlB66KlcEgcH2WNoOKCKB03DSLzXmOsXjbl8dJ4OEYTn31knhdznwk7zw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3609,12 +3560,12 @@ } }, "node_modules/@smithy/util-buffer-from": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", - "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.1.tgz", + "integrity": "sha512-/swhmt1qTiVkaejlmMPPDgZhEaWb/HWMGRBheaxwuVkusp/z+ErJyQxO6kaXumOciZSWlmq6Z5mNylCd33X7Ig==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", + "@smithy/is-array-buffer": "^4.2.1", "tslib": "^2.6.2" }, "engines": { @@ -3622,9 +3573,9 @@ } }, "node_modules/@smithy/util-config-provider": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", - "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.1.tgz", + "integrity": "sha512-462id/00U8JWFw6qBuTSWfN5TxOHvDu4WliI97qOIOnuC/g+NDAknTU8eoGXEPlLkRVgWEr03jJBLV4o2FL8+A==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3634,14 +3585,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.30", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.30.tgz", - "integrity": "sha512-cMni0uVU27zxOiU8TuC8pQLC1pYeZ/xEMxvchSK/ILwleRd1ugobOcIRr5vXtcRqKd4aBLWlpeBoDPJJ91LQng==", + "version": "4.3.36", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.36.tgz", + "integrity": "sha512-R0smq7EHQXRVMxkAxtH5akJ/FvgAmNF6bUy/GwY/N20T4GrwjT633NFm0VuRpC+8Bbv8R9A0DoJ9OiZL/M3xew==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.8", - "@smithy/smithy-client": "^4.11.3", - "@smithy/types": "^4.12.0", + "@smithy/property-provider": "^4.2.10", + "@smithy/smithy-client": "^4.12.0", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3649,17 +3600,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.33", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.33.tgz", - "integrity": "sha512-LEb2aq5F4oZUSzWBG7S53d4UytZSkOEJPXcBq/xbG2/TmK9EW5naUZ8lKu1BEyWMzdHIzEVN16M3k8oxDq+DJA==", + "version": "4.2.39", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.39.tgz", + "integrity": "sha512-otWuoDm35btJV1L8MyHrPl462B07QCdMTktKc7/yM+Psv6KbED/ziXiHnmr7yPHUjfIwE9S8Max0LO24Mo3ZVg==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.6", - "@smithy/credential-provider-imds": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/smithy-client": "^4.11.3", - "@smithy/types": "^4.12.0", + "@smithy/config-resolver": "^4.4.9", + "@smithy/credential-provider-imds": "^4.2.10", + "@smithy/node-config-provider": "^4.3.10", + "@smithy/property-provider": "^4.2.10", + "@smithy/smithy-client": "^4.12.0", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3667,13 +3618,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", - "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.1.tgz", + "integrity": "sha512-xyctc4klmjmieQiF9I1wssBWleRV0RhJ2DpO8+8yzi2LO1Z+4IWOZNGZGNj4+hq9kdo+nyfrRLmQTzc16Op2Vg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", + "@smithy/node-config-provider": "^4.3.10", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3681,9 +3632,9 @@ } }, "node_modules/@smithy/util-hex-encoding": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", - "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.1.tgz", + "integrity": "sha512-c1hHtkgAWmE35/50gmdKajgGAKV3ePJ7t6UtEmpfCWJmQE9BQAQPz0URUVI89eSkcDqCtzqllxzG28IQoZPvwA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3693,12 +3644,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", - "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.10.tgz", + "integrity": "sha512-LxaQIWLp4y0r72eA8mwPNQ9va4h5KeLM0I3M/HV9klmFaY2kN766wf5vsTzmaOpNNb7GgXAd9a25P3h8T49PSA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3706,13 +3657,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", - "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.10.tgz", + "integrity": "sha512-HrBzistfpyE5uqTwiyLsFHscgnwB0kgv8vySp7q5kZ0Eltn/tjosaSGGDj/jJ9ys7pWzIP/icE2d+7vMKXLv7A==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.8", - "@smithy/types": "^4.12.0", + "@smithy/service-error-classification": "^4.2.10", + "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "engines": { @@ -3720,18 +3671,18 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.12", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.12.tgz", - "integrity": "sha512-D8tgkrmhAX/UNeCZbqbEO3uqyghUnEmmoO9YEvRuwxjlkKKUE7FOgCJnqpTlQPe9MApdWPky58mNQQHbnCzoNg==", + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.15.tgz", + "integrity": "sha512-OlOKnaqnkU9X+6wEkd7mN+WB7orPbCVDauXOj22Q7VtiTkvy7ZdSsOg4QiNAZMgI4OkvNf+/VLUC3VXkxuWJZw==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/node-http-handler": "^4.4.10", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/fetch-http-handler": "^5.3.11", + "@smithy/node-http-handler": "^4.4.12", + "@smithy/types": "^4.13.0", + "@smithy/util-base64": "^4.3.1", + "@smithy/util-buffer-from": "^4.2.1", + "@smithy/util-hex-encoding": "^4.2.1", + "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" }, "engines": { @@ -3739,9 +3690,9 @@ } }, "node_modules/@smithy/util-uri-escape": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", - "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.1.tgz", + "integrity": "sha512-YmiUDn2eo2IOiWYYvGQkgX5ZkBSiTQu4FlDo5jNPpAxng2t6Sjb6WutnZV9l6VR4eJul1ABmCrnWBC9hKHQa6Q==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3751,12 +3702,12 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", - "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.1.tgz", + "integrity": "sha512-DSIwNaWtmzrNQHv8g7DBGR9mulSit65KSj5ymGEIAknmIN8IpbZefEep10LaMG/P/xquwbmJ1h9ectz8z6mV6g==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-buffer-from": "^4.2.1", "tslib": "^2.6.2" }, "engines": { @@ -3764,9 +3715,9 @@ } }, "node_modules/@smithy/uuid": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", - "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.1.tgz", + "integrity": "sha512-dSfDCeihDmZlV2oyr0yWPTUfh07suS+R5OB+FZGiv/hHyK3hrFBW5rR1UYjfa57vBsrP9lciFkRPzebaV1Qujw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4247,9 +4198,9 @@ "license": "Apache-2.0" }, "node_modules/@trustvc/trustvc": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@trustvc/trustvc/-/trustvc-2.8.0.tgz", - "integrity": "sha512-9ALOVQkkNFc7Ngx/Lm/FMP6kqWpWI6wTSSNeDrb81vaRl51uQ8RcUW4ErFHNrfGJkiR0WrjxnGEHNRFSnWlYtw==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@trustvc/trustvc/-/trustvc-2.9.1.tgz", + "integrity": "sha512-ehKfXbf5Mrsd8Zcdhl17pT74viC8TZpUtc9Y9Bgst9x6zEXyKfh+FShvlYSXvyqyL77YmXO88hhNsOVxY2m6Pg==", "license": "Apache-2.0", "dependencies": { "@tradetrust-tt/dnsprove": "^2.18.0", @@ -5109,9 +5060,9 @@ } }, "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "license": "MIT" }, "node_modules/assert-plus": { @@ -5266,9 +5217,9 @@ } }, "node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", "license": "MIT" }, "node_modules/bowser": { @@ -6112,9 +6063,9 @@ } }, "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "license": "MIT" }, "node_modules/emoji-regex": { @@ -6860,9 +6811,9 @@ ] }, "node_modules/fast-xml-parser": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.4.tgz", - "integrity": "sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz", + "integrity": "sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==", "funding": [ { "type": "github", @@ -6871,7 +6822,7 @@ ], "license": "MIT", "dependencies": { - "strnum": "^2.1.0" + "strnum": "^2.1.2" }, "bin": { "fxparser": "src/cli/cli.js" @@ -7523,9 +7474,9 @@ } }, "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -10949,9 +10900,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "license": "CC0-1.0", "optional": true }, @@ -11651,9 +11602,9 @@ "peer": true }, "node_modules/typechain/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", "license": "ISC", "peer": true, "dependencies": { diff --git a/package.json b/package.json index 8637371..1df3acf 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ }, "dependencies": { "@inquirer/prompts": "^5.3.8", - "@trustvc/trustvc": "^2.8.0", + "@trustvc/trustvc": "^2.9.1", "@types/yargs": "^17.0.32", "chalk": "^4.1.2", "ethers": "^6.15.0", diff --git a/src/commands/helpers.ts b/src/commands/helpers.ts index 3651da6..c052c1c 100644 --- a/src/commands/helpers.ts +++ b/src/commands/helpers.ts @@ -1,5 +1,5 @@ // External dependencies -import { BytesLike, Wallet, HDNodeWallet, ZeroAddress, Provider, Signer } from 'ethers'; +import { BytesLike, Wallet, HDNodeWallet, ZeroAddress, Provider, Signer, ethers } from 'ethers'; import signale from 'signale'; import { v5Contracts, @@ -14,7 +14,7 @@ import { encrypt } from '@trustvc/trustvc'; import { ConnectedSigner } from '../utils'; // Contract factories from TrustVC v5 -const { TitleEscrow__factory, TradeTrustToken__factory } = v5Contracts; +const { TitleEscrow__factory, TradeTrustToken__factory, TDocDeployer__factory } = v5Contracts; // Interface for connectToTokenRegistry function arguments interface ConnectToTokenRegistryArgs { @@ -22,6 +22,11 @@ interface ConnectToTokenRegistryArgs { wallet: Wallet | HDNodeWallet | ConnectedSigner | Signer; } +interface ConnectToTDocDeployerContractArgs { + tDocDeployerContractAddress: string; + wallet: Wallet | HDNodeWallet | ConnectedSigner | Signer; +} + /** * Connects to a token registry contract instance. * @@ -37,7 +42,8 @@ export const connectToTokenRegistry = async ({ try { // Connect to the token registry contract signale.info(`Connecting to token registry at: ${address}`); - const tokenRegistry = TradeTrustToken__factory.connect(address, wallet); + const tokenRegistry = new ethers.Contract(address, TradeTrustToken__factory.abi, wallet as any); + // TradeTrustToken__factory.connect(address, wallet); // Validate the connection was successful if (!tokenRegistry) { @@ -55,6 +61,40 @@ export const connectToTokenRegistry = async ({ throw error; } }; +export const connectToTDocDeployerContract = async ({ + tDocDeployerContractAddress, + wallet, +}: ConnectToTDocDeployerContractArgs): Promise> => { + try { + // Connect to the deployer contract + signale.info(`Connecting to Deployer contract at: ${tDocDeployerContractAddress}`); + + // Cast to any to handle ethers v5/v6 compatibility + // The CLI uses ethers v6 wallets but @trustvc/trustvc uses ethers v5 contract factories + const deployerContract = new ethers.Contract( + tDocDeployerContractAddress, + TDocDeployer__factory.abi, + wallet as any, + ); + // TDocDeployer__factory.connect(address, wallet as any); + + // Validate the connection was successful + if (!deployerContract) { + const error = `Failed to connect to Deployer contract at address: ${tDocDeployerContractAddress}`; + signale.error(error); + throw new Error(error); + } + + signale.success(`Successfully connected to Deployer contract`); + console.log('deployerContract', deployerContract); + return deployerContract; + } catch (error) { + signale.error( + `Error in connectToTDocDeployerContract: ${error instanceof Error ? error.message : String(error)}`, + ); + throw error; + } +}; // Interface for connectToTitleEscrow function arguments interface ConnectToTitleEscrowArgs { tokenId: string; @@ -80,7 +120,8 @@ export const connectToTitleEscrow = async ({ try { // Connect to the token registry contract signale.info(`Connecting to token registry at: ${address}`); - const tokenRegistry = TradeTrustToken__factory.connect(address, wallet); + const tokenRegistry = new ethers.Contract(address, TradeTrustToken__factory.abi, wallet as any); + // TradeTrustToken__factory.connect(address, wallet); // Fetch the title escrow address by getting the owner of the token signale.info(`Fetching title escrow address for tokenId: ${tokenId}`); @@ -96,7 +137,12 @@ export const connectToTitleEscrow = async ({ // Connect to the title escrow contract signale.info(`Connecting to title escrow at: ${titleEscrowAddress}`); - const titleEscrow = TitleEscrow__factory.connect(titleEscrowAddress, wallet); + const titleEscrow = new ethers.Contract( + titleEscrowAddress, + TitleEscrow__factory.abi, + wallet as any, + ); + // TitleEscrow__factory.connect(titleEscrowAddress, wallet); // Validate the connection was successful if (!titleEscrow) { @@ -126,7 +172,7 @@ export const connectToDocumentStore = async ({ try { // Connect to the document store contract signale.info(`Connecting to document store at: ${address}`); - const documentStore = DocumentStore__factory.connect(address, wallet); + const documentStore = DocumentStore__factory.connect(address, wallet as any); // Validate the connection was successful if (!documentStore) { @@ -149,6 +195,10 @@ export const connectToDocumentStoreFactory = async () => { return new DocumentStore__factory(); }; +export const connectToTradeTrustTokenFactory = async () => { + return new TradeTrustToken__factory(); +}; + // Interface for validateEndorseChangeOwner function arguments interface validateEndorseChangeOwnerArgs { newHolder: string; diff --git a/src/commands/title-escrow/accept-return-to-issuer.ts b/src/commands/title-escrow/accept-return-to-issuer.ts index 49a06f7..7ddc4e3 100644 --- a/src/commands/title-escrow/accept-return-to-issuer.ts +++ b/src/commands/title-escrow/accept-return-to-issuer.ts @@ -19,7 +19,7 @@ import { promptRemark, performDryRunWithConfirmation, } from '../../utils'; -import { validateAndEncryptRemark } from '../helpers'; +import { connectToTokenRegistry, validateAndEncryptRemark } from '../helpers'; const { TradeTrustToken__factory } = v5Contracts; @@ -142,10 +142,10 @@ export const acceptReturned = async ({ network, getTransactionCallback: async () => { // Connect to the token registry contract instance - const tokenRegistryInstance = await TradeTrustToken__factory.connect( - tokenRegistryAddress, + const tokenRegistryInstance = await connectToTokenRegistry({ + address: tokenRegistryAddress, wallet, - ); + }); // Validate and encrypt the remark if encryption key is provided const encryptedRemark = validateAndEncryptRemark(remark, encryptionKey); diff --git a/src/commands/title-escrow/reject-return-to-issuer.ts b/src/commands/title-escrow/reject-return-to-issuer.ts index b14b3bb..5c657f6 100644 --- a/src/commands/title-escrow/reject-return-to-issuer.ts +++ b/src/commands/title-escrow/reject-return-to-issuer.ts @@ -19,7 +19,7 @@ import { promptRemark, performDryRunWithConfirmation, } from '../../utils'; -import { validateAndEncryptRemark } from '../helpers'; +import { connectToTokenRegistry, validateAndEncryptRemark } from '../helpers'; const { TradeTrustToken__factory } = v5Contracts; @@ -143,10 +143,10 @@ export const rejectReturned = async ({ network, getTransactionCallback: async () => { // Connect to the token registry contract instance - const tokenRegistryInstance = await TradeTrustToken__factory.connect( - tokenRegistryAddress, + const tokenRegistryInstance = await connectToTokenRegistry({ + address: tokenRegistryAddress, wallet, - ); + }); // Validate and encrypt the remark if encryption key is provided const encryptedRemark = validateAndEncryptRemark(remark, encryptionKey); diff --git a/src/commands/token-registry/deploy.ts b/src/commands/token-registry/deploy.ts new file mode 100644 index 0000000..64dedff --- /dev/null +++ b/src/commands/token-registry/deploy.ts @@ -0,0 +1,256 @@ +import { error, info, success } from 'signale'; +import { CHAIN_ID, deployTokenRegistry, v5Utils, v5ContractAddress } from '@trustvc/trustvc'; +import { input, confirm } from '@inquirer/prompts'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + promptWalletSelection, + promptNetworkSelection, + getWalletOrSigner, + TransactionReceiptFees, + getSupportedNetwork, + performDryRunWithConfirmation, + promptAddress, + supportedNetwork, +} from '../../utils'; +import { + connectToTDocDeployerContract, + connectToTradeTrustTokenFactory, + waitForTransaction, +} from '../helpers'; +import { TransactionReceipt, Provider } from 'ethers'; + +export const command = 'deploy'; + +export const describe = 'Deploys a document store contract on the blockchain'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + + await deployTokenRegistryContract(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +// Define the command type +type DeployTokenRegistryCommand = { + registryName: string; + registrySymbol: string; + standalone: boolean; + factoryAddress?: string; + tokenRegistryImplAddress?: string; + deployerContractAddress?: string; + network: string; + owner: string; + encryptedWalletPath?: string; + key?: string; + keyFile?: string; + maxPriorityFeePerGasScale: number; +}; + +// Prompt user for all required inputs +export const promptForInputs = async (): Promise => { + // Network selection + const network = await promptNetworkSelection(); + + // Registry name + const registryName = await input({ + message: 'Enter the name of the token registry:', + required: true, + validate: (value: string) => { + if (!value || value.trim() === '') { + return 'Registry name is required'; + } + return true; + }, + }); + + // Registry symbol + const registrySymbol = await input({ + message: 'Enter the symbol of the token registry:', + required: true, + validate: (value: string) => { + if (!value || value.trim() === '') { + return 'Registry symbol is required'; + } + return true; + }, + }); + + // Ask if standalone or not (true = standalone, false = factory deployment) + const standalone = await confirm({ + message: 'Is this a standalone deployment?', + default: true, + }); + + // Conditionally prompt for addresses based on deployment type + let factoryAddress: string | undefined; + let tokenRegistryImplAddress: string | undefined; + let deployerContractAddress: string | undefined; + + if (standalone) { + // Standalone deployment: only ask for factory address + factoryAddress = await promptAddress('factory', 'optional', true); + } else { + // Factory deployment: ask for implementation and deployer contract addresses + tokenRegistryImplAddress = await promptAddress( + 'token registry implementation', + 'optional', + true, + ); + deployerContractAddress = await promptAddress('deployer contract', 'optional', true); + } + + // Wallet selection + const { encryptedWalletPath, key, keyFile } = await promptWalletSelection(); + + // Build the result object with proper typing + const baseResult = { + network, + registryName, + registrySymbol, + factoryAddress, + tokenRegistryImplAddress, + deployerContractAddress, + standalone, + maxPriorityFeePerGasScale: 1, + }; + + // Add wallet-specific properties based on selected wallet type + if (encryptedWalletPath) { + return { + ...baseResult, + encryptedWalletPath, + } as DeployTokenRegistryCommand; + } else if (keyFile) { + return { + ...baseResult, + keyFile, + } as DeployTokenRegistryCommand; + } else if (key) { + return { + ...baseResult, + key, + } as DeployTokenRegistryCommand; + } + + // For environment variable case (when all wallet options are undefined) + return baseResult as DeployTokenRegistryCommand; +}; + +// Deploy the document store with the provided inputs +export const deployTokenRegistryContract = async ({ + network, + registryName, + registrySymbol, + standalone, + factoryAddress, + tokenRegistryImplAddress, + deployerContractAddress, + ...rest +}: DeployTokenRegistryCommand) => { + try { + const wallet = await getWalletOrSigner({ network, ...rest }); + const chainId = supportedNetwork[network as NetworkCmdName].networkId; + + const { TitleEscrowFactory, TokenImplementation, Deployer } = v5ContractAddress; + const defaultTitleEscrowFactoryAddress = TitleEscrowFactory[chainId]; + const defaultTokenImplementationContractAddress = TokenImplementation[chainId]; + const defaultDeployerContractAddress = Deployer[chainId]; + + // Use new variables to avoid reassigning destructured parameters + const finalDeployerContractAddress = deployerContractAddress ?? defaultDeployerContractAddress; + const finalFactoryAddress = factoryAddress ?? defaultTitleEscrowFactoryAddress; + const finalTokenRegistryImplAddress = + tokenRegistryImplAddress ?? defaultTokenImplementationContractAddress; + + // Automatic dry run for Ethereum and Polygon networks + const shouldProceed = await performDryRunWithConfirmation({ + network, + getTransactionCallback: async () => { + let tx; + + if (!standalone) { + const tDocDeployer = await connectToTDocDeployerContract({ + tDocDeployerContractAddress: finalDeployerContractAddress, + wallet: wallet, + }); + const initParam = v5Utils.encodeInitParams({ + name: registryName, + symbol: registrySymbol, + deployer: await wallet.getAddress(), + }); + // Populate the transaction for gas estimation + tx = await tDocDeployer.deploy.populateTransaction( + finalTokenRegistryImplAddress, + initParam, + ); + } else { + const tradeTrustTokenFactory = await connectToTradeTrustTokenFactory(); + // Populate the transaction for gas estimation + tx = await tradeTrustTokenFactory.getDeployTransaction( + registryName, + registrySymbol, + finalFactoryAddress, + ); + } + + // Ensure the transaction has a 'from' address for proper gas estimation + return { + ...tx, + from: await wallet.getAddress(), + }; + }, + }); + + if (!shouldProceed) { + process.exit(0); + } + + info(`Deploying token registry ${registryName}`); + + const transaction = await deployTokenRegistry(registryName, registrySymbol, wallet, { + chainId: getSupportedNetwork(network).networkId as unknown as CHAIN_ID, + standalone, + factoryAddress: finalFactoryAddress, + tokenRegistryImplAddress: finalTokenRegistryImplAddress, + deployerContractAddress: finalDeployerContractAddress, + }); + + const receipt = standalone + ? transaction + : await waitForTransaction(transaction, wallet.provider as Provider); + + displayTransactionPrice(receipt, network as NetworkCmdName); + + const { hash } = receipt as unknown as TransactionReceipt; + let contractAddress = receipt.contractAddress; + // Extract the deployed token registry address from the logs + // When a contract is deployed via factory, the first logs are emitted by the newly deployed contract + // during its initialization. The first log's address is the deployed contract address. + if (!contractAddress) { + if (receipt.logs && receipt.logs.length > 0) { + // Get the address from the first log - this is the deployed contract + contractAddress = receipt.logs[0].address; + } + } + + if (!contractAddress) { + error('Failed to extract deployed token registry address from transaction receipt'); + return null; + } + + success(`Token registry ${registryName} deployed at ${contractAddress}`); + info(`Find more details at ${getEtherscanAddress({ network: network })}/tx/${hash}`); + + return contractAddress; + } catch (e) { + console.log(e); + error(getErrorMessage(e)); + } +}; diff --git a/src/utils/cli-options.ts b/src/utils/cli-options.ts index cb75c78..2b68576 100644 --- a/src/utils/cli-options.ts +++ b/src/utils/cli-options.ts @@ -485,7 +485,11 @@ export const promptRemark = async (registryVersion: string): Promise => { +export const promptAddress = async ( + role: string, + description?: string, + optional?: boolean, +): Promise => { const roleCapitalized = role.charAt(0).toUpperCase() + role.slice(1); const messageText = description ? `Enter the address of the ${role} (${description}):` @@ -493,9 +497,11 @@ export const promptAddress = async (role: string, description?: string): Promise const address = await input({ message: messageText, - required: true, + required: optional ? false : true, validate: (value: string) => { - if (!value || value.trim() === '') { + if (optional && (!value || value.trim() === '')) { + return true; + } else if (!value || value.trim() === '') { return `${roleCapitalized} address is required`; } if (!/^0x[a-fA-F0-9]{40}$/.test(value)) { @@ -505,6 +511,11 @@ export const promptAddress = async (role: string, description?: string): Promise }, }); + // Return undefined for empty strings when optional + if (optional && (!address || address.trim() === '')) { + return undefined; + } + return address; }; diff --git a/tests/commands/token-registry/deploy.test.ts b/tests/commands/token-registry/deploy.test.ts new file mode 100644 index 0000000..9f19718 --- /dev/null +++ b/tests/commands/token-registry/deploy.test.ts @@ -0,0 +1,685 @@ +import { TransactionReceipt } from 'ethers'; +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + handler, + deployTokenRegistryContract, + promptForInputs, +} from '../../../src/commands/token-registry/deploy'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + }; +}); + +vi.mock('@inquirer/prompts', () => ({ + select: vi.fn(), + input: vi.fn(), + confirm: vi.fn(), + password: vi.fn(), +})); + +vi.mock('@trustvc/trustvc', () => ({ + deployTokenRegistry: vi.fn(), + v5Contracts: { + TitleEscrow__factory: {}, + TradeTrustToken__factory: {}, + }, + v5ContractAddress: { + TitleEscrowFactory: { + 1: '0xFactoryMainnet', + 11155111: '0xFactorySepolia', + 137: '0xFactoryMatic', + }, + TokenImplementation: { + 1: '0xTokenImplMainnet', + 11155111: '0xTokenImplSepolia', + 137: '0xTokenImplMatic', + }, + Deployer: { + 1: '0xDeployerMainnet', + 11155111: '0xDeployerSepolia', + 137: '0xDeployerMatic', + }, + }, + v5Utils: { + encodeInitParams: vi.fn(() => '0xencodedparams'), + }, + checkSupportsInterface: vi.fn(), + v4SupportInterfaceIds: {}, + v5SupportInterfaceIds: {}, + encrypt: vi.fn(), + SUPPORTED_CHAINS: { + 1: { + name: 'mainnet', + explorerUrl: 'https://etherscan.io', + rpcUrl: 'https://mainnet.infura.io/v3/test', + nativeCurrency: { symbol: 'ETH', decimals: 18 }, + }, + 11155111: { + name: 'sepolia', + explorerUrl: 'https://sepolia.etherscan.io', + rpcUrl: 'https://sepolia.infura.io/v3/test', + nativeCurrency: { symbol: 'ETH', decimals: 18 }, + }, + 137: { + name: 'matic', + explorerUrl: 'https://polygonscan.com', + rpcUrl: 'https://polygon-mainnet.infura.io/v3/test', + nativeCurrency: { symbol: 'MATIC', decimals: 18 }, + }, + }, + CHAIN_ID: { + mainnet: 1, + sepolia: 11155111, + matic: 137, + }, +})); + +vi.mock('../../../src/utils/wallet', () => ({ + getWalletOrSigner: vi.fn(), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const originalUtils = await importOriginal(); + return { + ...originalUtils, + getErrorMessage: vi.fn((e: any) => (e instanceof Error ? e.message : String(e))), + getEtherscanAddress: vi.fn(() => 'https://etherscan.io'), + displayTransactionPrice: vi.fn(), + getSupportedNetwork: vi.fn((network: string) => ({ + networkId: network === 'sepolia' ? 11155111 : network === 'matic' ? 137 : 1, + })), + supportedNetwork: { + mainnet: { networkId: 1 }, + sepolia: { networkId: 11155111 }, + matic: { networkId: 137 }, + }, + promptNetworkSelection: vi.fn(), + promptAddress: vi.fn(), + promptWalletSelection: vi.fn(), + performDryRunWithConfirmation: vi.fn(async () => true), + }; +}); + +vi.mock('../../../src/commands/helpers', () => ({ + connectToTDocDeployerContract: vi.fn(async () => ({ + deploy: { + populateTransaction: vi.fn(), + }, + })), + connectToTradeTrustTokenFactory: vi.fn(async () => ({ + getDeployTransaction: vi.fn(), + })), + waitForTransaction: vi.fn(), +})); + +describe('token-registry/deploy', () => { + beforeEach(() => { + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + describe('promptForInputs', () => { + beforeEach(() => { + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it('should return correct answers for standalone deployment with encrypted wallet', async () => { + const mockInputs = { + registryName: 'Test Token Registry', + registrySymbol: 'TTR', + standalone: true, + factoryAddress: '0x1234567890123456789012345678901234567890', + network: NetworkCmdName.Sepolia, + }; + + const utils = await import('../../../src/utils'); + (utils.promptNetworkSelection as any).mockResolvedValue(mockInputs.network); + + const inquirer = await import('@inquirer/prompts'); + (inquirer.input as any) + .mockResolvedValueOnce(mockInputs.registryName) + .mockResolvedValueOnce(mockInputs.registrySymbol); + (inquirer.confirm as any).mockResolvedValue(true); + + (utils.promptAddress as any).mockResolvedValue(mockInputs.factoryAddress); + (utils.promptWalletSelection as any).mockResolvedValue({ + encryptedWalletPath: './wallet.json', + }); + + const result = await promptForInputs(); + + expect(result.registryName).toBe(mockInputs.registryName); + expect(result.registrySymbol).toBe(mockInputs.registrySymbol); + expect(result.standalone).toBe(true); + expect(result.factoryAddress).toBe(mockInputs.factoryAddress); + expect(result.network).toBe(NetworkCmdName.Sepolia); + expect(result.maxPriorityFeePerGasScale).toBe(1); + expect((result as any).encryptedWalletPath).toBe('./wallet.json'); + }); + + it('should return correct answers for factory deployment with implementation addresses', async () => { + const mockInputs = { + registryName: 'Factory Token Registry', + registrySymbol: 'FTR', + standalone: false, + tokenRegistryImplAddress: '0x1111111111111111111111111111111111111111', + deployerContractAddress: '0x2222222222222222222222222222222222222222', + network: NetworkCmdName.Mainnet, + }; + + const utils = await import('../../../src/utils'); + (utils.promptNetworkSelection as any).mockResolvedValue(mockInputs.network); + + const inquirer = await import('@inquirer/prompts'); + (inquirer.input as any) + .mockResolvedValueOnce(mockInputs.registryName) + .mockResolvedValueOnce(mockInputs.registrySymbol); + (inquirer.confirm as any).mockResolvedValue(false); + + (utils.promptAddress as any) + .mockResolvedValueOnce(mockInputs.tokenRegistryImplAddress) + .mockResolvedValueOnce(mockInputs.deployerContractAddress); + (utils.promptWalletSelection as any).mockResolvedValue({ + keyFile: './private-key.txt', + }); + + const result = await promptForInputs(); + + expect(result.registryName).toBe(mockInputs.registryName); + expect(result.registrySymbol).toBe(mockInputs.registrySymbol); + expect(result.standalone).toBe(false); + expect(result.tokenRegistryImplAddress).toBe(mockInputs.tokenRegistryImplAddress); + expect(result.deployerContractAddress).toBe(mockInputs.deployerContractAddress); + expect((result as any).keyFile).toBe('./private-key.txt'); + }); + + it('should return correct answers with direct private key', async () => { + const mockInputs = { + registryName: 'Key Token Registry', + registrySymbol: 'KTR', + standalone: true, + network: NetworkCmdName.Matic, + }; + + const utils = await import('../../../src/utils'); + (utils.promptNetworkSelection as any).mockResolvedValue(mockInputs.network); + + const inquirer = await import('@inquirer/prompts'); + (inquirer.input as any) + .mockResolvedValueOnce(mockInputs.registryName) + .mockResolvedValueOnce(mockInputs.registrySymbol); + (inquirer.confirm as any).mockResolvedValue(true); + + (utils.promptAddress as any).mockResolvedValue(undefined); + (utils.promptWalletSelection as any).mockResolvedValue({ + key: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', + }); + + const result = await promptForInputs(); + + expect(result.registryName).toBe(mockInputs.registryName); + expect((result as any).key).toBe('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'); + }); + + it('should validate registry name is required', async () => { + const utils = await import('../../../src/utils'); + (utils.promptNetworkSelection as any).mockResolvedValue(NetworkCmdName.Sepolia); + + const inquirer = await import('@inquirer/prompts'); + const inputMock = inquirer.input as any; + + let callCount = 0; + // Test the validation function + inputMock.mockImplementation(async ({ validate }: any) => { + callCount++; + if (callCount === 1) { + const validationResult = validate(''); + expect(validationResult).toBe('Registry name is required'); + return 'Valid Name'; + } + return 'SYMBOL'; + }); + + (inquirer.confirm as any).mockResolvedValue(true); + (utils.promptAddress as any).mockResolvedValue(undefined); + (utils.promptWalletSelection as any).mockResolvedValue({ key: '0xkey' }); + + await promptForInputs(); + }); + + it('should validate registry symbol is required', async () => { + const utils = await import('../../../src/utils'); + (utils.promptNetworkSelection as any).mockResolvedValue(NetworkCmdName.Sepolia); + + const inquirer = await import('@inquirer/prompts'); + const inputMock = inquirer.input as any; + + let callCount = 0; + inputMock.mockImplementation(async ({ validate }: any) => { + callCount++; + if (callCount === 1) { + return 'Registry Name'; + } + // Second call is for symbol + const validationResult = validate(' '); + expect(validationResult).toBe('Registry symbol is required'); + return 'SYMBOL'; + }); + + (inquirer.confirm as any).mockResolvedValue(true); + (utils.promptAddress as any).mockResolvedValue(undefined); + (utils.promptWalletSelection as any).mockResolvedValue({ key: '0xkey' }); + + await promptForInputs(); + }); + }); + + describe('deployTokenRegistryContract', () => { + let deployTokenRegistryMock: MockedFunction; + let getWalletOrSignerMock: MockedFunction; + let waitForTransactionMock: MockedFunction; + + beforeEach(async () => { + vi.clearAllMocks(); + + const trustvcModule = await import('@trustvc/trustvc'); + deployTokenRegistryMock = trustvcModule.deployTokenRegistry as MockedFunction; + + const walletModule = await import('../../../src/utils/wallet'); + getWalletOrSignerMock = walletModule.getWalletOrSigner as MockedFunction; + + const helpersModule = await import('../../../src/commands/helpers'); + waitForTransactionMock = helpersModule.waitForTransaction as MockedFunction; + + // Setup wallet mock + getWalletOrSignerMock.mockResolvedValue({ + provider: {}, + getAddress: vi.fn().mockResolvedValue('0xsigner'), + }); + + // Re-setup performDryRunWithConfirmation to always return true (proceed) + const utils = await import('../../../src/utils'); + (utils.performDryRunWithConfirmation as any).mockResolvedValue(true); + (utils.getSupportedNetwork as any).mockImplementation((network: string) => ({ + networkId: network === 'sepolia' ? 11155111 : network === 'matic' ? 137 : 1, + })); + }); + + it('should successfully deploy standalone token registry', async () => { + const mockArgs: any = { + registryName: 'Test Registry', + registrySymbol: 'TEST', + standalone: true, + factoryAddress: '0x1234567890123456789012345678901234567890', + network: NetworkCmdName.Sepolia, + maxPriorityFeePerGasScale: 1, + }; + + const mockReceipt = { + hash: '0xtxhash123', + contractAddress: '0xdeployedcontract', + blockNumber: 12345, + gasUsed: BigInt(100000), + logs: [], + }; + + deployTokenRegistryMock.mockResolvedValue(mockReceipt); + + const result = await deployTokenRegistryContract(mockArgs); + + expect(deployTokenRegistryMock).toHaveBeenCalledWith( + mockArgs.registryName, + mockArgs.registrySymbol, + expect.anything(), + expect.objectContaining({ + chainId: 11155111, + standalone: true, + factoryAddress: mockArgs.factoryAddress, + }), + ); + expect(result).toBe(mockReceipt.contractAddress); + }); + + it('should successfully deploy factory-based token registry', async () => { + const mockArgs: any = { + registryName: 'Factory Registry', + registrySymbol: 'FACT', + standalone: false, + tokenRegistryImplAddress: '0x1111111111111111111111111111111111111111', + deployerContractAddress: '0x2222222222222222222222222222222222222222', + network: NetworkCmdName.Sepolia, + maxPriorityFeePerGasScale: 1, + }; + + const mockTransaction = { + hash: '0xtxhash456', + wait: vi.fn().mockResolvedValue({ + hash: '0xtxhash456', + blockNumber: 12346, + }), + }; + + const mockReceipt = { + hash: '0xtxhash456', + contractAddress: null, + blockNumber: 12346, + gasUsed: BigInt(200000), + logs: [ + { + address: '0xdeployedviaFactory', + topics: [], + data: '0x', + }, + ], + }; + + deployTokenRegistryMock.mockResolvedValue(mockTransaction); + waitForTransactionMock.mockResolvedValue(mockReceipt); + + const result = await deployTokenRegistryContract(mockArgs); + + expect(deployTokenRegistryMock).toHaveBeenCalledWith( + mockArgs.registryName, + mockArgs.registrySymbol, + expect.anything(), + expect.objectContaining({ + chainId: 11155111, + standalone: false, + tokenRegistryImplAddress: mockArgs.tokenRegistryImplAddress, + deployerContractAddress: mockArgs.deployerContractAddress, + }), + ); + expect(waitForTransactionMock).toHaveBeenCalled(); + expect(result).toBe('0xdeployedviaFactory'); + }); + + it('should use default addresses when not provided', async () => { + const mockArgs: any = { + registryName: 'Default Registry', + registrySymbol: 'DEF', + standalone: true, + network: NetworkCmdName.Sepolia, + maxPriorityFeePerGasScale: 1, + }; + + const mockReceipt = { + hash: '0xtxhash789', + contractAddress: '0xdefaultdeployed', + blockNumber: 12347, + gasUsed: BigInt(150000), + logs: [], + }; + + deployTokenRegistryMock.mockResolvedValue(mockReceipt); + + const result = await deployTokenRegistryContract(mockArgs); + + expect(deployTokenRegistryMock).toHaveBeenCalledWith( + mockArgs.registryName, + mockArgs.registrySymbol, + expect.anything(), + expect.objectContaining({ + factoryAddress: '0xFactorySepolia', + tokenRegistryImplAddress: '0xTokenImplSepolia', + deployerContractAddress: '0xDeployerSepolia', + }), + ); + expect(result).toBe(mockReceipt.contractAddress); + }); + + it('should handle errors during deployment', async () => { + const mockArgs: any = { + registryName: 'Error Registry', + registrySymbol: 'ERR', + standalone: true, + network: NetworkCmdName.Sepolia, + maxPriorityFeePerGasScale: 1, + }; + + const errorMessage = 'Deployment failed: insufficient funds'; + deployTokenRegistryMock.mockRejectedValue(new Error(errorMessage)); + + const result = await deployTokenRegistryContract(mockArgs); + + expect(result).toBeUndefined(); + expect(deployTokenRegistryMock).toHaveBeenCalled(); + }); + + it('should handle missing contract address in receipt', async () => { + const mockArgs: any = { + registryName: 'No Address Registry', + registrySymbol: 'NAR', + standalone: true, + network: NetworkCmdName.Sepolia, + maxPriorityFeePerGasScale: 1, + }; + + const mockReceipt = { + hash: '0xtxhash999', + contractAddress: null, + blockNumber: 12348, + gasUsed: BigInt(100000), + logs: [], + }; + + deployTokenRegistryMock.mockResolvedValue(mockReceipt); + + const result = await deployTokenRegistryContract(mockArgs); + + expect(result).toBeNull(); + }); + + it('should exit when dry run is not confirmed', async () => { + const mockArgs: any = { + registryName: 'Cancelled Registry', + registrySymbol: 'CAN', + standalone: true, + network: NetworkCmdName.Sepolia, + maxPriorityFeePerGasScale: 1, + }; + + const utils = await import('../../../src/utils'); + (utils.performDryRunWithConfirmation as any).mockResolvedValueOnce(false); + + const exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => {}) as any); + + await deployTokenRegistryContract(mockArgs); + + expect(exitSpy).toHaveBeenCalledWith(0); + + exitSpy.mockRestore(); + + // Reset the mock back to true for other tests + (utils.performDryRunWithConfirmation as any).mockResolvedValue(true); + }); + + it('should handle dry run transaction population for standalone deployment', async () => { + const mockArgs: any = { + registryName: 'Dry Run Registry', + registrySymbol: 'DRY', + standalone: true, + network: NetworkCmdName.Sepolia, + maxPriorityFeePerGasScale: 1, + }; + + const utils = await import('../../../src/utils'); + let capturedCallback: any; + (utils.performDryRunWithConfirmation as any).mockImplementation(async ({ getTransactionCallback }: any) => { + capturedCallback = getTransactionCallback; + return true; + }); + + const helpersModule = await import('../../../src/commands/helpers'); + const mockFactory = { + getDeployTransaction: vi.fn().mockResolvedValue({ + to: '0xfactory', + data: '0xdata', + }), + }; + (helpersModule.connectToTradeTrustTokenFactory as any).mockResolvedValue(mockFactory); + + const mockReceipt = { + hash: '0xtxhash', + contractAddress: '0xdeployed', + logs: [], + }; + deployTokenRegistryMock.mockResolvedValue(mockReceipt); + + await deployTokenRegistryContract(mockArgs); + + expect(capturedCallback).toBeDefined(); + if (capturedCallback) { + const tx = await capturedCallback(); + expect(tx.from).toBe('0xsigner'); + } + }); + + it('should handle dry run transaction population for factory deployment', async () => { + const mockArgs: any = { + registryName: 'Factory Dry Run', + registrySymbol: 'FDR', + standalone: false, + tokenRegistryImplAddress: '0x1111111111111111111111111111111111111111', + deployerContractAddress: '0x2222222222222222222222222222222222222222', + network: NetworkCmdName.Sepolia, + maxPriorityFeePerGasScale: 1, + }; + + const utils = await import('../../../src/utils'); + let capturedCallback: any; + (utils.performDryRunWithConfirmation as any).mockImplementation(async ({ getTransactionCallback }: any) => { + capturedCallback = getTransactionCallback; + return true; + }); + + const helpersModule = await import('../../../src/commands/helpers'); + const mockDeployer = { + deploy: { + populateTransaction: vi.fn().mockResolvedValue({ + to: '0xdeployer', + data: '0xdata', + }), + }, + }; + (helpersModule.connectToTDocDeployerContract as any).mockResolvedValue(mockDeployer); + + const mockTransaction = { hash: '0xtx' }; + const mockReceipt = { + hash: '0xtx', + contractAddress: null, + logs: [{ address: '0xdeployed' }], + }; + deployTokenRegistryMock.mockResolvedValue(mockTransaction); + waitForTransactionMock.mockResolvedValue(mockReceipt); + + await deployTokenRegistryContract(mockArgs); + + expect(capturedCallback).toBeDefined(); + if (capturedCallback) { + const tx = await capturedCallback(); + expect(tx.from).toBe('0xsigner'); + } + }); + }); + + describe('handler', () => { + beforeEach(() => { + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it('should successfully execute the complete deployment flow', async () => { + const mockInputs: any = { + network: NetworkCmdName.Sepolia, + registryName: 'Handler Registry', + registrySymbol: 'HDL', + standalone: true, + factoryAddress: '0x1234567890123456789012345678901234567890', + encryptedWalletPath: './wallet.json', + maxPriorityFeePerGasScale: 1, + }; + + const utils = await import('../../../src/utils'); + (utils.promptNetworkSelection as any).mockResolvedValue(mockInputs.network); + + const inquirer = await import('@inquirer/prompts'); + (inquirer.input as any) + .mockResolvedValueOnce(mockInputs.registryName) + .mockResolvedValueOnce(mockInputs.registrySymbol); + (inquirer.confirm as any).mockResolvedValue(true); + + (utils.promptAddress as any).mockResolvedValue(mockInputs.factoryAddress); + (utils.promptWalletSelection as any).mockResolvedValue({ + encryptedWalletPath: mockInputs.encryptedWalletPath, + }); + + const trustvcModule = await import('@trustvc/trustvc'); + const deployMock = trustvcModule.deployTokenRegistry as MockedFunction; + deployMock.mockResolvedValue({ + hash: '0xtxhash', + contractAddress: '0xdeployed', + logs: [], + }); + + const walletModule = await import('../../../src/utils/wallet'); + const getWalletOrSignerMock = walletModule.getWalletOrSigner as MockedFunction; + getWalletOrSignerMock.mockResolvedValue({ + provider: {}, + getAddress: vi.fn().mockResolvedValue('0xsigner'), + }); + + const result = await handler(); + + expect(result).toBeUndefined(); + }); + + it('should handle errors in handler', async () => { + const errorMessage = 'Network selection error'; + const utils = await import('../../../src/utils'); + (utils.promptNetworkSelection as any).mockRejectedValue(new Error(errorMessage)); + + await handler(); + + const signaleModule = await import('signale'); + expect(signaleModule.error).toHaveBeenCalledWith(errorMessage); + }); + + it('should handle non-Error exceptions in handler', async () => { + const errorMessage = 'String error'; + const utils = await import('../../../src/utils'); + (utils.promptNetworkSelection as any).mockRejectedValue(errorMessage); + + await handler(); + + const signaleModule = await import('signale'); + expect(signaleModule.error).toHaveBeenCalledWith(errorMessage); + }); + + it('should return early if promptForInputs returns falsy value', async () => { + const utils = await import('../../../src/utils'); + (utils.promptNetworkSelection as any).mockResolvedValue(null); + + const trustvcModule = await import('@trustvc/trustvc'); + const deployMock = trustvcModule.deployTokenRegistry as MockedFunction; + + await handler(); + + expect(deployMock).not.toHaveBeenCalled(); + }); + }); +}); From 0b81826b2f81e7a1b5aa26ff4c75ed7f51ab580e Mon Sep 17 00:00:00 2001 From: Rishabh Singh Date: Wed, 25 Feb 2026 17:06:25 +0530 Subject: [PATCH 2/5] fix: lint --- .../title-escrow/accept-return-to-issuer.ts | 2 -- .../title-escrow/reject-return-to-issuer.ts | 4 +-- src/commands/token-registry/deploy.ts | 1 - tests/commands/token-registry/deploy.test.ts | 27 +++++++++++-------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/commands/title-escrow/accept-return-to-issuer.ts b/src/commands/title-escrow/accept-return-to-issuer.ts index 7ddc4e3..ed224cb 100644 --- a/src/commands/title-escrow/accept-return-to-issuer.ts +++ b/src/commands/title-escrow/accept-return-to-issuer.ts @@ -21,8 +21,6 @@ import { } from '../../utils'; import { connectToTokenRegistry, validateAndEncryptRemark } from '../helpers'; -const { TradeTrustToken__factory } = v5Contracts; - export const command = 'accept-return-to-issuer'; export const describe = 'Accepts a returned transferable record on the blockchain'; diff --git a/src/commands/title-escrow/reject-return-to-issuer.ts b/src/commands/title-escrow/reject-return-to-issuer.ts index 5c657f6..d75ddce 100644 --- a/src/commands/title-escrow/reject-return-to-issuer.ts +++ b/src/commands/title-escrow/reject-return-to-issuer.ts @@ -1,7 +1,7 @@ import { error, success, info } from 'signale'; import signale from 'signale'; import { TransactionReceipt } from 'ethers'; -import { v5Contracts, CHAIN_ID, rejectReturned as rejectReturnedImpl } from '@trustvc/trustvc'; +import { CHAIN_ID, rejectReturned as rejectReturnedImpl } from '@trustvc/trustvc'; import { BaseTitleEscrowCommand as TitleEscrowReturnDocumentCommand } from '../../types'; import { displayTransactionPrice, @@ -21,8 +21,6 @@ import { } from '../../utils'; import { connectToTokenRegistry, validateAndEncryptRemark } from '../helpers'; -const { TradeTrustToken__factory } = v5Contracts; - export const command = 'reject-return-to-issuer'; export const describe = 'Rejects a returned transferable record on the blockchain'; diff --git a/src/commands/token-registry/deploy.ts b/src/commands/token-registry/deploy.ts index 64dedff..1cef3ff 100644 --- a/src/commands/token-registry/deploy.ts +++ b/src/commands/token-registry/deploy.ts @@ -9,7 +9,6 @@ import { promptWalletSelection, promptNetworkSelection, getWalletOrSigner, - TransactionReceiptFees, getSupportedNetwork, performDryRunWithConfirmation, promptAddress, diff --git a/tests/commands/token-registry/deploy.test.ts b/tests/commands/token-registry/deploy.test.ts index 9f19718..b05a15d 100644 --- a/tests/commands/token-registry/deploy.test.ts +++ b/tests/commands/token-registry/deploy.test.ts @@ -1,4 +1,3 @@ -import { TransactionReceipt } from 'ethers'; import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; import { handler, @@ -233,7 +232,9 @@ describe('token-registry/deploy', () => { const result = await promptForInputs(); expect(result.registryName).toBe(mockInputs.registryName); - expect((result as any).key).toBe('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'); + expect((result as any).key).toBe( + '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', + ); }); it('should validate registry name is required', async () => { @@ -503,7 +504,7 @@ describe('token-registry/deploy', () => { expect(exitSpy).toHaveBeenCalledWith(0); exitSpy.mockRestore(); - + // Reset the mock back to true for other tests (utils.performDryRunWithConfirmation as any).mockResolvedValue(true); }); @@ -519,10 +520,12 @@ describe('token-registry/deploy', () => { const utils = await import('../../../src/utils'); let capturedCallback: any; - (utils.performDryRunWithConfirmation as any).mockImplementation(async ({ getTransactionCallback }: any) => { - capturedCallback = getTransactionCallback; - return true; - }); + (utils.performDryRunWithConfirmation as any).mockImplementation( + async ({ getTransactionCallback }: any) => { + capturedCallback = getTransactionCallback; + return true; + }, + ); const helpersModule = await import('../../../src/commands/helpers'); const mockFactory = { @@ -562,10 +565,12 @@ describe('token-registry/deploy', () => { const utils = await import('../../../src/utils'); let capturedCallback: any; - (utils.performDryRunWithConfirmation as any).mockImplementation(async ({ getTransactionCallback }: any) => { - capturedCallback = getTransactionCallback; - return true; - }); + (utils.performDryRunWithConfirmation as any).mockImplementation( + async ({ getTransactionCallback }: any) => { + capturedCallback = getTransactionCallback; + return true; + }, + ); const helpersModule = await import('../../../src/commands/helpers'); const mockDeployer = { From 4a52024bc4ee5b5af6ad453fa150310b3f75d496 Mon Sep 17 00:00:00 2001 From: Rishabh Singh Date: Wed, 25 Feb 2026 17:10:08 +0530 Subject: [PATCH 3/5] fix: lint --- src/commands/title-escrow/accept-return-to-issuer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/title-escrow/accept-return-to-issuer.ts b/src/commands/title-escrow/accept-return-to-issuer.ts index ed224cb..8098f53 100644 --- a/src/commands/title-escrow/accept-return-to-issuer.ts +++ b/src/commands/title-escrow/accept-return-to-issuer.ts @@ -1,7 +1,7 @@ import { error, success, info } from 'signale'; import signale from 'signale'; import { TransactionReceipt } from 'ethers'; -import { v5Contracts, CHAIN_ID, acceptReturned as acceptReturnedImpl } from '@trustvc/trustvc'; +import { CHAIN_ID, acceptReturned as acceptReturnedImpl } from '@trustvc/trustvc'; import { BaseTitleEscrowCommand as TitleEscrowReturnDocumentCommand } from '../../types'; import { displayTransactionPrice, From 66e55aab621d3613c806eefc53775fa0df1be1a5 Mon Sep 17 00:00:00 2001 From: Rishabh Singh Date: Thu, 26 Feb 2026 08:15:40 +0530 Subject: [PATCH 4/5] fix: update readme --- README.md | 36 +++++++++++++++++++++++++++++++++++- src/commands/helpers.ts | 1 - 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a0298ab..a540185 100644 --- a/README.md +++ b/README.md @@ -197,7 +197,8 @@ trustvc title-escrow reject-transfer-owner-holder | | [`verify`](#verify) | Verify OpenAttestation documents | | | [`oa-wrap`](#oa-wrap) | Wrap OpenAttestation documents | | | [`oa-unwrap`](#oa-unwrap) | Unwrap OpenAttestation documents | -| **Token Registry** | [`mint`](#mint) | Mint tokens to blockchain registries | +| **Token Registry** | [`token-registry deploy`](#token-registry-deploy) | Deploy token registry contracts | +| | [`mint`](#mint) | Mint tokens to blockchain registries | | | `token-registry mint` | Alternative: `mint` | | **Document Store** | [`document-store deploy`](#document-store-deploy) | Deploy document store contracts | | | [`document-store issue`](#document-store-issue) | Issue document hashes | @@ -508,6 +509,38 @@ Transaction receipt with hash, block number, gas used, and explorer link. +
+

token-registry deploy

+ +Deploys a token registry contract on the blockchain. + +**Usage:** + +```sh +trustvc token-registry deploy +``` + +**Interactive Prompts:** + +- Network selection (Ethereum, Polygon, XDC, Stability, Astron) +- Token registry name +- Token registry symbol +- Wallet/private key option +- Dry-run option (estimate gas before deployment) + +**Output:** +Transaction receipt with deployed contract address, hash, block number, gas used, and explorer link. + +**Supported Networks:** + +- Ethereum (Mainnet, Sepolia) +- Polygon (Mainnet, Amoy Testnet) +- XDC Network (Mainnet, Apothem Testnet) +- Stability (Mainnet, Testnet) +- Astron (Mainnet, Testnet) + +
+

token-registry mint

@@ -1126,6 +1159,7 @@ src/commands/ │ └── wrap.ts # Wrap OpenAttestation documents │ └── unwrap.ts # Unwrap OpenAttestation documents ├── token-registry/ +│ ├── deploy.ts # Deploy token registry contracts │ └── mint.ts # Mint tokens to registry ├── document-store/ │ ├── deploy.ts # Deploy document store contracts diff --git a/src/commands/helpers.ts b/src/commands/helpers.ts index c052c1c..b11785e 100644 --- a/src/commands/helpers.ts +++ b/src/commands/helpers.ts @@ -86,7 +86,6 @@ export const connectToTDocDeployerContract = async ({ } signale.success(`Successfully connected to Deployer contract`); - console.log('deployerContract', deployerContract); return deployerContract; } catch (error) { signale.error( From 3c6aa792e0ff1913c4c260dfadfa9ce577a34bd6 Mon Sep 17 00:00:00 2001 From: Rishabh Singh Date: Thu, 26 Feb 2026 08:23:39 +0530 Subject: [PATCH 5/5] fix: update readme --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a540185..425c11c 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,9 @@ trustvc document-store revoke # Mint a token to a registry trustvc mint +# Deploy a token registry contract +trustvc token-registry deploy + # Transfer document holder trustvc title-escrow transfer-holder @@ -175,9 +178,9 @@ trustvc title-escrow reject-transfer-owner-holder ### Blockchain Operations -- **Token Registry**: Uses `mint` to mint document hashes (tokenIds) to blockchain-based token registries across multiple networks (Ethereum, Polygon, XDC, Stability, Astron). +- **Token Registry**: Deploy token registry contracts and mint document hashes (tokenIds) to blockchain-based token registries across multiple networks (Ethereum, Polygon, XDC, Stability, Astron). -- **Document Store**: Uses `documentStoreIssue` and `documentStoreRevoke` to issue and revoke document hashes in deployed document store contracts. +- **Document Store**: Deploy document store contracts and use `documentStoreIssue` and `documentStoreRevoke` to issue and revoke document hashes in deployed contracts. - **Title Escrow**: Provides comprehensive transferable records management including holder transfers, beneficiary nominations, endorsements, returns, and rejections using smart contracts.