diff --git a/.gitignore b/.gitignore index b4636bd..4d9dfb1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,11 +2,13 @@ lib-cov *.seed *.log *.csv +*.tsv *.dat *.out *.pid *.gz *.swp +*.bak pids logs diff --git a/package-lock.json b/package-lock.json index 14f784e..5ef6cd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,14 @@ "license": "ISC", "dependencies": { "@hirosystems/api-toolkit": "^1.3.3", + "@scure/btc-signer": "^1.2.1", "@sinclair/typebox": "^0.32.12", "@stacks/blockchain-api-client": "^7.8.1", - "@stacks/network": "^6.10.0", - "@stacks/transactions": "^6.11.2", + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", + "@stacks/stacking": "^6.13.0", + "@stacks/transactions": "^6.13.0", + "@stacks/wallet-sdk": "^6.13.0", "@types/node": "^20.11.5", "env-schema": "^5.2.1" }, @@ -48,13 +52,13 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -73,77 +77,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", @@ -154,9 +87,9 @@ } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -164,11 +97,11 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -183,27 +116,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", @@ -235,30 +147,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -325,9 +213,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -385,14 +273,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -412,81 +300,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -673,23 +490,23 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -698,8 +515,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -707,19 +524,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -737,16 +545,16 @@ "dev": true }, "node_modules/@commitlint/cli": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-18.4.4.tgz", - "integrity": "sha512-Ro3wIo//fV3XiV1EkdpHog6huaEyNcUAVrSmtgKqYM5g982wOWmP4FXvEDFwRMVgz878CNBvvCc33dMZ5AQJ/g==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-18.6.1.tgz", + "integrity": "sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw==", "dev": true, "dependencies": { - "@commitlint/format": "^18.4.4", - "@commitlint/lint": "^18.4.4", - "@commitlint/load": "^18.4.4", - "@commitlint/read": "^18.4.4", - "@commitlint/types": "^18.4.4", + "@commitlint/format": "^18.6.1", + "@commitlint/lint": "^18.6.1", + "@commitlint/load": "^18.6.1", + "@commitlint/read": "^18.6.1", + "@commitlint/types": "^18.6.1", "execa": "^5.0.0", "lodash.isfunction": "^3.0.9", "resolve-from": "5.0.0", @@ -760,21 +568,13 @@ "node": ">=v18" } }, - "node_modules/@commitlint/cli/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@commitlint/config-conventional": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-18.4.4.tgz", - "integrity": "sha512-Bz3sPQSboBN+Et/KyZrR+OJ3z9PrHDw7Bls0/hv94PmuHBtMq1dCGxS9XzTGzxeMNlytCC4kxF083tbhPljl3Q==", + "version": "18.6.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-18.6.3.tgz", + "integrity": "sha512-8ZrRHqF6je+TRaFoJVwszwnOXb/VeYrPmTwPhf0WxpzpGTcYy1p0SPyZ2eRn/sRi/obnWAcobtDAq6+gJQQNhQ==", "dev": true, "dependencies": { + "@commitlint/types": "^18.6.1", "conventional-changelog-conventionalcommits": "^7.0.2" }, "engines": { @@ -782,47 +582,25 @@ } }, "node_modules/@commitlint/config-validator": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-18.4.4.tgz", - "integrity": "sha512-/QI8KIg/h7O0Eus36fPcEcO3QPBcdXuGfZeCF5m15k0EB2bcU8s6pHNTNEa6xz9PrAefHCL+yzRJj7w20T6Mow==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-18.6.1.tgz", + "integrity": "sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==", "dev": true, "dependencies": { - "@commitlint/types": "^18.4.4", + "@commitlint/types": "^18.6.1", "ajv": "^8.11.0" }, "engines": { "node": ">=v18" } }, - "node_modules/@commitlint/config-validator/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/@commitlint/ensure": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-18.4.4.tgz", - "integrity": "sha512-KjD19p6julB5WrQL+Cd8p+AePwpl1XzGAjB0jnuFMKWtji9L7ucCZUKDstGjlkBZGGzH/nvdB8K+bh5K27EVUg==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-18.6.1.tgz", + "integrity": "sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ==", "dev": true, "dependencies": { - "@commitlint/types": "^18.4.4", + "@commitlint/types": "^18.6.1", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", @@ -834,102 +612,266 @@ } }, "node_modules/@commitlint/execute-rule": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-18.4.4.tgz", - "integrity": "sha512-a37Nd3bDQydtg9PCLLWM9ZC+GO7X5i4zJvrggJv5jBhaHsXeQ9ZWdO6ODYR+f0LxBXXNYK3geYXJrCWUCP8JEg==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-18.6.1.tgz", + "integrity": "sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==", "dev": true, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/format": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-18.4.4.tgz", - "integrity": "sha512-2v3V5hVlv0R3pe7p66IX5F7cjeVvGM5JqITRIbBCFvGHPJ/CG74rjTkAu0RBEiIhlk3eOaLjVGq3d5falPkLBA==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-18.6.1.tgz", + "integrity": "sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg==", "dev": true, "dependencies": { - "@commitlint/types": "^18.4.4", + "@commitlint/types": "^18.6.1", "chalk": "^4.1.0" }, "engines": { "node": ">=v18" } }, - "node_modules/@commitlint/is-ignored": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-18.4.4.tgz", - "integrity": "sha512-rXWes9owKBTjfTr6Od7YlflRg4N+ngkOH+dUZhk0qL/XQb26mHz0EgVgdixMVBac1OsohRwJaLmVHX+5F6vfmg==", + "node_modules/@commitlint/format/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@commitlint/types": "^18.4.4", - "semver": "7.5.4" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=v18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@commitlint/lint": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-18.4.4.tgz", - "integrity": "sha512-SoyQstVxMY5Z4GnFRtRzy+NWYb+yVseXgir+7BxnpB59oH05C9XztRrhDw6OnkNeXhjINTpi1HLnuY7So+CaAQ==", + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@commitlint/is-ignored": "^18.4.4", - "@commitlint/parse": "^18.4.4", - "@commitlint/rules": "^18.4.4", - "@commitlint/types": "^18.4.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=v18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@commitlint/load": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-18.4.4.tgz", - "integrity": "sha512-RaDIa9qwOw2xRJ3Jr2DBXd14rmnHJIX2XdZF4kmoF1rgsg/+7cvrExLSUNAkQUNimyjCn1b/bKX2Omm+GdY0XQ==", + "node_modules/@commitlint/format/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@commitlint/config-validator": "^18.4.4", - "@commitlint/execute-rule": "^18.4.4", - "@commitlint/resolve-extends": "^18.4.4", - "@commitlint/types": "^18.4.4", - "chalk": "^4.1.0", - "cosmiconfig": "^8.3.6", - "cosmiconfig-typescript-loader": "^5.0.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0", - "resolve-from": "^5.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=v18" + "node": ">=7.0.0" } }, - "node_modules/@commitlint/load/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/@commitlint/format/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@commitlint/format/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/format/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-18.6.1.tgz", + "integrity": "sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^18.6.1", + "semver": "7.6.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@commitlint/lint": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-18.6.1.tgz", + "integrity": "sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^18.6.1", + "@commitlint/parse": "^18.6.1", + "@commitlint/rules": "^18.6.1", + "@commitlint/types": "^18.6.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-18.6.1.tgz", + "integrity": "sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^18.6.1", + "@commitlint/execute-rule": "^18.6.1", + "@commitlint/resolve-extends": "^18.6.1", + "@commitlint/types": "^18.6.1", + "chalk": "^4.1.0", + "cosmiconfig": "^8.3.6", + "cosmiconfig-typescript-loader": "^5.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@commitlint/load/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@commitlint/load/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/load/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@commitlint/message": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-18.4.4.tgz", - "integrity": "sha512-lHF95mMDYgAI1LBXveJUyg4eLaMXyOqJccCK3v55ZOEUsMPrDi8upqDjd/NmzWmESYihaOMBTAnxm+6oD1WoDQ==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-18.6.1.tgz", + "integrity": "sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw==", "dev": true, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/parse": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-18.4.4.tgz", - "integrity": "sha512-99G7dyn/OoyNWXJni0Ki0K3aJd01pEb/Im/Id6y4X7PN+kGOahjz2z/cXYYHn7xDdooqFVdiVrVLeChfgpWZ2g==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-18.6.1.tgz", + "integrity": "sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==", "dev": true, "dependencies": { - "@commitlint/types": "^18.4.4", + "@commitlint/types": "^18.6.1", "conventional-changelog-angular": "^7.0.0", "conventional-commits-parser": "^5.0.0" }, @@ -938,13 +880,13 @@ } }, "node_modules/@commitlint/read": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-18.4.4.tgz", - "integrity": "sha512-r58JbWky4gAFPea/CZmvlqP9Ehbs+8gSEUqhIJOojKzTc3xlxFnZUDVPcEnnaqzQEEoV6C69VW7xuzdcBlu/FQ==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-18.6.1.tgz", + "integrity": "sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w==", "dev": true, "dependencies": { - "@commitlint/top-level": "^18.4.4", - "@commitlint/types": "^18.4.4", + "@commitlint/top-level": "^18.6.1", + "@commitlint/types": "^18.6.1", "git-raw-commits": "^2.0.11", "minimist": "^1.2.6" }, @@ -953,13 +895,13 @@ } }, "node_modules/@commitlint/resolve-extends": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-18.4.4.tgz", - "integrity": "sha512-RRpIHSbRnFvmGifVk21Gqazf1QF/yeP+Kkg/e3PlkegcOKd/FGOXp/Kx9cvSO2K7ucSn4GD/oBvgasFoy+NCAw==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-18.6.1.tgz", + "integrity": "sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==", "dev": true, "dependencies": { - "@commitlint/config-validator": "^18.4.4", - "@commitlint/types": "^18.4.4", + "@commitlint/config-validator": "^18.6.1", + "@commitlint/types": "^18.6.1", "import-fresh": "^3.0.0", "lodash.mergewith": "^4.6.2", "resolve-from": "^5.0.0", @@ -969,25 +911,16 @@ "node": ">=v18" } }, - "node_modules/@commitlint/resolve-extends/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@commitlint/rules": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-18.4.4.tgz", - "integrity": "sha512-6Uzlsnl/GljEI+80NWjf4ThOfR8NIsbm18IfXYuCEchlwMHSxiuYG4rHSK5DNmG/+MIo8eR5VdQ0gQyt7kWzAA==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-18.6.1.tgz", + "integrity": "sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew==", "dev": true, "dependencies": { - "@commitlint/ensure": "^18.4.4", - "@commitlint/message": "^18.4.4", - "@commitlint/to-lines": "^18.4.4", - "@commitlint/types": "^18.4.4", + "@commitlint/ensure": "^18.6.1", + "@commitlint/message": "^18.6.1", + "@commitlint/to-lines": "^18.6.1", + "@commitlint/types": "^18.6.1", "execa": "^5.0.0" }, "engines": { @@ -995,18 +928,18 @@ } }, "node_modules/@commitlint/to-lines": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-18.4.4.tgz", - "integrity": "sha512-mwe2Roa59NCz/krniAdCygFabg7+fQCkIhXqBHw00XQ8Y7lw4poZLLxeGI3p3bLpcEOXdqIDrEGLwHmG5lBdwQ==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-18.6.1.tgz", + "integrity": "sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q==", "dev": true, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/top-level": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-18.4.4.tgz", - "integrity": "sha512-PBwW1drgeavl9CadB7IPRUk6rkUP/O8jEkxjlC+ofuh3pw0bzJdAT+Kw7M1Yc9KtTb9xTaqUB8uvRtaybHa/tQ==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-18.6.1.tgz", + "integrity": "sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw==", "dev": true, "dependencies": { "find-up": "^5.0.0" @@ -1016,9 +949,9 @@ } }, "node_modules/@commitlint/types": { - "version": "18.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-18.4.4.tgz", - "integrity": "sha512-/FykLtodD8gKs3+VNkAUwofu4LBHankclj+I8fB2jTRvG6PV7k/OUt4P+VbM7ip853qS4F0g7Z6hLNa6JeMcAQ==", + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-18.6.1.tgz", + "integrity": "sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==", "dev": true, "dependencies": { "chalk": "^4.1.0" @@ -1027,6 +960,76 @@ "node": ">=v18" } }, + "node_modules/@commitlint/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@commitlint/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@commitlint/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -1096,6 +1099,28 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1106,56 +1131,81 @@ "concat-map": "0.0.1" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "type-fest": "^0.20.2" }, "engines": { - "node": "*" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/ajv-compiler": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", - "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", "dependencies": { - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "fast-uri": "^2.0.0" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@fastify/ajv-compiler/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", + "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } }, "node_modules/@fastify/cors": { "version": "8.5.0", @@ -1208,9 +1258,9 @@ } }, "node_modules/@hirosystems/api-toolkit": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@hirosystems/api-toolkit/-/api-toolkit-1.3.3.tgz", - "integrity": "sha512-0/JjQ54twLdVqf8+hB+8IAKn8JdCdlMfT3BqUWha5qMrjlC3KX+kAl+88+CqpoibY/lgYJ9fs+70KG/weHt3LQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@hirosystems/api-toolkit/-/api-toolkit-1.4.0.tgz", + "integrity": "sha512-n1LF5roEQ7LkfAvKw0Wucmbo+XhvQBp4ED9N/AyD76/wHQeU59nocDkVAoKSJzWzzCfHa2+G32d3zB3m6oMbIQ==", "dependencies": { "@fastify/cors": "^8.0.0", "@fastify/swagger": "^8.3.1", @@ -1395,15 +1445,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -1417,19 +1458,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -1469,15 +1497,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -1504,6 +1523,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", @@ -1551,6 +1640,76 @@ } } }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", @@ -1666,42 +1825,161 @@ } } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.27.8" + "color-convert": "^2.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/schemas/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas/node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { "@jest/console": "^29.7.0", @@ -1754,6 +2032,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", @@ -1771,33 +2119,103 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1810,9 +2228,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1837,29 +2255,62 @@ "resolve": "~1.19.0" } }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@noble/hashes": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.5.tgz", - "integrity": "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@noble/curves": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", + "dependencies": { + "@noble/hashes": "1.3.3" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, "node_modules/@noble/secp256k1": { "version": "1.7.1", @@ -1929,10 +2380,85 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@scure/base": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", + "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.3.tgz", + "integrity": "sha512-dSH3+LCWONlSNQuF34xZrG6Xas7tp2jSSqHb/pMfXWM0vKE4JZOtK3uJfoWouUVW5IGlls75HkXmYLldZ8ySgQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.1.3", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.5.tgz", + "integrity": "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@scure/bip39": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", + "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.1.1", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.5.tgz", + "integrity": "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@scure/btc-signer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/btc-signer/-/btc-signer-1.2.1.tgz", + "integrity": "sha512-/Zle18/aWhYDBuBeXGDGJTdo0/LKpQhU8ETBJeWABCQkbk0QHCFCinidTiz9hdQFfh0HtasPGq5p6EodVCfEew==", + "dependencies": { + "@noble/curves": "~1.3.0", + "@noble/hashes": "~1.3.3", + "@scure/base": "~1.1.5", + "micro-packed": "~0.5.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@sinclair/typebox": { - "version": "0.32.12", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.32.12.tgz", - "integrity": "sha512-uKRQW9a+alkPwZMzQk6W8cCZC117kZJZ3GQx3Yn9unu2oWX09PxEsyMF7D9tuvoH8se1hIZqLRja+FtU7HKGhQ==" + "version": "0.32.15", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.32.15.tgz", + "integrity": "sha512-5Lrwo7VOiWEBJBhHmqNmf3TPB9ll8gcEshvYJyAIJyCZ2PF48MFOtiDHJNj8+FsNcqImaQYmxVkKBCBlyAa/wg==" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", @@ -1957,10 +2483,23 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, + "node_modules/@stacks/auth": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/auth/-/auth-6.13.0.tgz", + "integrity": "sha512-3a6FwP5yNngQfalu78MltQzCROL4l+MNngnCxFKo52EJfIdJp8TWKuwkzHN/jLzrvdUoq1lQjKlxoINCiUP03g==", + "dependencies": { + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.0", + "@stacks/network": "^6.13.0", + "@stacks/profile": "^6.13.0", + "cross-fetch": "^3.1.5", + "jsontokens": "^4.0.1" + } + }, "node_modules/@stacks/blockchain-api-client": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/@stacks/blockchain-api-client/-/blockchain-api-client-7.8.1.tgz", - "integrity": "sha512-ckF8QxvjLy1TAZ1vetpOje1s3t73rce7Dbg0pzHju/UC56auGaCUEMi6olUKk2Q/eSJX3IjhURa31xGIykAY+Q==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@stacks/blockchain-api-client/-/blockchain-api-client-7.8.2.tgz", + "integrity": "sha512-yGPFJTnuZ89S5tOCx9Dook6A4ghzR7RDTE3zpcfgae2wAenN2LPgQYGGNONKeLuxKl1giPiiT0ywv/MYR60YnA==", "dependencies": { "@stacks/stacks-blockchain-api-types": "*", "@types/ws": "7.4.7", @@ -1971,46 +2510,54 @@ "ws": "8.16.0" } }, - "node_modules/@stacks/blockchain-api-client/node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "node_modules/@stacks/common": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/common/-/common-6.13.0.tgz", + "integrity": "sha512-wwzyihjaSdmL6NxKvDeayy3dqM0L0Q2sawmdNtzJDi0FnXuJGm5PeapJj7bEfcI9XwI7Bw5jZoC6mCn9nc5YIw==", "dependencies": { - "node-fetch": "2.6.7" + "@types/bn.js": "^5.1.0", + "@types/node": "^18.0.4" } }, - "node_modules/@stacks/blockchain-api-client/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/@stacks/common/node_modules/@types/node": { + "version": "18.19.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.24.tgz", + "integrity": "sha512-eghAz3gnbQbvnHqB+mgB2ZR3aH6RhdEmHGS48BnV75KceQPHqabkxKI0BbUSsqhqy2Ddhc2xD/VAR9ySZd57Lw==", "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "undici-types": "~5.26.4" } }, - "node_modules/@stacks/common": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@stacks/common/-/common-6.10.0.tgz", - "integrity": "sha512-6x5Z7AKd9/kj3+DYE9xIDIkFLHihBH614i2wqrZIjN02WxVo063hWSjIlUxlx8P4gl6olVzlOy5LzhLJD9OP0A==", + "node_modules/@stacks/encryption": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.13.0.tgz", + "integrity": "sha512-CsacBxY1XBVXBuJ5erJPjB5FmQ8KGJ/ft02/pIM6WrJ31ZcBdkn2BPV1AsPSD5qsIkiMdHAe14WKIwm8M2SWtQ==", "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^18.0.4" + "@noble/hashes": "1.1.5", + "@noble/secp256k1": "1.7.1", + "@scure/bip39": "1.1.0", + "@stacks/common": "^6.13.0", + "@types/node": "^18.0.4", + "base64-js": "^1.5.1", + "bs58": "^5.0.0", + "ripemd160-min": "^0.0.6", + "varuint-bitcoin": "^1.1.2" } }, - "node_modules/@stacks/common/node_modules/@types/node": { - "version": "18.19.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.8.tgz", - "integrity": "sha512-g1pZtPhsvGVTwmeVoexWZLTQaOvXwoSq//pTL0DHeNzUDrFnir4fgETdhjhIxjVnN+hKOuh98+E1eMLnUXstFg==", + "node_modules/@stacks/encryption/node_modules/@noble/hashes": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.5.tgz", + "integrity": "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@stacks/encryption/node_modules/@types/node": { + "version": "18.19.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.26.tgz", + "integrity": "sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==", "dependencies": { "undici-types": "~5.26.4" } @@ -2039,11 +2586,11 @@ } }, "node_modules/@stacks/network": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.10.0.tgz", - "integrity": "sha512-mbiZ8nlsyy77ndmBdaqhHXii22IFdK4ThRcOQs9j/O00DkAr04jCM4GV5Q+VLUnZ9OBoJq7yOV7Pf6jglh+0hw==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.13.0.tgz", + "integrity": "sha512-Ss/Da4BNyPBBj1OieM981fJ7SkevKqLPkzoI1+Yo7cYR2df+0FipIN++Z4RfpJpc8ne60vgcx7nJZXQsiGhKBQ==", "dependencies": { - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "cross-fetch": "^3.1.5" } }, @@ -2068,24 +2615,124 @@ "node": ">=10.13.0" } }, + "node_modules/@stacks/profile": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/profile/-/profile-6.13.0.tgz", + "integrity": "sha512-IIOPtP+bHu53j426UTFn+JFgv9G3JyybtJ6TDcc4zxoMvs8sLKEVTyjZNFrP38DjkoAGo1qWNWqoJhURfL55Uw==", + "dependencies": { + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", + "@stacks/transactions": "^6.13.0", + "jsontokens": "^4.0.1", + "schema-inspector": "^2.0.2", + "zone-file": "^2.0.0-beta.3" + } + }, + "node_modules/@stacks/stacking": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/stacking/-/stacking-6.13.0.tgz", + "integrity": "sha512-ivzFZkVpqzneJ71T1eZTW8Rr5oVYrs4HkwZqGHxDEySb1I6p96hojH5gEguj9g7szQiyeYLj1dreCvhLh6ET6A==", + "dependencies": { + "@noble/hashes": "1.1.5", + "@scure/base": "1.1.1", + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.0", + "@stacks/network": "^6.13.0", + "@stacks/stacks-blockchain-api-types": "^0.61.0", + "@stacks/transactions": "^6.13.0", + "bs58": "^5.0.0" + } + }, + "node_modules/@stacks/stacking/node_modules/@noble/hashes": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.5.tgz", + "integrity": "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@stacks/stacking/node_modules/@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@stacks/stacking/node_modules/@stacks/stacks-blockchain-api-types": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@stacks/stacks-blockchain-api-types/-/stacks-blockchain-api-types-0.61.0.tgz", + "integrity": "sha512-yPOfTUboo5eA9BZL/hqMcM71GstrFs9YWzOrJFPeP4cOO1wgYvAcckgBRbgiE3NqeX0A7SLZLDAXLZbATuRq9w==" + }, "node_modules/@stacks/stacks-blockchain-api-types": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/@stacks/stacks-blockchain-api-types/-/stacks-blockchain-api-types-7.8.1.tgz", - "integrity": "sha512-gfC+KLQKLUZho00+88qVettjOKaYG8UGsokvzpYScnC6XcU4KpIcZnEpG2nrFGWnvLOCjw6VifrmBODbLx6tZQ==" + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@stacks/stacks-blockchain-api-types/-/stacks-blockchain-api-types-7.8.2.tgz", + "integrity": "sha512-wcDSdgIZx/ttQfUTPtGJOIyEkTOjmCsC79TaIyxTIiihSgrGppqTuzkwHD/DyuQkcJtUZvDTxMsAXkBKShE1kw==" + }, + "node_modules/@stacks/storage": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/storage/-/storage-6.13.0.tgz", + "integrity": "sha512-BDgGBysgoo756SUGQ7vTtJKPBhZLBbl9UrO7YoAoVO8vfB569X7PiQbUxwE8R7iLutnlBgP+mnpGDhV9UQo1vA==", + "dependencies": { + "@stacks/auth": "^6.13.0", + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.0", + "@stacks/network": "^6.13.0", + "base64-js": "^1.5.1", + "jsontokens": "^4.0.1" + } }, "node_modules/@stacks/transactions": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.11.2.tgz", - "integrity": "sha512-Ojz+8gEl0NcLNnlKqu2itLqqcdzH8zrkmyRUU2zcOJseKy6q7JID16wxMdEI8dSUcL7gxLYJzNMhx8BoI9CMPQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.13.0.tgz", + "integrity": "sha512-xrx09qsXL/tWCkvAArzsFQqtZKDXyedjdVB9uX8xw+cQCi3xZ7r5MHMKzvEsTgJz3EO+MkQBXcvI1uzfuoqhcA==", "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", - "@stacks/common": "^6.10.0", - "@stacks/network": "^6.10.0", + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", "c32check": "^2.0.0", "lodash.clonedeep": "^4.5.0" } }, + "node_modules/@stacks/transactions/node_modules/@noble/hashes": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.5.tgz", + "integrity": "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@stacks/wallet-sdk": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/wallet-sdk/-/wallet-sdk-6.13.0.tgz", + "integrity": "sha512-2+jJ3SWrhPVLc4mokFekwqPLU8tP6ffDC379A4I2xrKWwPk3zjx3/SlqtUnf8CJkwgmsBozRS6SBqd7obIvQAg==", + "dependencies": { + "@scure/bip32": "1.1.3", + "@scure/bip39": "1.1.0", + "@stacks/auth": "^6.13.0", + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.0", + "@stacks/network": "^6.13.0", + "@stacks/profile": "^6.13.0", + "@stacks/storage": "^6.13.0", + "@stacks/transactions": "^6.13.0", + "buffer": "^6.0.3", + "c32check": "^2.0.0", + "jsontokens": "^4.0.1", + "triplesec": "^4.0.3", + "zone-file": "^2.0.0-beta.3" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -2193,9 +2840,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.11", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", - "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -2221,9 +2868,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", - "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", + "version": "20.11.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.27.tgz", + "integrity": "sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg==", "dependencies": { "undici-types": "~5.26.4" } @@ -2235,9 +2882,9 @@ "dev": true }, "node_modules/@types/pg": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.0.tgz", - "integrity": "sha512-sDAlRiBNthGjNFfvt0k6mtotoVYVQ63pA8R4EMWka7crawSR60waVYR0HAgmPRs/e2YaeJTD/43OoZ3PFw80pw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.2.tgz", + "integrity": "sha512-G2Mjygf2jFMU/9hCaTYxJrwdObdcnuQde1gndooZSOHsNSaCehAuwc7EIuSA34Do8Jx2yZ19KtvW8P0j4EuUXw==", "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -2245,9 +2892,9 @@ } }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/stack-utils": { @@ -2280,16 +2927,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.0.tgz", - "integrity": "sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.19.0", - "@typescript-eslint/type-utils": "6.19.0", - "@typescript-eslint/utils": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -2314,16 +2961,49 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/parser": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.0.tgz", - "integrity": "sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.19.0", - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/typescript-estree": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "engines": { @@ -2343,13 +3023,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz", - "integrity": "sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -2360,13 +3040,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.0.tgz", - "integrity": "sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.19.0", - "@typescript-eslint/utils": "6.19.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -2387,9 +3067,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz", - "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -2400,13 +3080,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz", - "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2427,18 +3107,51 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/utils": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.0.tgz", - "integrity": "sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.19.0", - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/typescript-estree": "6.19.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "engines": { @@ -2452,13 +3165,46 @@ "eslint": "^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz", - "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2522,14 +3268,13 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { @@ -2553,26 +3298,6 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -2588,18 +3313,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -2609,17 +3322,15 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/anymatch": { @@ -2647,19 +3358,25 @@ "dev": true }, "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2699,17 +3416,36 @@ "node": ">=8" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2755,17 +3491,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -2784,6 +3521,14 @@ "node": ">=0.10.0" } }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, "node_modules/atomic-sleep": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", @@ -2793,10 +3538,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2836,45 +3584,90 @@ "@babel/core": "^7.8.0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/babel-plugin-jest-hoist": { @@ -2988,9 +3781,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -3007,8 +3800,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -3031,6 +3824,14 @@ "node": ">= 6" } }, + "node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "dependencies": { + "base-x": "^4.0.0" + } + }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -3091,14 +3892,19 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3140,9 +3946,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001579", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", - "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "dev": true, "funding": [ { @@ -3160,19 +3966,17 @@ ] }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" } }, "node_modules/char-regex": { @@ -3236,20 +4040,19 @@ "dev": true }, "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/compare-func": { "version": "2.0.0", @@ -3316,9 +4119,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -3366,6 +4169,24 @@ "typescript": ">=4" } }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -3387,18 +4208,88 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/create-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/create-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "dependencies": { - "node-fetch": "^2.6.12" + "node-fetch": "2.6.7" } }, "node_modules/cross-spawn": { @@ -3441,12 +4332,14 @@ } }, "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/decamelize-keys": { @@ -3465,6 +4358,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -3504,17 +4406,20 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -3598,14 +4503,14 @@ } }, "node_modules/dotenv": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.2.tgz", - "integrity": "sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/dotenv-expand": { @@ -3623,9 +4528,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.640", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.640.tgz", - "integrity": "sha512-z/6oZ/Muqk4BaE7P69bXhUhpJbUM9ZJeka43ZwxsDshKtePns4mhBlh8bU5+yrnOnz3fhG82XLzGUXazOmsWnA==", + "version": "1.4.703", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.703.tgz", + "integrity": "sha512-094ZZC4nHXPKl/OwPinSMtLN9+hoFkdfQGKnvXbY+3WEAYtVDpz9UhJIViiY6Zb8agvqxiaJzNG9M+pRZWvSZw==", "dev": true }, "node_modules/emittery": { @@ -3678,17 +4583,17 @@ } }, "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", "engines": { "node": ">=10.0.0" } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -3708,26 +4613,6 @@ "dotenv-expand": "^10.0.0" } }, - "node_modules/env-schema/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/env-schema/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -3738,50 +4623,52 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -3790,15 +4677,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -3831,36 +4745,33 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -3963,9 +4874,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -4062,15 +4973,6 @@ "node": "*" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-prettier": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", @@ -4112,9 +5014,9 @@ } }, "node_modules/eslint-plugin-unused-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz", - "integrity": "sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.1.0.tgz", + "integrity": "sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==", "dev": true, "dependencies": { "eslint-rule-composer": "^0.3.0" @@ -4123,8 +5025,8 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.0.0", - "eslint": "^8.0.0" + "@typescript-eslint/eslint-plugin": "6 - 7", + "eslint": "8" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { @@ -4169,6 +5071,43 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4179,50 +5118,162 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "color-name": "~1.1.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=7.0.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esquery": { - "version": "1.5.0", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, @@ -4388,9 +5439,9 @@ "dev": true }, "node_modules/fast-json-stringify": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.12.0.tgz", - "integrity": "sha512-7Nnm9UPa7SfHRbHVA1kJQrGXCRzB7LMlAAqHXQFkEQqueJm1V8owm0FsE/2Do55/4CcdhwiLQERaKomOnKQkyA==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.13.0.tgz", + "integrity": "sha512-XjTDWKHP3GoMQUOfnjYUbqeHeEt+PvYgvBdG2fRSmYaORILbSr8xTJvZX+w1YSAP5pw2NwKrGRmQleYueZEoxw==", "dependencies": { "@fastify/merge-json-schemas": "^0.1.0", "ajv": "^8.10.0", @@ -4401,26 +5452,6 @@ "rfdc": "^1.2.0" } }, - "node_modules/fast-json-stringify/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/fast-json-stringify/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -4436,9 +5467,9 @@ } }, "node_modules/fast-redact": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", - "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.4.0.tgz", + "integrity": "sha512-2gwPvyna0zwBdxKnng1suu/dTL5s8XEy2ZqH8mwDUwJdDkV8w5kp+JV26mupdK68HmPMbm6yjW9m7/Ys/BHEHg==", "engines": { "node": ">=6" } @@ -4449,9 +5480,9 @@ "integrity": "sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==" }, "node_modules/fastify": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.26.1.tgz", - "integrity": "sha512-tznA/G55dsxzM5XChBfcvVSloG2ejeeotfPPJSFaWmHyCDVGMpvf3nRNbsCb/JTBF9RmQFBfuujWt3Nphjesng==", + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.26.2.tgz", + "integrity": "sha512-90pjTuPGrfVKtdpLeLzND5nyC4woXZN5VadiNQCicj/iJU4viNHKhsAnb7jmv1vu2IzkLXyBiCzdWuzeXgQ5Ug==", "funding": [ { "type": "github", @@ -4498,6 +5529,36 @@ "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==" }, + "node_modules/fastify/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fastify/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fastify/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -4598,9 +5659,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/for-each": { @@ -4722,16 +5783,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4758,13 +5823,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -4774,9 +5840,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", + "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -4829,6 +5895,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/git-raw-commits/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/git-raw-commits/node_modules/split2": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", @@ -4926,18 +6006,12 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/globalthis": { @@ -5018,30 +6092,30 @@ } }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -5063,12 +6137,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5078,9 +6152,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -5101,6 +6175,24 @@ "node": ">=10" } }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -5131,6 +6223,24 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/iced-error": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/iced-error/-/iced-error-0.0.13.tgz", + "integrity": "sha512-yEEaG8QfyyRL0SsbNNDw3rVgTyqwHFMCuV6jDvD43f/2shmdaFXkqvFLGhDlsYNSolzYHwVLM/CrXt9GygYopA==" + }, + "node_modules/iced-lock": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/iced-lock/-/iced-lock-1.1.0.tgz", + "integrity": "sha512-J9UMVitgTMYrkUil5EB9/Q4BPWiMpFH156yjDlmMoMRKs3s3PnXj/6G0UlzIOGnNi5JVNk/zVYLXVnuo+1QnqQ==", + "dependencies": { + "iced-runtime": "^1.0.0" + } + }, + "node_modules/iced-runtime": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/iced-runtime/-/iced-runtime-1.0.4.tgz", + "integrity": "sha512-rgiJXNF6ZgF2Clh/TKUlBDW3q51YPDJUXmxGQXx1b8tbZpVpTn+1RX9q1sjNkujXIIaVxZByQzPHHORg7KV51g==" + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -5151,9 +6261,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -5175,6 +6285,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -5235,12 +6354,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -5257,14 +6376,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5382,9 +6503,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -5461,12 +6582,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5527,12 +6651,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -5575,19 +6699,19 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" + "semver": "^6.3.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/istanbul-lib-report": { @@ -5604,6 +6728,27 @@ "node": ">=10" } }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -5619,9 +6764,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -5720,6 +6865,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-cli": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", @@ -5753,6 +6968,76 @@ } } }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -5798,106 +7083,84 @@ } } }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" + "node": ">=8" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "color-name": "~1.1.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=7.0.0" } }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "has-flag": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "node": ">=8" } }, - "node_modules/jest-leak-detector": { + "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" }, @@ -5905,282 +7168,1168 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" + "color-name": "~1.1.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=7.0.0" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-resolve": { + "node_modules/jest-each": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", + "jest-get-type": "^29.6.3", "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-runtime": { + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot": { + "node_modules/jest-haste-map": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-util": { + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", + "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jest-worker": { @@ -6198,6 +8347,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -6235,12 +8393,13 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -6295,10 +8454,9 @@ } }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -6307,15 +8465,15 @@ "dev": true }, "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/jsonparse": { @@ -6348,6 +8506,16 @@ "node": "*" } }, + "node_modules/jsontokens": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsontokens/-/jsontokens-4.0.1.tgz", + "integrity": "sha512-+MO415LEN6M+3FGsRz4wU20g7N2JA+2j9d9+pGaNJHviG4L8N0qzavGyENw6fJqsq9CcrHOIL6iWX5yeTZ86+Q==", + "dependencies": { + "@noble/hashes": "^1.1.2", + "@noble/secp256k1": "^1.6.3", + "base64-js": "^1.5.1" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -6398,20 +8566,15 @@ } }, "node_modules/light-my-request": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.11.0.tgz", - "integrity": "sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.12.0.tgz", + "integrity": "sha512-P526OX6E7aeCIfw/9UyJNsAISfcFETghysaWHQAlQYayynShT08MOj4c6fBCvTWBrHXSvqBAKDp3amUPSCQI4w==", "dependencies": { - "cookie": "^0.5.0", - "process-warning": "^2.0.0", + "cookie": "^0.6.0", + "process-warning": "^3.0.0", "set-cookie-parser": "^2.4.1" } }, - "node_modules/light-my-request/node_modules/process-warning": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.2.tgz", - "integrity": "sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==" - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -6436,8 +8599,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -6511,14 +8673,12 @@ "dev": true }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/make-dir": { @@ -6536,6 +8696,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -6590,6 +8783,17 @@ "node": ">= 8" } }, + "node_modules/micro-packed": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.5.2.tgz", + "integrity": "sha512-l8sgdeDNz4KMFdEyk2o0qt+GfmzGZH7sV5+XcHRyBS8LQLCHh/7LYlFlQ5k+axqz7hgANsn8SqzDxRe7O2DIIg==", + "dependencies": { + "@scure/base": "~1.1.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -6687,6 +8891,14 @@ "obliterator": "^2.0.1" } }, + "node_modules/more-entropy": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/more-entropy/-/more-entropy-0.0.7.tgz", + "integrity": "sha512-e0TxQtU1F6/ZA8WnEA2JLQwwDqBTtZFLJSW7rWgUsQou35wx1IOL0g2O7q7oGoMgIJto+jHMnNGHLfSiylHRrw==", + "dependencies": { + "iced-runtime": ">=0.0.1" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -6699,9 +8911,9 @@ "dev": true }, "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -6753,17 +8965,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/node-pg-migrate/node_modules/decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/node-pg-migrate/node_modules/yargs": { "version": "17.3.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", @@ -6802,6 +9003,39 @@ "node": ">=10" } }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6877,15 +9111,16 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" } }, "node_modules/object.values": { @@ -7094,9 +9329,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -7283,9 +9518,9 @@ } }, "node_modules/pino": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.18.0.tgz", - "integrity": "sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.19.0.tgz", + "integrity": "sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -7312,21 +9547,6 @@ "split2": "^4.0.0" } }, - "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/pino-std-serializers": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", @@ -7405,6 +9625,15 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postgres": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.3.tgz", @@ -7467,9 +9696,9 @@ } }, "node_modules/prettier": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", - "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -7532,6 +9761,14 @@ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" }, + "node_modules/progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/prom-client": { "version": "14.2.0", "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.2.0.tgz", @@ -7761,18 +9998,19 @@ "node": ">=8" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, + "node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/real-require": { @@ -7797,14 +10035,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -7858,7 +10097,7 @@ "node": ">=8" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", @@ -7867,15 +10106,6 @@ "node": ">=8" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/resolve-global": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", @@ -7968,6 +10198,14 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/ripemd160-min": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", + "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", + "engines": { + "node": ">=8" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -7992,13 +10230,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -8029,13 +10267,13 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, "engines": { @@ -8061,23 +10299,26 @@ "node": ">=10" } }, + "node_modules/schema-inspector": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/schema-inspector/-/schema-inspector-2.1.0.tgz", + "integrity": "sha512-3bmQVhbA01/EW8cZin4vIpqlpNU2SIy4BhKCfCgogJ3T/L76dLx3QAE+++4o+dNT33sa+SN9vOJL7iHiHFjiNg==", + "dependencies": { + "async": "~2.6.3" + } + }, "node_modules/secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/set-cookie-parser": { @@ -8086,30 +10327,32 @@ "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" }, "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8137,14 +10380,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8235,9 +10482,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -8251,9 +10498,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, "node_modules/split2": { @@ -8410,12 +10657,12 @@ } }, "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/strip-final-newline": { @@ -8452,15 +10699,15 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -8585,6 +10832,20 @@ "readable-stream": "3" } }, + "node_modules/through2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -8634,22 +10895,35 @@ "node": ">=8" } }, + "node_modules/triplesec": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/triplesec/-/triplesec-4.0.3.tgz", + "integrity": "sha512-fug70e1nJoCMxsXQJlETisAALohm84vl++IiTTHEqM7Lgqwz62jrlwqOC/gJEAJjO/ByN127sEcioB56HW3wIw==", + "dependencies": { + "iced-error": ">=0.0.9", + "iced-lock": "^1.0.1", + "iced-runtime": "^1.0.2", + "more-entropy": ">=0.0.7", + "progress": "~1.1.2", + "uglify-js": "^3.1.9" + } + }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" } }, "node_modules/ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -8665,7 +10939,7 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", @@ -8689,18 +10963,39 @@ } } }, - "node_modules/ts-jest/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { - "json5": "lib/cli.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" + "node": ">=10" } }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -8756,6 +11051,27 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -8784,9 +11100,9 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { "node": ">=10" @@ -8796,29 +11112,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -8828,16 +11145,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -8847,23 +11165,29 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8873,6 +11197,17 @@ "node": ">=14.17" } }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -8967,6 +11302,14 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/varuint-bitcoin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", + "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -9022,16 +11365,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9074,6 +11417,69 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9139,14 +11545,18 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } @@ -9197,6 +11607,14 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zone-file": { + "version": "2.0.0-beta.3", + "resolved": "https://registry.npmjs.org/zone-file/-/zone-file-2.0.0-beta.3.tgz", + "integrity": "sha512-6tE3PSRcpN5lbTTLlkLez40WkNPc9vw/u1J2j6DBiy0jcVX48nCkWrx2EC+bWHqC2SLp069Xw4AdnYn/qp/W5g==", + "engines": { + "node": ">=10" + } } } } diff --git a/package.json b/package.json index 66a1ab5..7a19ec9 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,14 @@ }, "dependencies": { "@hirosystems/api-toolkit": "^1.3.3", + "@scure/btc-signer": "^1.2.1", "@sinclair/typebox": "^0.32.12", "@stacks/blockchain-api-client": "^7.8.1", - "@stacks/network": "^6.10.0", - "@stacks/transactions": "^6.11.2", + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", + "@stacks/stacking": "^6.13.0", + "@stacks/transactions": "^6.13.0", + "@stacks/wallet-sdk": "^6.13.0", "@types/node": "^20.11.5", "env-schema": "^5.2.1" } diff --git a/src/contracts/pox-4-wrapper.clar b/src/contracts/pox-4-wrapper.clar new file mode 100644 index 0000000..00dee5f --- /dev/null +++ b/src/contracts/pox-4-wrapper.clar @@ -0,0 +1,96 @@ +(define-public (disallow-contract-caller (caller principal)) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 disallow-contract-caller caller)) + +(define-public (allow-contract-caller (caller principal) (until-burn-ht (optional uint))) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 allow-contract-caller caller until-burn-ht)) + +(define-public (stack-stx (amount-ustx uint) + (pox-addr (tuple (version (buff 1)) (hashbytes (buff 32)))) + (start-burn-ht uint) + (lock-period uint) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 stack-stx amount-ustx pox-addr start-burn-ht lock-period signer-sig signer-key max-amount auth-id)) + +(define-public (revoke-delegate-stx) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 revoke-delegate-stx)) + +(define-public (delegate-stx (amount-ustx uint) + (delegate-to principal) + (until-burn-ht (optional uint)) + (pox-addr (optional { version: (buff 1), hashbytes: (buff 32) }))) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 delegate-stx amount-ustx delegate-to until-burn-ht pox-addr)) + + +(define-public (stack-aggregation-commit (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (reward-cycle uint) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 stack-aggregation-commit pox-addr reward-cycle signer-sig signer-key max-amount auth-id)) + +(define-public (stack-aggregation-commit-indexed (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (reward-cycle uint) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 stack-aggregation-commit-indexed pox-addr reward-cycle signer-sig signer-key max-amount auth-id)) + +(define-public (stack-aggregation-increase (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (reward-cycle uint) + (reward-cycle-index uint) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 stack-aggregation-increase pox-addr reward-cycle reward-cycle-index signer-sig signer-key max-amount auth-id)) + +(define-public (delegate-stack-stx (stacker principal) + (amount-ustx uint) + (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (start-burn-ht uint) + (lock-period uint)) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 delegate-stack-stx stacker amount-ustx pox-addr start-burn-ht lock-period)) + +(define-public (stack-increase + (increase-by uint) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 stack-increase increase-by signer-sig signer-key max-amount auth-id)) + +(define-public (stack-extend (extend-count uint) + (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 stack-extend extend-count pox-addr signer-sig signer-key max-amount auth-id)) + +(define-public (delegate-stack-increase + (stacker principal) + (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (increase-by uint)) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 delegate-stack-increase stacker pox-addr increase-by)) + +(define-public (delegate-stack-extend + (stacker principal) + (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (extend-count uint)) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 delegate-stack-extend stacker pox-addr extend-count)) + + +(define-public (set-signer-key-authorization (pox-addr { version: (buff 1), hashbytes: (buff 32)}) + (period uint) + (reward-cycle uint) + (topic (string-ascii 14)) + (signer-key (buff 33)) + (allowed bool) + (max-amount uint) + (auth-id uint)) + (contract-call? 'ST000000000000000000002AMW42H.pox-4 set-signer-key-authorization pox-addr period reward-cycle topic signer-key allowed max-amount auth-id)) diff --git a/src/env.ts b/src/env.ts index 5d843b8..13c6530 100644 --- a/src/env.ts +++ b/src/env.ts @@ -3,25 +3,61 @@ import envSchema from 'env-schema'; const schema = Type.Object({ STACKS_CHAIN: Type.Enum({ mainnet: 'mainnet', testnet: 'testnet' }), - /* STX address of the issuer of all transactions we will be testing */ + /** STX address of the issuer of all transactions we will be testing */ SENDER_STX_ADDRESS: Type.String(), - /* `SENDER_STX_ADDRESS`'s hex private key */ + /** `SENDER_STX_ADDRESS`'s hex private key */ SENDER_KEY: Type.String(), - /* STX address of the receiver of any sent tokens */ + /** STX address of the receiver of any sent tokens */ RECEIVER_STX_ADDRESS: Type.String(), - /* Stacks Blockchain API host */ - STACKS_API_HOST: Type.String(), - /* Stacks Blockchain API port */ - STACKS_API_PORT: Type.Integer(), - /* Stacks node host */ - STACKS_NODE_HOST: Type.String(), - /* Stacks node port */ - STACKS_NODE_PORT: Type.Integer(), + /** Stacks Blockchain API host */ + STACKS_API: Type.String(), + + /** Stacks node host */ + STACKS_NODE: Type.String(), + + STACKS_TX_TIMEOUT: Type.Integer({ default: 15_000 }), + + POLL_INTERVAL: Type.Integer({ default: 1000 }), + RETRY_INTERVAL: Type.Integer({ default: 500 }), + + /** List of pre-funded STX addresses on regtest-env */ + REGTEST_KEYS: Type.Array(Type.String(), { + default: [ + // taken from regtest-env `stacks-kryton-miner.toml` + 'cb3df38053d132895220b9ce471f6b676db5b9bf0b4adefb55f2118ece2478df01', + '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601', + '5b8303150239eceaba43892af7cdd1fa7fc26eda5182ebaaa568e3341d54a4d001', + ], + }), + /** + * Signer private key for generating signatures. + * On regtest-env, this should be the private key of a participating signer. + */ + SIGNER_KEY: Type.String({ + default: '7036b29cb5e235e5fd9b09ae3e8eec4404e44906814d5d01cbca968a60ed4bfb01', + }), + + /** + * Command to run to start regtest-env. + * e.g. this could `cd` into the regtest-env directory and run `docker compose up -d` + */ + REGTEST_UP_CMD: Type.String({ default: "echo 'no-op'" }), + /** + * Command to run to stop regtest-env. + * e.g. this could `cd` into the regtest-env directory and run `docker compose down` + */ + REGTEST_DOWN_CMD: Type.String({ default: "echo 'no-op'" }), + + /** + * If true, doesn't wait for unlock and verifying rewards in regtest tests. + * Useful for speeding up tests when running many long-running regtest-env tests + */ + REGTEST_SKIP_UNLOCK: Type.Boolean({ default: false }), }); type Env = Static; export const ENV = envSchema({ - schema: schema, dotenv: true, + schema, }); diff --git a/src/helpers.ts b/src/helpers.ts index c08dde9..42cff31 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -1,19 +1,36 @@ -import { AccountsApi, Configuration, StacksApiSocketClient } from '@stacks/blockchain-api-client'; -import { ENV } from './env'; -import { StacksMainnet, StacksNetwork, StacksTestnet } from '@stacks/network'; import { logger, timeout, waiter } from '@hirosystems/api-toolkit'; +import { NETWORK, TEST_NETWORK, getAddress } from '@scure/btc-signer'; +import { + AccountsApi, + Configuration, + InfoApi, + StackingRewardsApi, + StacksApiSocketClient, + TransactionsApi, +} from '@stacks/blockchain-api-client'; +import { TransactionVersion, bytesToHex, hexToBytes } from '@stacks/common'; +import { StacksMainnet, StacksNetwork, StacksTestnet } from '@stacks/network'; +import { PoxInfo, StackingClient } from '@stacks/stacking'; import { Transaction } from '@stacks/stacks-blockchain-api-types'; -import { StacksTransaction, broadcastTransaction } from '@stacks/transactions'; +import { + StacksTransaction, + broadcastTransaction, + createStacksPrivateKey, + getAddressFromPrivateKey, + getPublicKey, +} from '@stacks/transactions'; +import { ENV } from './env'; +import { withRetry, withTimeout } from './utils'; export function newSocketClient(): StacksApiSocketClient { return new StacksApiSocketClient({ - url: `http://${ENV.STACKS_API_HOST}:${ENV.STACKS_API_PORT}`, + url: ENV.STACKS_API, socketOpts: { reconnection: false }, }); } export function stacksNetwork(): StacksNetwork { - const url = `http://${ENV.STACKS_NODE_HOST}:${ENV.STACKS_NODE_PORT}`; + const url = ENV.STACKS_NODE; switch (ENV.STACKS_CHAIN) { case 'mainnet': return new StacksMainnet({ url }); @@ -22,9 +39,56 @@ export function stacksNetwork(): StacksNetwork { } } +export function stacksNetworkApi(): StacksNetwork { + const url = ENV.STACKS_API; + switch (ENV.STACKS_CHAIN) { + case 'mainnet': + return new StacksMainnet({ url }); + case 'testnet': + return new StacksTestnet({ url }); + } +} + +export function burnHeightToRewardCycle(burnHeight: number, poxInfo: PoxInfo): number { + // BASED ON pox-4.clar + // (/ (- height (var-get first-burnchain-block-height)) (var-get pox-reward-cycle-length))) + return Math.floor( + (burnHeight - poxInfo.first_burnchain_block_height) / poxInfo.reward_cycle_length + ); +} + +export function rewardCycleToBurnHeight(cycle: number, poxInfo: PoxInfo): number { + // BASED ON pox-4.clar + // (+ (var-get first-burnchain-block-height) (* cycle (var-get pox-reward-cycle-length)))) + return poxInfo.first_burnchain_block_height + cycle * poxInfo.reward_cycle_length; +} + +// There's two ways of determining if a block is in the prepare phase: +// - the "normal" prepare phase; based on phase lengths the last X(-1) blocks of the +// cycle (preparing the next) +// - the "blockchain" way; instead shifts this to the right by one; X-1 blocks +// of the cycle and the 0 index block of the next cycle are sort of part of +// the prepare phase + +export function isInPreparePhase(blockHeight: number, poxInfo: PoxInfo): boolean { + // BASED ON regtest-env + // const effectiveHeight = blockHeight - poxInfo.first_burnchain_block_height; + // return ( + // poxInfo.reward_cycle_length - (effectiveHeight % poxInfo.reward_cycle_length) < + // poxInfo.prepare_phase_block_length + // ); + + // BASED ON stacks-core + if (blockHeight <= poxInfo.first_burnchain_block_height) return false; + const effectiveHeight = blockHeight - poxInfo.first_burnchain_block_height; + const pos = effectiveHeight % poxInfo.reward_cycle_length; + return pos > poxInfo.reward_cycle_length - poxInfo.prepare_phase_block_length; // equivalent to the regtest-env way + // return pos === 0 || pos > poxInfo.reward_cycle_length - poxInfo.prepare_phase_block_length; +} + export async function getNextNonce(fromStacksNode: boolean = true): Promise { const config = new Configuration({ - basePath: `http://${ENV.STACKS_API_HOST}:${ENV.STACKS_API_PORT}`, + basePath: ENV.STACKS_API, }); const api = new AccountsApi(config); if (fromStacksNode) { @@ -36,6 +100,155 @@ export async function getNextNonce(fromStacksNode: boolean = true): Promise { + const config = new Configuration({ + basePath: ENV.STACKS_API, + }); + const api = new InfoApi(config); + const result = await api.getCoreApiInfo(); + return result.burn_block_height; +}); + +export async function getTransaction(txid: string) { + const config = new Configuration({ + basePath: ENV.STACKS_API, + }); + const api = new TransactionsApi(config); + try { + return (await api.getTransactionById({ txId: txid })) as Transaction; + } catch (error) { + return null; + } +} + +export async function getTransactions(address: string) { + const config = new Configuration({ + basePath: ENV.STACKS_API, + }); + const api = new AccountsApi(config); + try { + return await api.getAccountTransactions({ principal: address }); + } catch (error) { + return null; + } +} + +export async function getPox4Events() { + const basePath = ENV.STACKS_API; + return fetch(`${basePath}/extended/v1/pox4/events`).then( + res => + res.json() as Promise<{ + results: { + block_height: number; + tx_id: string; + tx_index: number; + event_index: number; + stacker: string; + locked: string; + balance: string; + burnchain_unlock_height: string; + pox_addr: string; + pox_addr_raw: string; + name: string; + data: { + lock_amount: string; + lock_period: string; + start_burn_height: string; + unlock_burn_height: string; + signer_key: string; + end_cycle_id: string; + start_cycle_id: string; + }; + }[]; + }> + ); +} + +export function getAccount(key: string) { + const network = stacksNetworkApi(); + const address = getAddressFromPrivateKey( + key, + network.isMainnet() ? TransactionVersion.Mainnet : TransactionVersion.Testnet + ); + return { + key, + address, + signerPrivateKey: createStacksPrivateKey(key), // don't do this in production + signerPublicKey: bytesToHex(getPublicKey(createStacksPrivateKey(key)).data), + btcAddress: getAddress( + 'pkh', + hexToBytes(key).slice(0, 32), + network.isMainnet() ? NETWORK : TEST_NETWORK + ) as string, + client: new StackingClient(address, network), + }; +} + +async function getInfoStatus() { + const config = new Configuration({ + basePath: ENV.STACKS_API, + }); + const api = new InfoApi(config); + return await Promise.race([ + api.getStatus(), + new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), ENV.RETRY_INTERVAL)), + ]); +} + +export async function waitForNode() { + console.log('waiting for node...'); + await withRetry(1_000, getInfoStatus)(); +} + +export async function waitForNextCycle(poxInfo: PoxInfo) { + return await waitForBurnBlockHeight( + (poxInfo.current_burnchain_block_height as number) + poxInfo.next_reward_cycle_in + ); +} + +/** Wait until we're in the neglected part of the prepare phase */ +export async function waitForPreparePhase(poxInfo: PoxInfo, diff: number = 0) { + if (isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)) return; + + const effectiveHeight = + (poxInfo.current_burnchain_block_height as number) - poxInfo.first_burnchain_block_height; + const pos = effectiveHeight % poxInfo.reward_cycle_length; + const blocksUntilPreparePhase = poxInfo.reward_phase_block_length - pos + 1; + return waitForBurnBlockHeight( + (poxInfo.current_burnchain_block_height as number) + blocksUntilPreparePhase + diff + ); +} + +export async function waitForRewardPhase(poxInfo: PoxInfo) { + if (!isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)) return; + + const effectiveHeight = + (poxInfo.current_burnchain_block_height as number) - poxInfo.first_burnchain_block_height; + const pos = effectiveHeight % poxInfo.reward_cycle_length; + const blocksUntilRewardPhase = poxInfo.reward_cycle_length - pos; + return waitForBurnBlockHeight( + (poxInfo.current_burnchain_block_height as number) + blocksUntilRewardPhase + ); +} + +// export async function waitForCycle(cycle: number) {} + /** * Waits until the Stacks node reports the next nonce for the sender STX address. * @param currentNonce - Current nonce @@ -43,13 +256,26 @@ export async function getNextNonce(fromStacksNode: boolean = true): Promise { let next: number = currentNonce; - do { + while (next != currentNonce + 1) { await timeout(interval); next = await getNextNonce(); - } while (next != currentNonce + 1); + } +} + +/** Waits until the burn block height is reached */ +export async function waitForBurnBlockHeight( + burnBlockHeight: number, + interval: number = ENV.POLL_INTERVAL +): Promise { + let height: number = -1; + while (height < burnBlockHeight) { + await timeout(interval); + height = await getBurnBlockHeight(); + console.log('waiting', height, '<', burnBlockHeight); + } } export async function broadcastAndWaitForTransaction( @@ -61,6 +287,14 @@ export async function broadcastAndWaitForTransaction( const broadcast = await broadcastTransaction(tx, network); logger.debug(`Broadcast: 0x${broadcast.txid}`); + + if (broadcast.error) { + logger.error(broadcast.error); + if (broadcast.reason) logger.error(broadcast.reason); + if (broadcast.reason_data) logger.error(broadcast.reason_data); + throw 'broadcast failed'; + } + const subscription = socketClient.subscribeTransaction(`0x${broadcast.txid}`, tx => { if ('block_hash' in tx) { logger.debug(`Confirmed: 0x${broadcast.txid}`); @@ -75,3 +309,29 @@ export async function broadcastAndWaitForTransaction( socketClient.socket.close(); return result; } + +export const waitForTransaction = withTimeout( + ENV.STACKS_TX_TIMEOUT, + async (txid: string): Promise => { + const socketClient = newSocketClient(); + const txWaiter = waiter(); + + const subscription = socketClient.subscribeTransaction(`0x${txid}`, tx => { + if ('block_hash' in tx) { + logger.debug(`Confirmed: 0x${txid}`); + txWaiter.finish(tx); + } else if (tx.tx_status == 'pending') { + logger.debug(`Mempool: 0x${txid}`); + } + }); + // const tx = await getTransaction(txid); + // const result = tx?.tx_status === 'success' ? tx : await txWaiter; + + try { + return await txWaiter; + } finally { + subscription.unsubscribe(); + socketClient.socket.close(); + } + } +); diff --git a/src/tests/naka.test.ts b/src/tests/naka.test.ts new file mode 100644 index 0000000..0821473 --- /dev/null +++ b/src/tests/naka.test.ts @@ -0,0 +1,233 @@ +import { StacksTestnet } from '@stacks/network'; +import { PoxInfo, StackingClient } from '@stacks/stacking'; +import { getNonce } from '@stacks/transactions'; +import { Wallet, generateNewAccount, generateWallet } from '@stacks/wallet-sdk'; +import * as crypto from 'crypto'; +import { ENV } from '../env'; +import { getAccount, waitForRewardPhase } from '../helpers'; +import { withRetry } from '../utils'; + +jest.setTimeout(1_000_000_000); + +describe('nakamoto pox-4', () => { + const network = new StacksTestnet({ + // url: 'https://api.nakamoto.testnet.hiro.so', + fetchFn: withRetry(5, fetch), + }); + + let wallet: Wallet; + let poxInfo: PoxInfo; + + const bob = getAccount(ENV.SENDER_KEY); + + beforeAll(async () => { + wallet = await generateWallet({ + secretKey: + 'switch hazard add rare render aim pull unlock teach boss parrot mistake bargain fall system blame find grid matrix sentence season sudden please tobacco', + password: '', + }); + wallet = Array.from({ length: 7 }).reduce((acc: Wallet) => generateNewAccount(acc), wallet); + }); + + test('get pox info', async () => { + const client = new StackingClient('', network); + poxInfo = await client.getPoxInfo(); + console.log(poxInfo); + console.log('blocks_until_prepare_phase', poxInfo.next_cycle.blocks_until_prepare_phase); + }); + + // test get signer info + test('get signer info', () => { + const signer = getAccount(wallet.accounts[0].stxPrivateKey); + console.log(signer); + }); + + test('get account status', async () => { + const status = await bob.client.getStatus(); + console.log(status); + + const balance = await bob.client.getAccountBalanceLocked(); + const locked = await bob.client.getAccountBalanceLocked(); + console.log('locked', locked); + + const extended = await bob.client.getAccountExtendedBalances(); + console.log('extended', extended); + + poxInfo = await bob.client.getPoxInfo(); + console.log('min_threshold_ustx', poxInfo.next_cycle.min_threshold_ustx); + console.log('min_amount_ustx', poxInfo.min_amount_ustx); + + if ( + balance < (BigInt(poxInfo.next_cycle.min_threshold_ustx) * 105n) / 100n || + balance < (BigInt(poxInfo.min_amount_ustx) * 105n) / 100n + ) + throw new Error('not enough balance'); + }); + + test('bob stack-stx', async () => { + const bob = getAccount(ENV.SENDER_KEY); + const signer = getAccount(wallet.accounts[0].stxPrivateKey); + + // PREP + const client = new StackingClient(bob.address, network); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + + // TRANSACTION (stack-stx) + const stackHeight = poxInfo.current_burnchain_block_height as number; + const currentCycle = poxInfo.reward_cycle_id; + console.log('current-cycle', currentCycle); + const nextCycle = currentCycle + 1; + const lockPeriod = 4; + const amount = (BigInt(poxInfo.next_cycle.min_threshold_ustx) * 105n) / 100n; + console.log('amount', amount); + const authId = crypto.randomBytes(1)[0]; + console.log('authId', authId); + const signature = client.signPoxSignature({ + topic: 'stack-stx', + period: lockPeriod, + rewardCycle: currentCycle, + poxAddress: bob.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount, + authId, + }); + console.log('sig', signature); + const { txid } = await client.stack({ + amountMicroStx: amount, + poxAddress: bob.btcAddress, + cycles: lockPeriod, + burnBlockHeight: stackHeight, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId, + privateKey: bob.key, + }); + console.log('txid', txid); + // naka e9da87b229e75553797bcce86bc70cab807c802d53e0abc4e81ff4b77874ef4a + // testnet 1f18f067b6cae4aa3fbb10bd938b8bceaabefa741346dc3ec686d66622893ae1 -- not enough locked + // testnet 99416f429a04a13c5736965023e543b56143bb6cb77b0678000f00fa360eccfa -- more than availabe funds + // testnet 9b77d3eb5c1d1fcc5b07fe7c6b67d2199aee766c6db72708f3ce1166fbb8d069 -- not found + // testnet 7be56648a46c89df12e0ac980a8dd659c6532d61fe677ad228292f8dcbb0d16a -- not enough funds + // testnet e81903115328f7f1a241437c6cd93fc480ed42d0135699ef54db68ca53909dc6 + return; + + // // CHECK POX-4 EVENTS + // const { results } = await getPox4Events(); + // const datas = results.map(r => r.data).filter(d => d.signer_key.includes(bob.signerPublicKey)); + + // expect(datas).toContainEqual( + // expect.objectContaining({ + // start_cycle_id: nextCycle.toString(), + // end_cycle_id: (nextCycle + lockPeriod).toString(), + // }) + // ); + + // // CHECK UNLOCK HEIGHT AND WAIT FOR UNLOCK + // let info = await client.getStatus(); + // if (!info.stacked) throw 'not stacked'; + + // expect(info.details.unlock_height).toBeGreaterThan(0); + // expect(info.details.unlock_height).toBe( + // stackHeight - + // (stackHeight % poxInfo.reward_cycle_length) + + // poxInfo.reward_cycle_length * (lockPeriod + 1) + // ); + // expect(burnHeightToRewardCycle(info.details.unlock_height, poxInfo)).toBe( + // nextCycle + lockPeriod + // ); // same as end_cycle_id + + // if (ENV.REGTEST_SKIP_UNLOCK) return; + // await waitForBurnBlockHeight(info.details.unlock_height + 2); + // info = await client.getStatus(); + // expect(info.stacked).toBeFalsy(); + + // // ENSURE REWARDS + // const reward = (await getRewards(bob.btcAddress))[0]; + // expect(reward).toBeDefined(); + // expect(reward.burn_block_height).toBeGreaterThan(stackHeight); + }); + + test('pool delegate', async () => { + const pool = getAccount(wallet.accounts[4].stxPrivateKey); + const amy = getAccount(wallet.accounts[5].stxPrivateKey); + const barb = getAccount(wallet.accounts[6].stxPrivateKey); + + poxInfo = await pool.client.getPoxInfo(); + + const amount = (BigInt(poxInfo.min_amount_ustx) * 75n) / 100n; + const nextCycle = poxInfo.reward_cycle_id + 1; + const delegateStackCycles = 2; + + // TRANSACTION (amy delegate-stack) + const { txid: amyDelegate } = await amy.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: amy.key, + }); + console.log('amy delegate', amyDelegate); // e0e159d00474bca5ad1fe73475dc79632443ea5d29b6763678d614232d8d26c6 + + // TRANSACTION (barb delegate-stack) + const { txid: barbDelegate } = await barb.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: barb.key, + }); + console.log('barb delegate', barbDelegate); // 06369da5c2b56479760e1aec2db4d68f1ded2d3c37ed0dfd333257b5fb85af37 + + // TRANSACTION (pool amy stack-stx) + let poolNonce = await getNonce(pool.address, network); + const { txid: amyPool } = await pool.client.delegateStackStx({ + stacker: amy.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: delegateStackCycles, + privateKey: pool.key, + nonce: poolNonce++, + }); + console.log('amy pool', amyPool); // b5d348e94e0215d18d4e73085d1d09a0c212f1271066ef0755d3b57c6ed717e0 + + // TRANSACTION (pool barb stack-stx) + const { txid: barbPool } = await pool.client.delegateStackStx({ + stacker: barb.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: delegateStackCycles, + privateKey: pool.key, + nonce: poolNonce++, + }); + console.log('barb pool', barbPool); // d8802ec4c43ac3d990290875432163e05da5e00191c1aca6408cd992f6b7fce2 + + // TRANSACTION (pool commit) + const authId = crypto.randomBytes(1)[0]; + console.log('authId', authId); + const signature = pool.client.signPoxSignature({ + topic: 'agg-commit', + period: 1, + rewardCycle: nextCycle, + poxAddress: pool.btcAddress, + signerPrivateKey: pool.signerPrivateKey, + maxAmount: amount * 3n, + authId, + }); + const { txid: poolCommit } = await pool.client.stackAggregationCommitIndexed({ + poxAddress: pool.btcAddress, + rewardCycle: nextCycle, + signerKey: pool.signerPublicKey, + signerSignature: signature, + maxAmount: amount * 3n, + authId, + privateKey: pool.key, + nonce: poolNonce++, + }); + console.log('pool commit', poolCommit); // 880f1459234d2435b080a99e485d86f3fac432e8f7dcd760c23546435b492054 + }); +}); diff --git a/src/tests/regtest-caller.test.ts b/src/tests/regtest-caller.test.ts new file mode 100644 index 0000000..76c5351 --- /dev/null +++ b/src/tests/regtest-caller.test.ts @@ -0,0 +1,490 @@ +import { RequestContext, StacksDevnet, createFetchFn } from '@stacks/network'; +import { PoxInfo, StackingClient } from '@stacks/stacking'; +import { ENV } from '../env'; +import { + broadcastAndWaitForTransaction, + getAccount, + waitForBurnBlockHeight, + waitForNode, + waitForTransaction, +} from '../helpers'; +import { startRegtestEnv, stopRegtestEnv, withRetry } from '../utils'; +import { Cl, makeContractCall, makeContractDeploy } from '@stacks/transactions'; +import fs from 'fs'; +import { ResponseContext } from '@stacks/blockchain-api-client'; + +jest.setTimeout(1_000_000_000); + +describe('regtest-env pox-4 caller', () => { + const network = new StacksDevnet({ fetchFn: withRetry(3, fetch) }); // this test only works on regtest-env + + let poxInfo: PoxInfo; + let client: StackingClient; + + const pool = getAccount(ENV.REGTEST_KEYS[0]) as ReturnType & { + wrappedClient: StackingClient; + }; + + beforeEach(async () => { + // SETUP + await startRegtestEnv(); + await waitForNode(); + + // POX-4 PREP + client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation + 1); + + await deployWrapperContract(); + + poxInfo = await client.getPoxInfo(); + + // WRAPPER MIDDLEWARE + const redirectContract = async (context: ResponseContext) => { + if (!context.url.endsWith('v2/pox')) return; // Skip middleware if not pox endpoint + + let data = await context.response.text(); + data = data.replaceAll(poxInfo.contract_id, `${pool.address}.pox-4`); + + return new Response(data, { + status: context.response.status, + statusText: context.response.statusText, + headers: context.response.headers, + }); + }; + + pool.wrappedClient = new StackingClient( + pool.address, + new StacksDevnet({ fetchFn: withRetry(3, createFetchFn(fetch, { post: redirectContract })) }) + ); + }); + + afterEach(async () => { + await stopRegtestEnv(); + }); + + async function deployWrapperContract() { + const tx = await makeContractDeploy({ + codeBody: fs.readFileSync('src/contracts/pox-4-wrapper.clar', 'utf8'), + contractName: 'pox-4', + anchorMode: 'onChainOnly', + network, + senderKey: pool.key, + }); + + const deployTx = await broadcastAndWaitForTransaction(tx, network); + expect(deployTx.tx_result.repr).toContain('(ok'); + expect(deployTx.tx_status).toEqual('success'); + } + + test('Pool can deploy wrapper contract', async () => { + // TEST CASE + // pool deploys the wrapper contract + await deployWrapperContract(); + }); + + test('Pool stacker can set pool delegate permission (allow-contract-caller), Pool stacker can remove pool delegate permission (disallow-contract-caller)', async () => { + // TEST CASE + // alice tries to use the pool as a caller + // the transaction should fail + // alice allows the pool as a caller + // alice tries to use the pool as a caller (delegate-stx) + // the transaction should succeed + // alice tries to use the pool as a caller (revoke-delegate-stx) + // the transaction should succeed + // alice disallows the pool as a caller + // alice tries to use the pool as a caller + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[1]); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (wrapped delegate-stx) + const { txid: delegateBeforeAllow } = await pool.wrappedClient.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const delegateBeforeAllowTx = await waitForTransaction(delegateBeforeAllow); + expect(delegateBeforeAllowTx.tx_result.repr).toContain('(err'); + expect(delegateBeforeAllowTx.tx_status).toEqual('abort_by_response'); + + const [contractAddress, contractName] = client.parseContractId(poxInfo.contract_id); + + // TRANSACTION (alice allow-contract-caller) + const tx1 = await makeContractCall({ + contractAddress, + contractName, + functionName: 'allow-contract-caller', + functionArgs: [Cl.contractPrincipal(pool.address, 'pox-4'), Cl.none()], + anchorMode: 'onChainOnly', + network, + senderKey: alice.key, + }); + const allowTx = await broadcastAndWaitForTransaction(tx1, network); + expect(allowTx.tx_result.repr).toContain('(ok'); + expect(allowTx.tx_status).toEqual('success'); + + // TRANSACTION (wrapped delegate-stx) + const { txid: delegateAfterAllow } = await pool.wrappedClient.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const delegateAfterAllowTx = await waitForTransaction(delegateAfterAllow); + expect(delegateAfterAllowTx.tx_result.repr).toContain('(ok'); + expect(delegateAfterAllowTx.tx_status).toEqual('success'); + + // TRANSACTION (wrapped revoke-delegate-stx) + const { txid: revokeDelegate } = await pool.wrappedClient.revokeDelegateStx({ + privateKey: alice.key, + }); + const revokeDelegateTx = await waitForTransaction(revokeDelegate); + expect(revokeDelegateTx.tx_result.repr).toContain('(ok'); + expect(revokeDelegateTx.tx_status).toEqual('success'); + + // TRANSACTION (alice disallow-contract-caller) + const tx2 = await makeContractCall({ + contractAddress, + contractName, + functionName: 'disallow-contract-caller', + functionArgs: [Cl.contractPrincipal(pool.address, 'pox-4')], + anchorMode: 'onChainOnly', + network, + senderKey: alice.key, + }); + const disallowTx = await broadcastAndWaitForTransaction(tx2, network); + expect(disallowTx.tx_result.repr).toContain('(ok'); + expect(disallowTx.tx_status).toEqual('success'); + + // TRANSACTION (wrapped delegate-stx) + const { txid: delegateAfterDisallow } = await pool.wrappedClient.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const delegateAfterDisallowTx = await waitForTransaction(delegateAfterDisallow); + expect(delegateAfterDisallowTx.tx_result.repr).toContain('(err'); + expect(delegateAfterDisallowTx.tx_status).toEqual('abort_by_response'); + }); + + describe('caller', () => { + const alice = getAccount(ENV.REGTEST_KEYS[1]); + + test('Allowed contract cannot remove permission', async () => { + // TEST CASE + // alice allows the pool + // alice tries to disallow pool via a caller (via wrapper contract) + // the transaction should fail + + // TRANSACTION (alice allow-contract-caller) + const [contractAddress, contractName] = client.parseContractId(poxInfo.contract_id); + const tx = await makeContractCall({ + contractAddress, + contractName, + functionName: 'allow-contract-caller', + functionArgs: [Cl.contractPrincipal(pool.address, 'pox-4'), Cl.none()], + anchorMode: 'onChainOnly', + network, + senderKey: alice.key, + }); + const allowTx = await broadcastAndWaitForTransaction(tx, network); + expect(allowTx.tx_result.repr).toContain('(ok'); + expect(allowTx.tx_status).toEqual('success'); + + // TRANSACTION (wrapped disallow-contract-caller) + const tx2 = await makeContractCall({ + contractAddress: pool.address, + contractName: 'pox-4', + functionName: 'disallow-contract-caller', + functionArgs: [Cl.contractPrincipal(pool.address, 'pox-4')], + anchorMode: 'onChainOnly', + network, + senderKey: alice.key, + }); + const disallowTx = await broadcastAndWaitForTransaction(tx2, network); + expect(disallowTx.tx_result.repr).toContain('(err'); + expect(disallowTx.tx_status).toEqual('abort_by_response'); + }); + + test('Other contract cannot remove permission', async () => { + // TEST CASE + // alice allows bob random + // alice tries to disallow pool via a caller (via wrapper contract) + // the transaction should fail + + const bob = getAccount(ENV.REGTEST_KEYS[2]); + + // TRANSACTION (alice allow-contract-caller) + const [contractAddress, contractName] = client.parseContractId(poxInfo.contract_id); + const tx = await makeContractCall({ + contractAddress, + contractName, + functionName: 'allow-contract-caller', + functionArgs: [Cl.contractPrincipal(bob.address, 'random'), Cl.none()], + anchorMode: 'onChainOnly', + network, + senderKey: alice.key, + }); + const allowTx = await broadcastAndWaitForTransaction(tx, network); + expect(allowTx.tx_result.repr).toContain('(ok'); + expect(allowTx.tx_status).toEqual('success'); + + // TRANSACTION (wrapped disallow-contract-caller) + const tx2 = await makeContractCall({ + contractAddress: pool.address, + contractName: 'pox-4', + functionName: 'disallow-contract-caller', + functionArgs: [Cl.contractPrincipal(bob.address, 'random')], + anchorMode: 'onChainOnly', + network, + senderKey: alice.key, + }); + const disallowTx = await broadcastAndWaitForTransaction(tx2, network); + expect(disallowTx.tx_result.repr).toContain('(err'); + expect(disallowTx.tx_status).toEqual('abort_by_response'); + }); + + test('Allowed contract can delegate for the stacker', async () => { + // TEST CASE + // alice allows the pool + // alice delegate-stx (via wrapper contract) + // pool delegate-stack-stack + // pool commits + // alice is locked + + // TRANSACTION (alice allow-contract-caller) + const [contractAddress, contractName] = client.parseContractId(poxInfo.contract_id); + const tx = await makeContractCall({ + contractAddress, + contractName, + functionName: 'allow-contract-caller', + functionArgs: [Cl.contractPrincipal(pool.address, 'pox-4'), Cl.none()], + anchorMode: 'onChainOnly', + network, + senderKey: alice.key, + }); + const allowTx = await broadcastAndWaitForTransaction(tx, network); + expect(allowTx.tx_result.repr).toContain('(ok'); + expect(allowTx.tx_status).toEqual('success'); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (wrapped delegate-stx) + const { txid: delegate } = await pool.wrappedClient.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const delegateTx = await waitForTransaction(delegate); + expect(delegateTx.tx_result.repr).toContain('(ok'); + expect(delegateTx.tx_status).toEqual('success'); + + // TRANSACTION (pool delegate-stack-stx) + const { txid: delegateStack } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 1, + privateKey: pool.key, + }); + const delegateStackTx = await waitForTransaction(delegateStack); + expect(delegateStackTx.tx_result.repr).toContain('(ok'); + expect(delegateStackTx.tx_status).toEqual('success'); + + // TRANSACTION (pool commit) + const signature = pool.client.signPoxSignature({ + topic: 'agg-commit', + period: 1, + rewardCycle: poxInfo.reward_cycle_id + 1, + authId: 0, + maxAmount: amount, + poxAddress: pool.btcAddress, + signerPrivateKey: pool.signerPrivateKey, + }); + const { txid: commit } = await pool.client.stackAggregationCommitIndexed({ + poxAddress: pool.btcAddress, + rewardCycle: poxInfo.reward_cycle_id + 1, + signerKey: pool.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId: 0, + privateKey: pool.key, + }); + const commitTx = await waitForTransaction(commit); + expect(commitTx.tx_result.repr).toContain('(ok'); + expect(commitTx.tx_status).toEqual('success'); + + // CHECK LOCKED + expect(await alice.client.getAccountBalanceLocked()).toBe(amount); + }); + + test('Allowed contract can revoke delegate status for the stacker', async () => { + // TEST CASE + // alice allows the pool + // alice delegate-stx + // alice revoke-delegate-stx (via wrapper contract) + // alice is not delegated + + // TRANSACTION (alice allow-contract-caller) + const [contractAddress, contractName] = client.parseContractId(poxInfo.contract_id); + const tx = await makeContractCall({ + contractAddress, + contractName, + functionName: 'allow-contract-caller', + functionArgs: [Cl.contractPrincipal(pool.address, 'pox-4'), Cl.none()], + anchorMode: 'onChainOnly', + network, + senderKey: alice.key, + }); + const allowTx = await broadcastAndWaitForTransaction(tx, network); + expect(allowTx.tx_result.repr).toContain('(ok'); + expect(allowTx.tx_status).toEqual('success'); + + // TRANSACTION (wrapped revoke-delegate-stx) + const { txid: revokeDelegate } = await pool.wrappedClient.revokeDelegateStx({ + privateKey: alice.key, + }); + const revokeDelegateTx = await waitForTransaction(revokeDelegate); + expect(revokeDelegateTx.tx_result.repr).toContain('(ok'); + expect(revokeDelegateTx.tx_status).toEqual('success'); + + // CHECK NOT DELEGATED + const delegationInfo = await alice.client.getDelegationStatus(); + expect(delegationInfo.delegated).toBe(false); + }); + + test('Other contract cannot revoke delegate status for the stacker', async () => { + // TEST CASE + // alice allows bob random + // alice delegate-stx + // alice revoke-delegate-stx (via wrapper contract) + // the transaction should fail + + const bob = getAccount(ENV.REGTEST_KEYS[2]); + + // TRANSACTION (alice allow-contract-caller) + const [contractAddress, contractName] = client.parseContractId(poxInfo.contract_id); + const tx = await makeContractCall({ + contractAddress, + contractName, + functionName: 'allow-contract-caller', + functionArgs: [Cl.contractPrincipal(bob.address, 'random'), Cl.none()], + anchorMode: 'onChainOnly', + network, + senderKey: alice.key, + }); + const allowTx = await broadcastAndWaitForTransaction(tx, network); + expect(allowTx.tx_result.repr).toContain('(ok'); + expect(allowTx.tx_status).toEqual('success'); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate-stx) + const { txid: delegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const delegateTx = await waitForTransaction(delegate); + expect(delegateTx.tx_result.repr).toContain('(ok'); + expect(delegateTx.tx_status).toEqual('success'); + + // TRANSACTION (wrapped revoke-delegate-stx) + const { txid: revokeDelegate } = await pool.wrappedClient.revokeDelegateStx({ + privateKey: alice.key, + }); + const revokeDelegateTx = await waitForTransaction(revokeDelegate); + expect(revokeDelegateTx.tx_result.repr).toContain('(err'); + expect(revokeDelegateTx.tx_status).toEqual('abort_by_response'); + }); + + // test('Allowed contract can delegate-stack-stx', async () => { + // // TEST CASE + // // alice allows the pool + // // alice delegate-stx (via wrapper contract) + // // alice delegate-stack-stx (via wrapper contract) + // // pool commits + // // alice is locked + + // // TRANSACTION (alice allow-contract-caller) + // const [contractAddress, contractName] = client.parseContractId(poxInfo.contract_id); + // const tx = await makeContractCall({ + // contractAddress, + // contractName, + // functionName: 'allow-contract-caller', + // functionArgs: [Cl.contractPrincipal(pool.address, 'pox-4'), Cl.none()], + // anchorMode: 'onChainOnly', + // network, + // senderKey: alice.key, + // }); + // const allowTx = await broadcastAndWaitForTransaction(tx, network); + // expect(allowTx.tx_result.repr).toContain('(ok'); + // expect(allowTx.tx_status).toEqual('success'); + + // const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // // TRANSACTION (wrapped delegate-stx) + // const { txid: delegate } = await pool.wrappedClient.delegateStx({ + // amountMicroStx: amount, + // delegateTo: pool.address, + // poxAddress: pool.btcAddress, + // privateKey: alice.key, + // }); + // const delegateTx = await waitForTransaction(delegate); + // expect(delegateTx.tx_result.repr).toContain('(ok'); + // expect(delegateTx.tx_status).toEqual('success'); + + // // + + // // TRANSACTION (wrapped delegate-stack-stx) + // const { txid: delegateStack } = await pool.wrappedClient.delegateStackStx({ + // stacker: alice.address, + // amountMicroStx: amount, + // poxAddress: pool.btcAddress, + // burnBlockHeight: poxInfo.current_burnchain_block_height, + // cycles: 1, + // privateKey: alice.key, + // }); + // const delegateStackTx = await waitForTransaction(delegateStack); + // expect(delegateStackTx.tx_result.repr).toContain('(ok'); + // expect(delegateStackTx.tx_status).toEqual('success'); + + // // TRANSACTION (pool commit) + // const signature = pool.client.signPoxSignature({ + // topic: 'agg-commit', + // period: 1, + // rewardCycle: poxInfo.reward_cycle_id + 1, + // authId: 0, + // maxAmount: amount, + // poxAddress: pool.btcAddress, + // signerPrivateKey: pool.signerPrivateKey, + // }); + // const { txid: commit } = await pool.client.stackAggregationCommitIndexed({ + // poxAddress: pool.btcAddress, + // rewardCycle: poxInfo.reward_cycle_id + 1, + // signerKey: pool.signerPublicKey, + // signerSignature: signature, + // maxAmount: amount, + // authId: 0, + // privateKey: pool.key, + // }); + // const commitTx = await waitForTransaction(commit); + // expect(commitTx.tx_result.repr).toContain('(ok'); + // expect(commitTx.tx_status).toEqual('success'); + + // // CHECK LOCKED + // expect(await alice.client.getAccountBalanceLocked()).toBe(amount); + // }); + }); +}); diff --git a/src/tests/regtest.test.ts b/src/tests/regtest.test.ts new file mode 100644 index 0000000..ec30c3c --- /dev/null +++ b/src/tests/regtest.test.ts @@ -0,0 +1,2942 @@ +import { timeout } from '@hirosystems/api-toolkit'; +import { bytesToHex } from '@stacks/common'; +import { StacksDevnet } from '@stacks/network'; +import { PoxInfo, StackingClient, poxAddressToTuple } from '@stacks/stacking'; +import { + Cl, + ClarityType, + ResponseOkCV, + SignedContractCallOptions, + UIntCV, + broadcastTransaction, + callReadOnlyFunction, + getNonce, + makeContractCall, +} from '@stacks/transactions'; +import * as crypto from 'crypto'; +import { ENV } from '../env'; +import { + broadcastAndWaitForTransaction, + burnHeightToRewardCycle, + getAccount, + getPox4Events, + getRewards, + isInPreparePhase, + waitForBurnBlockHeight, + waitForNextCycle, + waitForNode, + waitForPreparePhase, + waitForRewardPhase, + waitForTransaction, +} from '../helpers'; +import { startRegtestEnv, stopRegtestEnv, storeEventsTsv, withRetry } from '../utils'; + +jest.setTimeout(1_000_000_000); + +describe('regtest-env pox-4', () => { + const network = new StacksDevnet({ fetchFn: withRetry(3, fetch) }); // this test only works on regtest-env + let poxInfo: PoxInfo; + + beforeEach(async () => { + await startRegtestEnv(); + await waitForNode(); + }); + + afterEach(async () => { + await stopRegtestEnv(); + }); + + test('stack-stx (in reward-phase)', async () => { + // TEST CASE + // steph is a solo stacker and stacks in a reward-phase + // but steph doesn't run a signer, so we need to use a different signer key + const steph = getAccount(ENV.REGTEST_KEYS[0]); + const signer = getAccount(ENV.SIGNER_KEY); + + // PREP + const client = new StackingClient(steph.address, network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + // TRANSACTION (stack-stx) + const stackHeight = poxInfo.current_burnchain_block_height as number; + const currentCycle = poxInfo.reward_cycle_id; + const nextCycle = currentCycle + 1; + const lockPeriod = 1; + const amount = BigInt(poxInfo.min_amount_ustx) * 3n; + const authId = crypto.randomBytes(1)[0]; + const signature = client.signPoxSignature({ + topic: 'stack-stx', + period: lockPeriod, + rewardCycle: currentCycle, + poxAddress: steph.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount, + authId, + }); + const { txid } = await client.stack({ + amountMicroStx: amount, + poxAddress: steph.btcAddress, + cycles: lockPeriod, + burnBlockHeight: stackHeight, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId, + privateKey: steph.key, + }); + console.log('txid', txid); + + const result = await waitForTransaction(txid); + expect(result.tx_result.repr).toContain('(ok'); + expect(result.tx_status).toBe('success'); + + await timeout(1000); // current-cycle: 5 + await storeEventsTsv('S1'); // snapshot 1 (stacking tx was successful) + + // CHECK POX-4 EVENTS + const { results } = await getPox4Events(); + const datas = results + .map(r => r.data) + .filter(d => d.signer_key.includes(signer.signerPublicKey)); + + expect(datas).toContainEqual( + expect.objectContaining({ + start_cycle_id: nextCycle.toString(), + end_cycle_id: (nextCycle + lockPeriod).toString(), + }) + ); + + // CHECK UNLOCK HEIGHT AND WAIT FOR UNLOCK + let info = await client.getStatus(); + if (!info.stacked) throw 'not stacked'; + + expect(info.details.unlock_height).toBeGreaterThan(0); + expect(info.details.unlock_height).toBe( + stackHeight - + (stackHeight % poxInfo.reward_cycle_length) + + poxInfo.reward_cycle_length * (lockPeriod + 1) + ); + expect(burnHeightToRewardCycle(info.details.unlock_height, poxInfo)).toBe( + nextCycle + lockPeriod + ); // same as end_cycle_id + + poxInfo = await client.getPoxInfo(); + await waitForPreparePhase(poxInfo); + + // height: 116 + await storeEventsTsv('S2'); // snapshot 2 (in prepare phase, pox-anchor block was mined, pox-set has been sent for cycle 6) + + await waitForNextCycle(poxInfo); + poxInfo = await client.getPoxInfo(); + + // height: 120, current-cycle: 6 + await storeEventsTsv('S3'); // snapshot 3 (steph is stacked in the current cycle) + + if (ENV.REGTEST_SKIP_UNLOCK) return; + await waitForBurnBlockHeight(info.details.unlock_height + 2); + info = await client.getStatus(); + expect(info.stacked).toBeFalsy(); + + // ENSURE REWARDS + const reward = (await getRewards(steph.btcAddress))[0]; + expect(reward).toBeDefined(); + expect(reward.burn_block_height).toBeGreaterThan(stackHeight); + + // EXPORT EVENTS + await storeEventsTsv(); + }); + + test('stack-stx (before prepare-phase)', async () => { + // TEST CASE + // steph is a solo stacker and stacks on a prepare-phase start (not deep in + // the prepare phase) + // but steph doesn't run a signer, so we need to use a different signer key + const steph = getAccount(ENV.REGTEST_KEYS[0]); + const signer = getAccount(ENV.SIGNER_KEY); + + // PREP + const client = new StackingClient(steph.address, network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); // ensure we are not already somewhere in the prepare phase + poxInfo = await client.getPoxInfo(); + await waitForPreparePhase(poxInfo, -1); // one before real prepare phase + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + expect( + isInPreparePhase((poxInfo.current_burnchain_block_height as number) + 1, poxInfo) + ).toBeTruthy(); + + // TRANSACTION (stack-stx) + const stackHeight = poxInfo.current_burnchain_block_height as number; + const currentCycle = poxInfo.reward_cycle_id; + const nextCycle = currentCycle + 1; + const lockPeriod = 1; + const amount = BigInt(poxInfo.min_amount_ustx) * 3n; + const authId = crypto.randomBytes(1)[0]; + const signature = client.signPoxSignature({ + topic: 'stack-stx', + period: lockPeriod, + rewardCycle: currentCycle, + poxAddress: steph.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount, + authId, + }); + const { txid } = await client.stack({ + amountMicroStx: amount, + poxAddress: steph.btcAddress, + cycles: lockPeriod, + burnBlockHeight: stackHeight, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId, + privateKey: steph.key, + }); + console.log('txid', txid); + + const result = await waitForTransaction(txid); + expect(result.tx_result.repr).toContain('(ok'); + expect(result.tx_status).toBe('success'); + + // CHECK POX-4 EVENTS + const { results } = await getPox4Events(); + const datas = results + .map(r => r.data) + .filter(d => d.signer_key.includes(signer.signerPublicKey)); + + // todo: this is incorrect on the stacks-node side currently, it shouldn't have the prepare offset included yet + expect(datas).toContainEqual( + expect.objectContaining({ + start_cycle_id: (nextCycle + 1).toString(), // + prepare offset + end_cycle_id: (nextCycle + lockPeriod).toString(), + }) + ); + + // CHECK UNLOCK HEIGHT AND WAIT FOR UNLOCK + let info = await client.getStatus(); + if (!info.stacked) throw 'not stacked'; + + expect(info.details.unlock_height).toBeGreaterThan(0); + expect(info.details.unlock_height).toBe( + stackHeight - + (stackHeight % poxInfo.reward_cycle_length) + + poxInfo.reward_cycle_length * (lockPeriod + 1) + ); + expect(burnHeightToRewardCycle(info.details.unlock_height, poxInfo)).toBe( + nextCycle + lockPeriod + ); // same as end_cycle_id + + poxInfo = await client.getPoxInfo(); + await waitForNextCycle(poxInfo); + await storeEventsTsv('S1'); // snapshot 1 (steph is stacked in the current cycle) + + if (ENV.REGTEST_SKIP_UNLOCK) return; + await waitForBurnBlockHeight(info.details.unlock_height + 2); + info = await client.getStatus(); + expect(info.stacked).toBeFalsy(); + + // ENSURE REWARDS + const reward = (await getRewards(steph.btcAddress))[0]; + expect(reward).toBeDefined(); + expect(reward.burn_block_height).toBeGreaterThan(stackHeight); + + // EXPORT EVENTS + await storeEventsTsv(); + }); + + test('stack-stx (in prepare-phase)', async () => { + // TEST CASE + // steph is a solo stacker and attempts to stack 1 block after the + // prepare-phase has started, which is considered a neglected prepare-phase + // for stacking -- this should result in no rewards being paid out. + // but steph doesn't run a signer, so we need to use a different signer key + const steph = getAccount(ENV.REGTEST_KEYS[0]); + const signer = getAccount(ENV.SIGNER_KEY); + + // PREP + const client = new StackingClient(steph.address, network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForPreparePhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect( + isInPreparePhase((poxInfo.current_burnchain_block_height as number) - 1, poxInfo) + ).toBeFalsy(); + expect( + isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo) + ).toBeTruthy(); + + // TRANSACTION (stack-stx) + const stackHeight = poxInfo.current_burnchain_block_height as number; + const currentCycle = poxInfo.reward_cycle_id; + const nextCycle = currentCycle + 1; + const lockPeriod = 1; + const amount = BigInt(poxInfo.min_amount_ustx) * 3n; + const authId = crypto.randomBytes(1)[0]; + const signature = client.signPoxSignature({ + topic: 'stack-stx', + period: lockPeriod, + rewardCycle: currentCycle, + poxAddress: steph.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount, + authId, + }); + const { txid } = await client.stack({ + amountMicroStx: amount, + poxAddress: steph.btcAddress, + cycles: lockPeriod, + burnBlockHeight: stackHeight, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId, + privateKey: steph.key, + }); + console.log('txid', txid); + + const result = await waitForTransaction(txid); + expect(result.tx_result.repr).toContain('(ok'); + expect(result.tx_status).toBe('success'); + + // CHECK POX-4 EVENTS + const { results } = await getPox4Events(); + const datas = results + .map(r => r.data) + .filter(d => d.signer_key.includes(signer.signerPublicKey)); + + expect(datas).toContainEqual( + expect.objectContaining({ + start_cycle_id: (nextCycle + 1).toString(), // + prepare offset + end_cycle_id: (nextCycle + lockPeriod).toString(), + }) + ); + + // CHECK UNLOCK HEIGHT AND WAIT FOR UNLOCK + let info = await client.getStatus(); + if (!info.stacked) throw 'not stacked'; + + expect(info.details.unlock_height).toBeGreaterThan(0); + expect(info.details.unlock_height).toBe( + stackHeight - + (stackHeight % poxInfo.reward_cycle_length) + + poxInfo.reward_cycle_length * (lockPeriod + 1) + ); + expect(burnHeightToRewardCycle(info.details.unlock_height, poxInfo)).toBe( + nextCycle + lockPeriod + ); // same as end_cycle_id + + poxInfo = await client.getPoxInfo(); + await waitForNextCycle(poxInfo); + await storeEventsTsv('S1'); // snapshot 1 (steph is stacked, but didn't make it in time for rewards) + + if (ENV.REGTEST_SKIP_UNLOCK) return; + await waitForBurnBlockHeight(info.details.unlock_height + 2); + info = await client.getStatus(); + expect(info.stacked).toBeFalsy(); + + // ENSURE NO REWARDS + const rewards = await getRewards(steph.btcAddress); + expect(rewards.every(r => r.burn_block_height < stackHeight)).toBeTruthy(); // no new rewards + + // EXPORT EVENTS + await storeEventsTsv(); + }); + + test('stack-stx (reward-phase), stack-extend (reward-phase)', async () => { + // TEST CASE + // steph is a solo stacker and stacks in a reward-phase + // steph then extends in a reward-phase + // but steph doesn't run a signer, so we need to use a different signer key + const steph = getAccount(ENV.REGTEST_KEYS[0]); + const signer = getAccount(ENV.SIGNER_KEY); + + // PREP + const client = new StackingClient(steph.address, network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + // TRANSACTION (stack-stx) + const stackHeight = poxInfo.current_burnchain_block_height as number; + let currentCycle = poxInfo.reward_cycle_id; + let nextCycle = currentCycle + 1; + const lockPeriod = 2; + const amount = BigInt(poxInfo.min_amount_ustx) * 3n; + let authId = crypto.randomBytes(1)[0]; + let signature = client.signPoxSignature({ + topic: 'stack-stx', + period: lockPeriod, + rewardCycle: currentCycle, + poxAddress: steph.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount, + authId, + }); + const { txid } = await client.stack({ + amountMicroStx: amount, + poxAddress: steph.btcAddress, + cycles: lockPeriod, + burnBlockHeight: stackHeight, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId, + privateKey: steph.key, + }); + console.log('txid', txid); + + const result = await waitForTransaction(txid); + expect(result.tx_result.repr).toContain('(ok'); + expect(result.tx_status).toBe('success'); + + // CHECK POX-4 EVENTS + const { results } = await getPox4Events(); + let datas = results.map(r => r.data).filter(d => d.signer_key.includes(signer.signerPublicKey)); + + expect(datas).toContainEqual( + expect.objectContaining({ + start_cycle_id: nextCycle.toString(), + end_cycle_id: (nextCycle + lockPeriod).toString(), + }) + ); + + // CHECK STATUS AND WAIT FOR NEXT CYCLE + let status = await client.getStatus(); + if (!status.stacked) throw 'not stacked'; + const stackUnlock = status.details.unlock_height; + + poxInfo = await client.getPoxInfo(); + await waitForNextCycle(poxInfo); + await storeEventsTsv('S1'); // snapshot 1 (steph is stacked in the current cycle) + + poxInfo = await client.getPoxInfo(); + expect(poxInfo.reward_cycle_id).toBe(nextCycle); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + // TRANSACTION (stack-extend) + const extendHeight = poxInfo.current_burnchain_block_height as number; + const extendCycles = 1; + currentCycle = poxInfo.reward_cycle_id; + nextCycle = currentCycle + 1; + authId = crypto.randomBytes(1)[0]; + signature = client.signPoxSignature({ + topic: 'stack-extend', + period: extendCycles, + rewardCycle: currentCycle, + poxAddress: steph.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount, + authId, + }); + const { txid: txidExtend } = await client.stackExtend({ + extendCycles, + poxAddress: steph.btcAddress, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId, + privateKey: steph.key, + }); + console.log('txid', txidExtend); + + const resultExtend = await waitForTransaction(txidExtend); + expect(resultExtend.tx_result.repr).toContain('(ok'); + expect(resultExtend.tx_status).toBe('success'); + + // CHECK POX-4 EVENTS + const { results: resultsExtend } = await getPox4Events(); + datas = resultsExtend + .map(r => r.data) + .filter(d => d.signer_key.includes(signer.signerPublicKey)); + + expect(datas).toContainEqual( + expect.objectContaining({ + start_cycle_id: nextCycle.toString(), + end_cycle_id: (burnHeightToRewardCycle(stackUnlock, poxInfo) + extendCycles).toString(), + }) + ); + + // CHECK UNLOCK HEIGHT AND WAIT FOR UNLOCK + status = await client.getStatus(); + if (!status.stacked) throw 'not stacked'; + + expect(status.details.unlock_height).toBeGreaterThan(0); + expect(status.details.unlock_height).toBeGreaterThan(stackUnlock); + expect(status.details.unlock_height).toBe( + stackUnlock + poxInfo.reward_cycle_length * extendCycles + ); + + poxInfo = await client.getPoxInfo(); + await waitForNextCycle(poxInfo); + await storeEventsTsv('S2'); // snapshot 2 (steph is stacked and extended in the current cycle) + + if (ENV.REGTEST_SKIP_UNLOCK) return; + await waitForBurnBlockHeight(status.details.unlock_height + 2); // +1 is more correct, but often fails (race-condition?) + status = await client.getStatus(); + expect(status.stacked).toBeFalsy(); + + // ENSURE CORRECT REWARDS + const rewards = await getRewards(steph.btcAddress); + expect(rewards.filter(r => r.burn_block_height > stackHeight).length).toBeGreaterThan(0); + expect(rewards.filter(r => r.burn_block_height > extendHeight).length).toBeGreaterThan(0); + + // EXPORT EVENTS + await storeEventsTsv(); + }); + + test('stack-stx (reward-phase), stack-extend (prepare-phase)', async () => { + // TEST CASE + // steph is a solo stacker and stacks in a reward-phase + // steph then attempts to extend in a prepare-phase + // but steph doesn't run a signer, so we need to use a different signer key + const steph = getAccount(ENV.REGTEST_KEYS[0]); + const signer = getAccount(ENV.SIGNER_KEY); + + // PREP + const client = new StackingClient(steph.address, network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + // TRANSACTION (stack-stx) + const stackHeight = poxInfo.current_burnchain_block_height as number; + let currentCycle = poxInfo.reward_cycle_id; + let nextCycle = currentCycle + 1; + const lockPeriod = 1; + const amount = BigInt(poxInfo.min_amount_ustx) * 3n; + let authId = crypto.randomBytes(1)[0]; + let signature = client.signPoxSignature({ + topic: 'stack-stx', + period: lockPeriod, + rewardCycle: currentCycle, + poxAddress: steph.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount, + authId, + }); + const { txid } = await client.stack({ + amountMicroStx: amount, + poxAddress: steph.btcAddress, + cycles: lockPeriod, + burnBlockHeight: stackHeight, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId, + privateKey: steph.key, + }); + console.log('txid', txid); + + const result = await waitForTransaction(txid); + expect(result.tx_result.repr).toContain('(ok'); + expect(result.tx_status).toBe('success'); + + // CHECK POX-4 EVENTS + const { results } = await getPox4Events(); + let datas = results.map(r => r.data).filter(d => d.signer_key.includes(signer.signerPublicKey)); + + expect(datas).toContainEqual( + expect.objectContaining({ + start_cycle_id: nextCycle.toString(), + end_cycle_id: (nextCycle + lockPeriod).toString(), + }) + ); + + // CHECK STATUS AND WAIT FOR NEXT CYCLE PREPARE PHASE + let status = await client.getStatus(); + if (!status.stacked) throw 'not stacked'; + const stackUnlock = status.details.unlock_height; + + poxInfo = await client.getPoxInfo(); + await waitForNextCycle(poxInfo); + await storeEventsTsv('S1'); // snapshot 1 (steph is stacked in the current cycle) + + poxInfo = await client.getPoxInfo(); + await waitForPreparePhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect( + isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo) + ).toBeTruthy(); + + // TRANSACTION (stack-extend) + const extendHeight = poxInfo.current_burnchain_block_height as number; + const extendCycles = 1; + currentCycle = poxInfo.reward_cycle_id; + nextCycle = currentCycle + 1; + authId = crypto.randomBytes(1)[0]; + signature = client.signPoxSignature({ + topic: 'stack-extend', + period: extendCycles, + rewardCycle: currentCycle, + poxAddress: steph.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount, + authId, + }); + const { txid: txidExtend } = await client.stackExtend({ + extendCycles, + poxAddress: steph.btcAddress, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId, + privateKey: steph.key, + }); + console.log('txid extend', txidExtend); + + const resultExtend = await waitForTransaction(txidExtend); + expect(resultExtend.tx_result.repr).toContain('(ok'); + expect(resultExtend.tx_status).toBe('success'); + + // CHECK POX-4 EVENTS AFTER EXTEND + const { results: resultsExtend } = await getPox4Events(); + datas = resultsExtend + .map(r => r.data) + .filter(d => d.signer_key.includes(signer.signerPublicKey)); + + expect(datas).toContainEqual( + expect.objectContaining({ + start_cycle_id: (nextCycle + 1).toString(), // + prepare offset + end_cycle_id: (burnHeightToRewardCycle(stackUnlock, poxInfo) + extendCycles).toString(), // extended period + }) + ); + + // CHECK UNLOCK HEIGHT AND WAIT FOR UNLOCK + status = await client.getStatus(); + if (!status.stacked) throw 'not stacked'; + + expect(status.details.unlock_height).toBeGreaterThan(0); + expect(status.details.unlock_height).toBeGreaterThan(stackUnlock); + expect(status.details.unlock_height).toBe( + stackUnlock + poxInfo.reward_cycle_length * extendCycles + ); + + poxInfo = await client.getPoxInfo(); + await waitForNextCycle(poxInfo); + await storeEventsTsv('S2'); // snapshot 2 (steph was stacked, but the extend didn't make it in time) + + if (ENV.REGTEST_SKIP_UNLOCK) return; + await waitForBurnBlockHeight(status.details.unlock_height + 2); // +1 is more correct, but often fails (race-condition?) + status = await client.getStatus(); + expect(status.stacked).toBeFalsy(); + + // ENSURE CORRECT REWARDS + const rewards = await getRewards(steph.btcAddress); + expect(rewards.filter(r => r.burn_block_height > stackHeight).length).toBeGreaterThan(0); + expect(rewards.filter(r => r.burn_block_height > extendHeight).length).toBe(0); // extend didn't make it + + // EXPORT EVENTS + await storeEventsTsv(); + }); + + test('stack-stx (reward-phase), stack-increase (reward-phase)', async () => { + // TEST CASE + // steph is a solo stacker and stacks in a reward-phase + // steph then increases in a reward-phase + // but steph doesn't run a signer, so we need to use a different signer key + const steph = getAccount(ENV.REGTEST_KEYS[0]); + const signer = getAccount(ENV.SIGNER_KEY); + + // PREP + const client = new StackingClient(steph.address, network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + // TRANSACTION (stack-stx) + const stackHeight = poxInfo.current_burnchain_block_height as number; + let currentCycle = poxInfo.reward_cycle_id; + let nextCycle = currentCycle + 1; + const lockPeriod = 2; + const amount = BigInt(poxInfo.min_amount_ustx) * 3n; + let authId = crypto.randomBytes(1)[0]; + let signature = client.signPoxSignature({ + topic: 'stack-stx', + period: lockPeriod, + rewardCycle: currentCycle, + poxAddress: steph.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount, + authId, + }); + const { txid } = await client.stack({ + amountMicroStx: amount, + poxAddress: steph.btcAddress, + cycles: lockPeriod, + burnBlockHeight: stackHeight, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId, + privateKey: steph.key, + }); + console.log('txid', txid); + + const result = await waitForTransaction(txid); + expect(result.tx_result.repr).toContain('(ok'); + expect(result.tx_status).toBe('success'); + + // CHECK POX-4 EVENTS + const { results } = await getPox4Events(); + let datas = results.map(r => r.data).filter(d => d.signer_key.includes(signer.signerPublicKey)); + + expect(datas).toContainEqual( + expect.objectContaining({ + start_cycle_id: nextCycle.toString(), + end_cycle_id: (nextCycle + lockPeriod).toString(), + }) + ); + + // CHECK STATUS AND WAIT FOR NEXT CYCLE + let status = await client.getStatus(); + if (!status.stacked) throw 'not stacked'; + const stackUnlock = status.details.unlock_height; + + poxInfo = await client.getPoxInfo(); + await waitForNextCycle(poxInfo); + await storeEventsTsv('S1'); // snapshot 1 (steph is stacked in the current cycle) + + poxInfo = await client.getPoxInfo(); + expect(poxInfo.reward_cycle_id).toBe(nextCycle); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + // TRANSACTION (stack-increase) + const increaseHeight = poxInfo.current_burnchain_block_height as number; + const increaseBy = amount; + currentCycle = poxInfo.reward_cycle_id; + nextCycle = currentCycle + 1; + authId = crypto.randomBytes(1)[0]; + signature = client.signPoxSignature({ + topic: 'stack-increase', + period: lockPeriod, + rewardCycle: currentCycle, + poxAddress: steph.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount * 2n, + authId, + }); + const { txid: txidIncrease } = await client.stackIncrease({ + increaseBy, + poxAddress: steph.btcAddress, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount * 2n, + authId, + privateKey: steph.key, + }); + console.log('txid increase', txidIncrease); + + const resultIncrease = await waitForTransaction(txidIncrease); + expect(resultIncrease.tx_result.repr).toContain('(ok'); + expect(resultIncrease.tx_status).toBe('success'); + + // CHECK POX-4 EVENTS + const { results: resultsIncr } = await getPox4Events(); + datas = resultsIncr.map(r => r.data).filter(d => d.signer_key.includes(signer.signerPublicKey)); + + expect(datas).toContainEqual( + expect.objectContaining({ + start_cycle_id: nextCycle.toString(), + end_cycle_id: burnHeightToRewardCycle(stackUnlock, poxInfo).toString(), // original unlock + }) + ); + + // CHECK UNLOCK HEIGHT AND WAIT FOR UNLOCK + status = await client.getStatus(); + if (!status.stacked) throw 'not stacked'; + + expect(status.details.unlock_height).toBeGreaterThan(0); + expect(status.details.unlock_height).toBe(stackUnlock); + + poxInfo = await client.getPoxInfo(); + await waitForNextCycle(poxInfo); + await storeEventsTsv('S2'); // snapshot 2 (steph was stacked and increased for the current cycle) + + if (ENV.REGTEST_SKIP_UNLOCK) return; + await waitForBurnBlockHeight(status.details.unlock_height + 2); // +1 is more correct, but often fails (race-condition?) + status = await client.getStatus(); + expect(status.stacked).toBeFalsy(); + + // ENSURE CORRECT REWARDS + const rewards = await getRewards(steph.btcAddress); + expect(rewards.filter(r => r.burn_block_height > stackHeight).length).toBeGreaterThan(0); + expect(rewards.filter(r => r.burn_block_height > increaseHeight).length).toBeGreaterThan(0); + + // EXPORT EVENTS + await storeEventsTsv(); + }); + + test('stack-stx (reward-phase), stack-increase (prepare-phase)', async () => { + // TEST CASE + // steph is a solo stacker and stacks in a reward-phase + // steph then increases in a prepare-phase + // but steph doesn't run a signer, so we need to use a different signer key + const steph = getAccount(ENV.REGTEST_KEYS[0]); + const signer = getAccount(ENV.SIGNER_KEY); + + // PREP + const client = new StackingClient(steph.address, network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + // TRANSACTION (stack-stx) + const stackHeight = poxInfo.current_burnchain_block_height as number; + let currentCycle = poxInfo.reward_cycle_id; + let nextCycle = currentCycle + 1; + const lockPeriod = 2; + const amount = BigInt(poxInfo.min_amount_ustx) * 3n; + let authId = crypto.randomBytes(1)[0]; + let signature = client.signPoxSignature({ + topic: 'stack-stx', + period: lockPeriod, + rewardCycle: currentCycle, + poxAddress: steph.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount, + authId, + }); + const { txid } = await client.stack({ + amountMicroStx: amount, + poxAddress: steph.btcAddress, + cycles: lockPeriod, + burnBlockHeight: stackHeight, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId, + privateKey: steph.key, + }); + console.log('txid', txid); + + const result = await waitForTransaction(txid); + expect(result.tx_result.repr).toContain('(ok'); + expect(result.tx_status).toBe('success'); + + // CHECK POX-4 EVENTS + const { results } = await getPox4Events(); + let datas = results.map(r => r.data).filter(d => d.signer_key.includes(signer.signerPublicKey)); + + expect(datas).toContainEqual( + expect.objectContaining({ + start_cycle_id: nextCycle.toString(), + end_cycle_id: (nextCycle + lockPeriod).toString(), + }) + ); + + // CHECK STATUS AND WAIT FOR NEXT CYCLE PREPARE PHASE + let status = await client.getStatus(); + if (!status.stacked) throw 'not stacked'; + const stackUnlock = status.details.unlock_height; + + poxInfo = await client.getPoxInfo(); + await waitForNextCycle(poxInfo); + await storeEventsTsv('S1'); // snapshot 1 (steph is stacked in the current cycle) + + poxInfo = await client.getPoxInfo(); + await waitForPreparePhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect( + isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo) + ).toBeTruthy(); + + // TRANSACTION (stack-increase) + const increaseHeight = poxInfo.current_burnchain_block_height as number; + const increaseBy = amount; + currentCycle = poxInfo.reward_cycle_id; + nextCycle = currentCycle + 1; + authId = crypto.randomBytes(1)[0]; + signature = client.signPoxSignature({ + topic: 'stack-increase', + period: lockPeriod, + rewardCycle: currentCycle, + poxAddress: steph.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount * 2n, + authId, + }); + const { txid: txidIncrease } = await client.stackIncrease({ + increaseBy, + poxAddress: steph.btcAddress, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount * 2n, + authId, + privateKey: steph.key, + }); + console.log('txid increase', txidIncrease); + + const resultIncrease = await waitForTransaction(txidIncrease); + expect(resultIncrease.tx_result.repr).toContain('(ok'); + expect(resultIncrease.tx_status).toBe('success'); + + // CHECK POX-4 EVENTS + const { results: resultsIncr } = await getPox4Events(); + datas = resultsIncr.map(r => r.data).filter(d => d.signer_key.includes(signer.signerPublicKey)); + + expect(datas).toContainEqual( + expect.objectContaining({ + start_cycle_id: (nextCycle + 1).toString(), // + prepare offset + end_cycle_id: burnHeightToRewardCycle(stackUnlock, poxInfo).toString(), // original unlock + }) + ); + + // CHECK UNLOCK HEIGHT AND WAIT FOR UNLOCK + status = await client.getStatus(); + if (!status.stacked) throw 'not stacked'; + + expect(status.details.unlock_height).toBeGreaterThan(0); + expect(status.details.unlock_height).toBe(stackUnlock); + + poxInfo = await client.getPoxInfo(); + await waitForNextCycle(poxInfo); + await storeEventsTsv('S2'); // snapshot 2 (steph was stacked, but the increase didn't make it in time) + + if (ENV.REGTEST_SKIP_UNLOCK) return; + await waitForBurnBlockHeight(status.details.unlock_height + 2); // +1 is more correct, but often fails (race-condition?) + status = await client.getStatus(); + expect(status.stacked).toBeFalsy(); + + // ENSURE CORRECT REWARDS + const rewards = await getRewards(steph.btcAddress); + expect(rewards.filter(r => r.burn_block_height > stackHeight).length).toBeGreaterThan(0); + expect(rewards.filter(r => r.burn_block_height > increaseHeight).length).toBeGreaterThan(0); + + // todo: (functional) some how ensure the slots were not increased on the blockchain side + + // EXPORT EVENTS + await storeEventsTsv(); + }); + + test('pool: delegate-stack, agg-increase (prepare-phase)', async () => { + // TEST CASE + // alice and bob delegate to a pool + // the pool stacks for alice (in the reward-phase) + // the pool commits (in the reward-phase) + // the pool stacks for bob (in the prepare-phase) + // the pool commit-increases (in the prepare-phase) + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const bob = getAccount(ENV.REGTEST_KEYS[1]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + const signer = getAccount(ENV.SIGNER_KEY); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 3n; + const nextCycle = poxInfo.reward_cycle_id + 1; + const delegateStackCycles = 2; + + // TRANSACTION (alice delegate-stack) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + await waitForTransaction(aliceDelegate); + + // TRANSACTION (bob delegate-stack) + const { txid: bobDelegate } = await bob.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: bob.key, + }); + await waitForTransaction(bobDelegate); + + // TRANSACTION (pool alice stack-stx) + let poolNonce = await getNonce(pool.address, network); + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: delegateStackCycles, + privateKey: pool.key, + nonce: poolNonce++, + }); + await waitForTransaction(poolAlice); + + const eventsAlice = (await getPox4Events()).results.filter( + r => r.stacker === alice.address && r.pox_addr === pool.btcAddress + ); + + expect(eventsAlice.map(r => r.data)).toContainEqual( + expect.objectContaining({ + start_cycle_id: nextCycle.toString(), + end_cycle_id: (nextCycle + delegateStackCycles).toString(), + }) + ); + + // TRANSACTION (pool commit) + const authId = crypto.randomBytes(1)[0]; + const signature = pool.client.signPoxSignature({ + topic: 'agg-commit', + period: 1, + rewardCycle: nextCycle, + poxAddress: pool.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: amount * 2n, + authId, + }); + const { txid: poolCommit } = await pool.client.stackAggregationCommitIndexed({ + poxAddress: pool.btcAddress, + rewardCycle: nextCycle, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: amount * 2n, + authId, + privateKey: pool.key, + nonce: poolNonce++, + }); + const commit = await waitForTransaction(poolCommit); + const commitIndex = Cl.deserialize>(commit.tx_result.hex).value.value; + + const eventsCommit = (await getPox4Events()).results.filter( + r => r.pox_addr === pool.btcAddress + ); + + expect(eventsCommit.map(r => r.data)).toContainEqual( + expect.objectContaining({ + start_cycle_id: nextCycle.toString(), + end_cycle_id: nextCycle.toString(), // todo: incorrect on core, should be +1 + }) + ); + + // WAIT FOR PREPARE PHASE + poxInfo = await client.getPoxInfo(); + await waitForPreparePhase(poxInfo); + + // TRANSACTION (pool bob stack-stx) + const { txid: poolBob } = await pool.client.delegateStackStx({ + stacker: bob.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: delegateStackCycles, + privateKey: pool.key, + nonce: poolNonce++, + }); + await waitForTransaction(poolBob); + + const eventsBob = (await getPox4Events()).results.filter( + r => r.stacker === bob.address && r.pox_addr === pool.btcAddress + ); + + expect(eventsBob.map(r => r.data)).toContainEqual( + expect.objectContaining({ + start_cycle_id: (nextCycle + 1).toString(), // + prepare offset + end_cycle_id: (nextCycle + delegateStackCycles).toString(), + }) + ); + + // CHECK LOCKED + expect(await alice.client.getAccountBalanceLocked()).toBe(amount); + expect(await bob.client.getAccountBalanceLocked()).toBe(amount); + + // TRANSACTION (pool commit-increase) + const { txid: poolIncrease } = await pool.client.stackAggregationIncrease({ + poxAddress: pool.btcAddress, + rewardCycle: nextCycle, + rewardIndex: commitIndex, + privateKey: pool.key, + nonce: poolNonce++, + }); + await waitForTransaction(poolIncrease); + + const eventsIncrease = (await getPox4Events()).results.filter( + r => r.pox_addr === pool.btcAddress + ); + + expect(eventsIncrease.map(r => r.data)).toContainEqual( + expect.objectContaining({ + start_cycle_id: nextCycle.toString(), // todo: incorrect on core, should be // + prepare offset + end_cycle_id: nextCycle.toString(), // todo: incorrect on core, should be +1 + }) + ); + + const rewardSet = await pool.client.getRewardSet({ + contractId: poxInfo.contract_id, + rewardCyleId: nextCycle, + rewardSetIndex: Number(commitIndex), + }); + expect(rewardSet).toBeDefined(); + expect(rewardSet?.total_ustx).toBe(amount * 2n); + + // EXPORT EVENTS + await storeEventsTsv(); + }); + + test.skip('pool: agg increase over maxAmount', async () => { + // TEST CASE + // alice delegates to a pool + // pool delegate stacks for alice (a part of her delegated amount) + // pool commits + // pool delegate stack increases for alice (the remaining amount) + // pool increases commit, but the signature was only for the initial amount + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + const signer = getAccount(ENV.SIGNER_KEY); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + const fullAmount = BigInt(poxInfo.min_amount_ustx) * 6n; + const nextCycle = poxInfo.reward_cycle_id + 1; + const delegateStackCycles = 3; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: fullAmount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_status).toBe('success'); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); + + // TRANSACTION (pool delegate-stack-stx) + let poolNonce = await getNonce(pool.address, network); + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: fullAmount * (2n / 5n), + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: delegateStackCycles, + privateKey: pool.key, + nonce: poolNonce++, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_status).toBe('success'); + expect(poolAliceTx.tx_result.repr).toContain('(ok'); + + // TRANSACTION (pool commit) + const authId = crypto.randomBytes(1)[0]; + const signature = pool.client.signPoxSignature({ + topic: 'agg-commit', + period: 1, + rewardCycle: nextCycle, + poxAddress: pool.btcAddress, + signerPrivateKey: signer.signerPrivateKey, + maxAmount: fullAmount * (2n / 5n), + authId, + }); + const { txid: poolCommit } = await pool.client.stackAggregationCommitIndexed({ + poxAddress: pool.btcAddress, + rewardCycle: nextCycle, + signerKey: signer.signerPublicKey, + signerSignature: signature, + maxAmount: fullAmount * (2n / 5n), + authId, + privateKey: pool.key, + nonce: poolNonce++, + }); + const commit = await waitForTransaction(poolCommit); + const commitIndex = Cl.deserialize>(commit.tx_result.hex).value.value; + + expect(commit.tx_status).toBe('success'); + expect(commit.tx_result.repr).toContain('(ok'); + + // TRANSACTION (pool delegate-stack-increase) + const { txid: poolAliceInc } = await pool.client.delegateStackIncrease({ + stacker: alice.address, + poxAddress: pool.btcAddress, + increaseBy: fullAmount * (3n / 5n), // more than the initial amount + privateKey: pool.key, + nonce: poolNonce++, + }); + const poolAliceIncTx = await waitForTransaction(poolAliceInc); + expect(poolAliceIncTx.tx_status).toBe('success'); + expect(poolAliceIncTx.tx_result.repr).toContain('(ok'); + + // TRANSACTION (pool commit-increase) + const { txid: poolInc } = await pool.client.stackAggregationIncrease({ + poxAddress: pool.btcAddress, + rewardCycle: nextCycle, + rewardIndex: commitIndex, + privateKey: pool.key, + nonce: poolNonce++, + }); + const poolIncTx = await waitForTransaction(poolInc); + expect(poolIncTx.tx_status).toBe('success'); + expect(poolIncTx.tx_result.repr).toContain('(ok'); + + // CHECK LOCKED + expect(await alice.client.getAccountBalanceLocked()).toBe(fullAmount); + + poxInfo = await client.getPoxInfo(); + await waitForNextCycle(poxInfo); + + const rewardSet = await pool.client.getRewardSet({ + contractId: poxInfo.contract_id, + rewardCyleId: nextCycle, + rewardSetIndex: Number(commitIndex), + }); + expect(rewardSet).toBeDefined(); + expect(rewardSet?.total_ustx).toBe(fullAmount); + + // EXPORT EVENTS + await storeEventsTsv(); + }); + + test('pool: delegate with invalid hashbyte length', async () => { + // TEST CASE + // alice delegates to a pool with an invalid hashbyte length + // the transaction should fail (but won't) + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const contract = await client.getStackingContract(); + const [contractAddress, contractName] = client.parseContractId(contract); + + const address: any = Cl.some(poxAddressToTuple(pool.btcAddress)); + console.log(bytesToHex(address.value.data.hashbytes.buffer as Uint8Array)); + address.value.data.hashbytes.buffer = address.value.data.hashbytes.buffer.slice(2); // remove two first bytes + console.log(bytesToHex(address.value.data.hashbytes.buffer as Uint8Array)); + + const callOptions: SignedContractCallOptions = { + contractAddress, + contractName, + + functionName: 'delegate-stx', + functionArgs: [Cl.uint(amount), Cl.address(pool.address), Cl.none(), address], + + validateWithAbi: true, + anchorMode: 'onChainOnly', + network, + + senderKey: alice.key, + }; + const tx = await makeContractCall(callOptions); + const { txid: aliceDelegate } = await broadcastTransaction(tx, network); + + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(err 23'); + expect(aliceDelegateTx.tx_status).toBe('aborted_by_response'); + + // TRANSACTION (pool delegate-stack-stx) + const poolNonce = await getNonce(pool.address, network); + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, // will be different to the one alice delegated to + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + nonce: poolNonce, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(ok'); + expect(poolAliceTx.tx_status).toBe('success'); + + // wait a bit to see what happens + poxInfo = await client.getPoxInfo(); + await waitForBurnBlockHeight( + (poxInfo.current_burnchain_block_height as number) + 3 * poxInfo.reward_cycle_length + ); + + expect((await client.getPoxInfo()).current_burnchain_block_height).toBe( + (poxInfo.current_burnchain_block_height as number) + 3 * poxInfo.reward_cycle_length + ); + }); + + test('Pool delegate can only delegate-stack-stx for the next cycle', async () => { + // TEST CASE + // alice delegates to a pool + // pool delegate stacks for alice (in the reward-phase) for a cycle that is not the next cycle + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + await waitForTransaction(aliceDelegate); + + // TRANSACTION (pool delegate-stack-stx) + const poolNonce = await getNonce(pool.address, network); + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: + (poxInfo.current_burnchain_block_height as number) + poxInfo.reward_cycle_length, + cycles: 2, + privateKey: pool.key, + nonce: poolNonce, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Cannot stack if delegating', async () => { + // TEST CASE + // alice delegates to a pool + // alice stacks for herself + // pool delegate stacks for alice (in the reward-phase) + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + await waitForTransaction(aliceDelegate); + + // TRANSACTION (alice stack-stx) + const signature = client.signPoxSignature({ + topic: 'stack-stx', + period: 2, + rewardCycle: poxInfo.reward_cycle_id, + poxAddress: alice.btcAddress, + signerPrivateKey: alice.signerPrivateKey, + maxAmount: amount, + authId: 0, + }); + const { txid: aliceStack } = await alice.client.stack({ + amountMicroStx: amount, + poxAddress: alice.btcAddress, + cycles: 2, + burnBlockHeight: poxInfo.current_burnchain_block_height, + signerKey: alice.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId: 0, + privateKey: alice.key, + }); + const aliceStackTx = await waitForTransaction(aliceStack); + expect(aliceStackTx.tx_result.repr).toBe('(err 20)'); + expect(aliceStackTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate cannot delegate-stack-stx if already stacking', async () => { + // TEST CASE + // alice stacks for herself + // alice delegates to a pool + // pool delegate stacks for alice (in the reward-phase) + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice stack-stx) + const signature = client.signPoxSignature({ + topic: 'stack-stx', + period: 2, + rewardCycle: poxInfo.reward_cycle_id, + poxAddress: alice.btcAddress, + signerPrivateKey: alice.signerPrivateKey, + maxAmount: amount, + authId: 0, + }); + const { txid: aliceStack } = await alice.client.stack({ + amountMicroStx: amount, + poxAddress: alice.btcAddress, + cycles: 2, + burnBlockHeight: poxInfo.current_burnchain_block_height, + signerKey: alice.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId: 0, + privateKey: alice.key, + }); + const aliceStackTx = await waitForTransaction(aliceStack); + expect(aliceStackTx.tx_result.repr).toContain('(ok'); + expect(aliceStackTx.tx_status).toBe('success'); + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + await waitForTransaction(aliceDelegate); + + // TRANSACTION (pool delegate-stack-stx) + const poolNonce = await getNonce(pool.address, network); + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + nonce: poolNonce, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate cannot delegate-stack-stx more STX than what delegator has explicitly allowed', async () => { + // TEST CASE + // alice delegates to a pool + // pool delegate stacks for alice (with a higher amount) + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + await waitForTransaction(aliceDelegate); + + // TRANSACTION (pool delegate-stack-stx) + const poolNonce = await getNonce(pool.address, network); + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount * 2n, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + nonce: poolNonce, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate cannot delegate-stack-stx on behalf of a delegator that delegated to another pool', async () => { + // TEST CASE + // alice delegates to a pool A + // pool B tries to delegate-stack-stx for alice + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const poolA = getAccount(ENV.REGTEST_KEYS[1]); + const poolB = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: poolA.address, + poxAddress: poolA.btcAddress, + privateKey: alice.key, + }); + await waitForTransaction(aliceDelegate); + + // TRANSACTION (pool delegate-stack-stx) + const poolNonce = await getNonce(poolB.address, network); + const { txid: poolAlice } = await poolB.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: poolB.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: poolB.key, + nonce: poolNonce, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate cannot delegate-stack-stx for the current cycle', async () => { + // TEST CASE + // alice delegates to a pool + // pool delegate stacks for alice (in the reward-phase) for the current cycle + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + expect(isInPreparePhase(poxInfo.current_burnchain_block_height as number, poxInfo)).toBeFalsy(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + await waitForTransaction(aliceDelegate); + + // TRANSACTION (pool delegate-stack-stx) + const poolNonce = await getNonce(pool.address, network); + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: + (poxInfo.current_burnchain_block_height as number) - poxInfo.reward_cycle_length, + cycles: 2, + privateKey: pool.key, + nonce: poolNonce, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate cannot delegate-stack-stx to an un-delegated solo stacker', async () => { + // TEST CASE + // pool delegate stacks for alice (in the reward-phase) + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (pool delegate-stack-stx) + const poolNonce = await getNonce(pool.address, network); + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + nonce: poolNonce, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool stacker, if actively stacked, cannot revoke delegate status for the current reward cycle', async () => { + // TEST CASE + // alice delegates to a pool + // pool delegate stacks for alice (in the reward-phase) + // alice revokes the delegation + // alice is still locked + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + await waitForTransaction(aliceDelegate); + + // TRANSACTION (pool delegate-stack-stx) + const poolNonce = await getNonce(pool.address, network); + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + nonce: poolNonce, + }); + await waitForTransaction(poolAlice); + + // TRANSACTION (alice revoke) + const { txid: aliceRevoke } = await alice.client.revokeDelegateStx({ + delegatee: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + await waitForTransaction(aliceRevoke); + + // CHECK LOCKED + expect(await alice.client.getAccountBalanceLocked()).toBe(amount); + + poxInfo = await client.getPoxInfo(); + await waitForNextCycle(poxInfo); + + expect(await alice.client.getAccountBalanceLocked()).toBe(amount); + }); + + test('Pool can pre-approve a signature for participants', async () => { + // TEST CASE + // pool can create a signature and push it to pox state + // alice can't use the signature with an incorrect period + // alice can use the signature while only knowing the signer-key, max-amount, auth-id + // bob can't use the consumed signature + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const bob = getAccount(ENV.REGTEST_KEYS[1]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (pool pre-approve) + const period = 1; + const rewardCycle = poxInfo.reward_cycle_id; + const maxAmount = amount * 2n; + const authId = crypto.randomBytes(1)[0]; + const signature = pool.client.signPoxSignature({ + topic: 'stack-stx', + period, + rewardCycle, + poxAddress: pool.btcAddress, + signerPrivateKey: pool.signerPrivateKey, + maxAmount, + authId, + }); + const [contractAddress, contractName] = client.parseContractId(poxInfo.contract_id); + const tx = await makeContractCall({ + contractAddress, + contractName, + functionName: 'set-signer-key-authorization', + functionArgs: [ + poxAddressToTuple(pool.btcAddress), // pox-addr + Cl.uint(period), // period + Cl.uint(rewardCycle), // reward-cycle + Cl.stringAscii('stack-stx'), // topic + Cl.bufferFromHex(pool.signerPublicKey), // signer-key + Cl.bool(true), // allowed + Cl.uint(maxAmount), // max-amount + Cl.uint(authId), // auth-id + ], + anchorMode: 'onChainOnly', + network, + senderKey: pool.key, + }); + const poolPreApproveTx = await broadcastAndWaitForTransaction(tx, network); + expect(poolPreApproveTx.tx_result.repr).toContain('(ok'); + expect(poolPreApproveTx.tx_status).toBe('success'); + + // TRANSACTION (alice stack) + const { txid: aliceStackLong } = await alice.client.stack({ + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + + signerKey: pool.signerPublicKey, + signerSignature: signature, + cycles: 10, + maxAmount, + authId, + + privateKey: alice.key, + }); + const aliceStackLongTx = await waitForTransaction(aliceStackLong); + expect(aliceStackLongTx.tx_result.repr).toContain('(err'); + expect(aliceStackLongTx.tx_status).toBe('abort_by_response'); + + // TRANSACTION (alice stack) + const { txid: aliceStack } = await alice.client.stack({ + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + + signerKey: pool.signerPublicKey, + cycles: period, + maxAmount, + authId, + + privateKey: alice.key, + }); + const aliceStackTx = await waitForTransaction(aliceStack); + expect(aliceStackTx.tx_result.repr).toContain('(ok'); + expect(aliceStackTx.tx_status).toBe('success'); + + // TRANSACTION (bob stack) + const { txid: bobStack } = await bob.client.stack({ + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + + signerKey: pool.signerPublicKey, + cycles: period, + maxAmount, + authId, + + privateKey: bob.key, + }); + const bobStackTx = await waitForTransaction(bobStack); + expect(bobStackTx.tx_result.repr).toContain('(err'); + expect(bobStackTx.tx_status).toBe('abort_by_response'); + }); + + test('Stacker switches signers for stack-increase', async () => { + // TEST CASE + // alice solo stacks with signer A + // alice increases stack with signer B + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const signerA = getAccount(ENV.REGTEST_KEYS[1]); + const signerB = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx); + + // TRANSACTION (alice solo stack) + const signatureA = client.signPoxSignature({ + topic: 'stack-stx', + period: 1, + rewardCycle: poxInfo.reward_cycle_id, + poxAddress: alice.btcAddress, + signerPrivateKey: signerA.signerPrivateKey, + maxAmount: amount * 2n, + authId: 0, + }); + const { txid: aliceStack } = await alice.client.stack({ + amountMicroStx: amount, + poxAddress: alice.btcAddress, + cycles: 1, + burnBlockHeight: poxInfo.current_burnchain_block_height, + + signerKey: signerA.signerPublicKey, + signerSignature: signatureA, + maxAmount: amount * 2n, + authId: 0, + + privateKey: alice.key, + }); + const aliceStackTx = await waitForTransaction(aliceStack); + expect(aliceStackTx.tx_result.repr).toContain('(ok'); + expect(aliceStackTx.tx_status).toBe('success'); + + // TRANSACTION (alice increase stack) + const signatureB = client.signPoxSignature({ + topic: 'stack-increase', + period: 1, + rewardCycle: poxInfo.reward_cycle_id, + poxAddress: alice.btcAddress, + signerPrivateKey: signerB.signerPrivateKey, + maxAmount: amount * 2n, + authId: 0, + }); + const { txid: aliceIncrease } = await alice.client.stackIncrease({ + increaseBy: amount, + + signerKey: signerB.signerPublicKey, + signerSignature: signatureB, + poxAddress: alice.btcAddress, + rewardCycle: poxInfo.reward_cycle_id, + maxAmount: amount * 2n, + authId: 0, + + privateKey: alice.key, + }); + const aliceIncreaseTx = await waitForTransaction(aliceIncrease); + expect(aliceIncreaseTx.tx_result.repr).toContain('(err'); + expect(aliceIncreaseTx.tx_status).toBe('abort_by_response'); + }); + + test('Stacker switches signers for stack-extend', async () => { + // TEST CASE + // alice solo stacks with signer A + // alice extends stack with signer B + // the transaction should work, because it's essentially like a new stack (separate from the first) + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const signerA = getAccount(ENV.REGTEST_KEYS[1]); + const signerB = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx); + + // TRANSACTION (alice solo stack) + const signatureA = client.signPoxSignature({ + topic: 'stack-stx', + period: 1, + rewardCycle: poxInfo.reward_cycle_id, + poxAddress: alice.btcAddress, + signerPrivateKey: signerA.signerPrivateKey, + maxAmount: amount * 2n, + authId: 0, + }); + const { txid: aliceStack } = await alice.client.stack({ + amountMicroStx: amount, + poxAddress: alice.btcAddress, + cycles: 1, + burnBlockHeight: poxInfo.current_burnchain_block_height, + + signerKey: signerA.signerPublicKey, + signerSignature: signatureA, + maxAmount: amount * 2n, + authId: 0, + + privateKey: alice.key, + }); + const aliceStackTx = await waitForTransaction(aliceStack); + expect(aliceStackTx.tx_result.repr).toContain('(ok'); + console.log(aliceStackTx.tx_result.repr); + expect(aliceStackTx.tx_status).toBe('success'); + + // TRANSACTION (alice increase stack) + const signatureB = client.signPoxSignature({ + topic: 'stack-extend', + period: 1, + rewardCycle: poxInfo.reward_cycle_id, + poxAddress: alice.btcAddress, + signerPrivateKey: signerB.signerPrivateKey, + maxAmount: amount * 2n, + authId: 0, + }); + const { txid: aliceIncrease } = await alice.client.stackExtend({ + extendCycles: 1, + + signerKey: signerB.signerPublicKey, + signerSignature: signatureB, + poxAddress: alice.btcAddress, + rewardCycle: poxInfo.reward_cycle_id, + maxAmount: amount * 2n, + authId: 0, + + privateKey: alice.key, + }); + const aliceIncreaseTx = await waitForTransaction(aliceIncrease); + expect(aliceIncreaseTx.tx_result.repr).toContain('(ok'); + expect(aliceIncreaseTx.tx_status).toBe('success'); + }); + + test('Call readonly with weird string', async () => { + // TEST CASE + // call a read-only function with a weird string + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + const [contractAddress, contractName] = client.parseContractId(poxInfo.contract_id); + + const res = await callReadOnlyFunction({ + contractAddress, + contractName, + functionName: 'get-signer-key-message-hash', + functionArgs: [ + Cl.tuple({ + version: Cl.buffer(Uint8Array.from([0])), + hashbytes: Cl.buffer(Uint8Array.from([])), + }), + Cl.uint(0), + Cl.stringAscii('r;NT="'), // taken from stateful testing: https://nakamotoslack.slack.com/archives/C067Q7M9L9J/p1709821822761499 + Cl.uint(0), + Cl.uint(10), + Cl.uint(0), + ], + network, + senderAddress: alice.address, + }); + + if (res.type !== ClarityType.Buffer) throw 'wrong type'; + expect(res.buffer.length).toBeGreaterThan(0); + + await timeout(5000); + + poxInfo = await client.getPoxInfo(); + expect(poxInfo).toBeDefined(); + }); + + test('Pool stacker can delegate-stx, Pool stacker cannot submit an invalid pox-addr-version', async () => { + // TEST CASE + // alice delegates to a pool with an invalid pox-addr-version + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const contract = await client.getStackingContract(); + const [contractAddress, contractName] = client.parseContractId(contract); + + const address: any = poxAddressToTuple(pool.btcAddress); + address.data.version.buffer = Uint8Array.from([8]); // invalid pox-addr-version + + const tx = await makeContractCall({ + contractAddress, + contractName, + functionName: 'delegate-stx', + functionArgs: [ + Cl.uint(amount), + Cl.address(pool.address), + Cl.none(), + Cl.some(address), // invalid pox-addr-version + ], + anchorMode: 'onChainOnly', + network, + senderKey: alice.key, + }); + const aliceDelegateTx = await broadcastAndWaitForTransaction(tx, network); + expect(aliceDelegateTx.tx_result.repr).toContain('(err'); + expect(aliceDelegateTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool stacker cannot delegate to two pool operators at once', async () => { + // TEST CASE + // alice delegates to a pool + // alice tries to delegate to another pool + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const poolA = getAccount(ENV.REGTEST_KEYS[1]); + const poolB = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + const amount = BigInt(poxInfo.min_amount_ustx); + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: poolA.address, + poxAddress: poolA.btcAddress, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); + expect(aliceDelegateTx.tx_status).toBe('success'); + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate2 } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: poolB.address, + poxAddress: poolB.btcAddress, + privateKey: alice.key, + }); + const aliceDelegate2Tx = await waitForTransaction(aliceDelegate2); + expect(aliceDelegate2Tx.tx_result.repr).toContain('(err'); + expect(aliceDelegate2Tx.tx_status).toBe('abort_by_response'); + }); + + test('Revoke fails if stacker is not currently delegated', async () => { + // TEST CASE + // alice revokes stx from a pool (without having delegated) + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + // TRANSACTION (alice revoke) + const { txid: aliceRevoke } = await alice.client.revokeDelegateStx({ + delegatee: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const aliceRevokeTx = await waitForTransaction(aliceRevoke); + expect(aliceRevokeTx.tx_result.repr).toContain('(err'); + expect(aliceRevokeTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate can successfully provide a stacking lock for a pool stacker (delegate-stack-stx)', async () => { + // TEST CASE + // alice delegates to a pool + // pool delegate stacks for alice (in the reward-phase) + // alice should be locked + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + await waitForRewardPhase(poxInfo); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); + expect(aliceDelegateTx.tx_status).toBe('success'); + + // TRANSACTION (pool delegate-stack-stx) + let poolNonce = await getNonce(pool.address, network); + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 1, + privateKey: pool.key, + nonce: poolNonce++, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(ok'); + expect(poolAliceTx.tx_status).toBe('success'); + + // CHECK LOCKED + expect(await alice.client.getAccountBalanceLocked()).toBe(amount); + + // TRANSACTION (pool commit) + const signature = client.signPoxSignature({ + topic: 'agg-commit', + period: 1, + rewardCycle: poxInfo.reward_cycle_id + 1, + poxAddress: pool.btcAddress, + signerPrivateKey: pool.signerPrivateKey, + maxAmount: amount, + authId: 0, + }); + const { txid: poolCommit } = await pool.client.stackAggregationCommitIndexed({ + poxAddress: pool.btcAddress, + rewardCycle: poxInfo.reward_cycle_id + 1, + signerKey: pool.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId: 0, + nonce: poolNonce++, + privateKey: pool.key, + }); + const poolCommitTx = await waitForTransaction(poolCommit); + expect(poolCommitTx.tx_result.repr).toContain('(ok'); + expect(poolCommitTx.tx_status).toBe('success'); + + // CHECK LOCKED + expect(await alice.client.getAccountBalanceLocked()).toBe(amount); + + // WAIT FOR UNLOCK + const status = await alice.client.getStatus(); + if (!status.stacked) throw 'not stacked'; + + poxInfo = await client.getPoxInfo(); + await waitForBurnBlockHeight(status.details.unlock_height + 1); + + // CHECK UNLOCKED + expect(await alice.client.getAccountBalanceLocked()).toBe(0n); + }); + + test('Pool delegate cannot delegate-stack-stx to an un-delegated solo stacker', async () => { + // TEST CASE + // alice solo stacks + // pool delegate tries to delegate-stack for alice + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice stack) + const signature = client.signPoxSignature({ + topic: 'stack-stx', + period: 2, + rewardCycle: poxInfo.reward_cycle_id, + poxAddress: alice.btcAddress, + signerPrivateKey: alice.signerPrivateKey, + maxAmount: amount, + authId: 0, + }); + const { txid: aliceStack } = await alice.client.stack({ + amountMicroStx: amount, + poxAddress: alice.btcAddress, + cycles: 2, + burnBlockHeight: poxInfo.current_burnchain_block_height, + signerKey: alice.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId: 0, + privateKey: alice.key, + }); + const aliceStackTx = await waitForTransaction(aliceStack); + expect(aliceStackTx.tx_result.repr).toContain('(ok'); + expect(aliceStackTx.tx_status).toBe('success'); + + // TRANSACTION (pool delegate-stack-stx) + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate cannot delegate-stack-stx for the current cycle', async () => { + // TEST CASE + // alice delegates to a pool + // pool delegate-stack for alice + // pool tries to commit the stack for the current cycle + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); + expect(aliceDelegateTx.tx_status).toBe('success'); + + // TRANSACTION (pool delegate-stack-stx) + let poolNonce = await getNonce(pool.address, network); + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 1, + privateKey: pool.key, + nonce: poolNonce++, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(ok'); + expect(poolAliceTx.tx_status).toBe('success'); + + // TRANSACTION (pool commit) + const signature = client.signPoxSignature({ + topic: 'agg-commit', + period: 1, + rewardCycle: poxInfo.reward_cycle_id, + poxAddress: pool.btcAddress, + signerPrivateKey: pool.signerPrivateKey, + maxAmount: amount, + authId: 0, + }); + const { txid: poolCommit } = await pool.client.stackAggregationCommitIndexed({ + poxAddress: pool.btcAddress, + rewardCycle: poxInfo.reward_cycle_id, + signerKey: pool.signerPublicKey, + signerSignature: signature, + maxAmount: amount, + authId: 0, + nonce: poolNonce++, + privateKey: pool.key, + }); + const poolCommitTx = await waitForTransaction(poolCommit); + expect(poolCommitTx.tx_result.repr).toContain('(err'); + expect(poolCommitTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate cannot delegate-stack-stx on behalf of a delegator that delegated to another pool', async () => { + // TEST CASE + // alice delegates to a pool A + // pool B tries to delegate-stack for alice + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const poolA = getAccount(ENV.REGTEST_KEYS[1]); + const poolB = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: poolA.address, + poxAddress: poolA.btcAddress, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); + expect(aliceDelegateTx.tx_status).toBe('success'); + + // TRANSACTION (pool delegate-stack-stx) + const { txid: poolAlice } = await poolB.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: poolB.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: poolB.key, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate cannot delegate-stack-stx more STX than what delegator has explicitly allowed', async () => { + // TEST CASE + // alice delegates to a pool + // pool delegate-stack for alice + // pool tries to delegate-stack for alice with more STX than what alice has explicitly allowed + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); + expect(aliceDelegateTx.tx_status).toBe('success'); + + // TRANSACTION (pool delegate-stack-stx) + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(ok'); + expect(poolAliceTx.tx_status).toBe('success'); + + // TRANSACTION (pool delegate-stack-stx) + const { txid: poolAlice2 } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount * 2n, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + }); + const poolAlice2Tx = await waitForTransaction(poolAlice2); + expect(poolAlice2Tx.tx_result.repr).toContain('(err'); + expect(poolAlice2Tx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate cannot change the pox-addr provided by delegator', async () => { + // TEST CASE + // alice delegates to a pool + // pool tries to delegate-stack for alice with a different pox-addr + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + const random = getAccount(ENV.REGTEST_KEYS[1]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); + expect(aliceDelegateTx.tx_status).toBe('success'); + + // TRANSACTION (pool delegate-stack-stx) + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: random.btcAddress, // different pox-addr + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate cannot delegate-stack-stx if the delegation expires before the next cycle ends', async () => { + // TEST CASE + // alice delegates to a pool (until before the next cycle ends) + // pool tries to delegate-stack for alice + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + const until = + poxInfo.next_cycle.reward_phase_start_block_height + poxInfo.reward_cycle_length - 2; // a bit before the next cycle ends + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + untilBurnBlockHeight: until, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); + expect(aliceDelegateTx.tx_status).toBe('success'); + + // TRANSACTION (pool delegate-stack-stx) + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate-stack-stx fails if the delegator has insufficient balance', async () => { + // TEST CASE + // alice delegates to a pool + // pool tries to delegate-stack for alice with more STX than what alice has + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + const aliceBalance = await alice.client.getAccountBalance(); + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: aliceBalance + 100n, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); // alice can delegate more than she has + expect(aliceDelegateTx.tx_status).toBe('success'); + + // TRANSACTION (pool delegate-stack-stx) + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: aliceBalance + 50n, // more than alice has, but less than what was delegated + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate cannot delegate-stack 0 stx, Pool delegate cannot delegate-stack-stx for 0 cycles, Pool delegate cannot delegate-stack-stx for > 12 cycles', async () => { + // TEST CASE + // alice delegates to a pool + // pool tries to delegate-stack for alice with 0 STX + // the transaction should fail + // pool tries to delegate-stack for alice for 0 cycles + // the transaction should fail + // pool tries to delegate-stack for alice for more than 12 cycles + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: 100n, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); + expect(aliceDelegateTx.tx_status).toBe('success'); + + // TRANSACTION (pool delegate-stack-stx) + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: 0n, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + + // TRANSACTION (pool delegate-stack-stx) + const { txid: poolAlice2 } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: 100n, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 0, + privateKey: pool.key, + }); + const poolAlice2Tx = await waitForTransaction(poolAlice2); + expect(poolAlice2Tx.tx_result.repr).toContain('(err'); + expect(poolAlice2Tx.tx_status).toBe('abort_by_response'); + + // TRANSACTION (pool delegate-stack-stx) + const { txid: poolAlice3 } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: 100n, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 13, + privateKey: pool.key, + }); + const poolAlice3Tx = await waitForTransaction(poolAlice3); + expect(poolAlice3Tx.tx_result.repr).toContain('(err'); + expect(poolAlice3Tx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate cannot submit an invalid pox-addr-ver', async () => { + // TEST CASE + // alice delegates to a pool + // pool tries to delegate-stack for alice with an invalid pox-addr-ver + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); + expect(aliceDelegateTx.tx_status).toBe('success'); + + const address = poxAddressToTuple(pool.btcAddress); + (address.data.version as any).buffer = Uint8Array.from([8]); // invalid pox-addr-version + + // TRANSACTION (pool delegate-stack-stx) + const [contractAddress, contractName] = client.parseContractId(poxInfo.contract_id); + const tx = await makeContractCall({ + contractAddress, + contractName, + functionName: 'delegate-stack-stx', + functionArgs: [ + Cl.address(alice.address), + Cl.uint(amount), + address, + Cl.uint(poxInfo.current_burnchain_block_height as number), + Cl.uint(2), + ], + anchorMode: 'onChainOnly', + network, + senderKey: pool.key, + }); + const poolAliceTx = await broadcastAndWaitForTransaction(tx, network); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool stacker can revoke delegate status (revoke-delegate-stx)', async () => { + // TEST CASE + // alice delegates to a pool + // alice revokes the delegation + // pool tries to delegate-stack for alice + // the transaction should fail + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); + expect(aliceDelegateTx.tx_status).toBe('success'); + + // TRANSACTION (alice revoke) + const { txid: aliceRevoke } = await alice.client.revokeDelegateStx({ + privateKey: alice.key, + }); + const aliceRevokeTx = await waitForTransaction(aliceRevoke); + expect(aliceRevokeTx.tx_result.repr).toContain('(ok'); + expect(aliceRevokeTx.tx_status).toBe('success'); + + // TRANSACTION (pool delegate-stack-stx) + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 2, + privateKey: pool.key, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(err'); + expect(poolAliceTx.tx_status).toBe('abort_by_response'); + }); + + test('Pool delegate can successfully delegate-stack-extend', async () => { + // TEST CASE + // alice delegates to a pool + // pool delegate-stack-stx for alice + // pool delegate-stack-extend for alice + // lock has been extended + + const alice = getAccount(ENV.REGTEST_KEYS[0]); + const pool = getAccount(ENV.REGTEST_KEYS[2]); + + // PREP + const client = new StackingClient('', network); + + poxInfo = await client.getPoxInfo(); + const pox4Activation = poxInfo.contract_versions[3].activation_burnchain_block_height; + await waitForBurnBlockHeight(pox4Activation + 1); + + poxInfo = await client.getPoxInfo(); + + const amount = BigInt(poxInfo.min_amount_ustx) * 2n; + + // TRANSACTION (alice delegate) + const { txid: aliceDelegate } = await alice.client.delegateStx({ + amountMicroStx: amount, + delegateTo: pool.address, + poxAddress: pool.btcAddress, + privateKey: alice.key, + }); + const aliceDelegateTx = await waitForTransaction(aliceDelegate); + expect(aliceDelegateTx.tx_result.repr).toContain('(ok'); + expect(aliceDelegateTx.tx_status).toBe('success'); + + // TRANSACTION (pool delegate-stack-stx) + let poolNonce = await getNonce(pool.address, network); + const { txid: poolAlice } = await pool.client.delegateStackStx({ + stacker: alice.address, + amountMicroStx: amount, + poxAddress: pool.btcAddress, + burnBlockHeight: poxInfo.current_burnchain_block_height, + cycles: 1, + privateKey: pool.key, + nonce: poolNonce++, + }); + const poolAliceTx = await waitForTransaction(poolAlice); + expect(poolAliceTx.tx_result.repr).toContain('(ok'); + expect(poolAliceTx.tx_status).toBe('success'); + + // CHECK LOCKED + const status = await alice.client.getStatus(); + if (!status.stacked) throw 'not stacked'; + expect(status.details.unlock_height).toBeGreaterThan(0); + expect(await alice.client.getAccountBalanceLocked()).toBe(amount); + + // TRANSACTION (pool delegate-stack-extend) + const { txid: poolAlice2 } = await pool.client.delegateStackExtend({ + stacker: alice.address, + poxAddress: pool.btcAddress, + extendCount: 1, + privateKey: pool.key, + nonce: poolNonce++, + }); + const poolAlice2Tx = await waitForTransaction(poolAlice2); + expect(poolAlice2Tx.tx_result.repr).toContain('(ok'); + expect(poolAlice2Tx.tx_status).toBe('success'); + + // CHECK LOCKED + const statusExtend = await alice.client.getStatus(); + if (!statusExtend.stacked) throw 'not stacked'; + expect(statusExtend.details.unlock_height).toBeGreaterThan(status.details.unlock_height); + expect(await alice.client.getAccountBalanceLocked()).toBe(amount); + }); +}); diff --git a/src/tests/scripts.test.ts b/src/tests/scripts.test.ts new file mode 100644 index 0000000..968e4a9 --- /dev/null +++ b/src/tests/scripts.test.ts @@ -0,0 +1,38 @@ +import { StacksDevnet } from '@stacks/network'; +import { StackingClient } from '@stacks/stacking'; +import { ENV } from '../env'; +import { getAccount, getRewardSlots, getTransactions } from '../helpers'; + +test('get account status', async () => { + const steph = getAccount(ENV.REGTEST_KEYS[0]); + const client = new StackingClient(steph.address, new StacksDevnet()); + const status = await client.getStatus(); + console.log(status); + console.log((await client.getPoxInfo()).current_burnchain_block_height); +}); + +test('get account', () => { + const steph = getAccount(ENV.REGTEST_KEYS[0]); + console.log(steph); +}); + +test('get signer', () => { + const signer = getAccount(ENV.SIGNER_KEY); + console.log(signer); +}); + +test('get reward slot', async () => { + const steph = getAccount(ENV.REGTEST_KEYS[0]); + const rewards = await getRewardSlots(steph.btcAddress); + console.log(rewards[0]); +}); + +test('get transactions', async () => { + const steph = getAccount(ENV.REGTEST_KEYS[0]); + const txs = await getTransactions(steph.address); + console.log(txs); +}); + +test('get env info', () => { + console.log(typeof ENV.REGTEST_SKIP_UNLOCK); +}); diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..ffc8edb --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,84 @@ +import { timeout } from '@hirosystems/api-toolkit'; +import { exec } from 'child_process'; +import { existsSync, renameSync } from 'fs'; +import { join } from 'path'; +import { promisify } from 'util'; +import { ENV } from './env'; + +const x = promisify(exec); + +export function withRetry( + maxRetries: number, + fn: (...args: A) => Promise +): (...args: A) => Promise { + return async function retryWrapper(...args: A): Promise { + let attempts = 0; + while (true) { + try { + return await fn(...args); + } catch (err: any) { + if (err.status !== 502 && attempts >= maxRetries) throw err; // ignore Bad Gateway errors + await timeout(ENV.RETRY_INTERVAL); + attempts++; + } + } + }; +} + +export function withTimeout( + timeoutMs: number, + fn: (...args: A) => Promise +): (...args: A) => Promise { + return async function timeoutWrapper(...args: A): Promise { + let handle = undefined; + const timeoutPromise = new Promise((_, reject) => { + handle = setTimeout(() => reject('Timeout'), timeoutMs); + }); + + try { + return await Promise.race([timeoutPromise, fn(...args)]); + } finally { + if (handle) clearTimeout(handle); + } + }; +} + +export async function storeEventsTsv(suffix: string = '') { + let testname = expect.getState().currentTestName ?? ''; + testname = testname + .replace(/[^a-zA-Z0-9]/g, ' ') + .trim() + .replace(/\W+/g, '-'); + const filename = `${testname}${suffix ? `-${suffix}` : ''}.tsv`; + const filepath = join(process.cwd(), filename); + + if (existsSync(filepath)) { + // Backup if exists + const datetime = new Date().toISOString().replace(/\D/g, '').slice(0, 15); + const backupPath = join(process.cwd(), `${filename}.${datetime}.bak`); + renameSync(filepath, backupPath); + } + + const out = await x( + `docker exec stacks-regtest-env-postgres-1 psql \ + -U postgres stacks_blockchain_api -c \ + "COPY (SELECT id, receive_timestamp, event_path, payload FROM event_observer_requests ORDER BY id ASC) TO STDOUT ENCODING 'UTF8'" > \ + ${filename}` + ); + if (out.stderr) throw new Error(out.stderr); + return out.stdout; +} + +export async function startRegtestEnv() { + console.log('starting regtest-env...'); + const out = await x(ENV.REGTEST_UP_CMD); + // if (out.stderr) throw new Error(out.stderr); + return out.stdout; +} + +export async function stopRegtestEnv() { + console.log('stopping regtest-env...'); + const out = await x(ENV.REGTEST_DOWN_CMD); + // if (out.stderr) throw new Error(out.stderr); + return out.stdout; +} diff --git a/tsconfig.json b/tsconfig.json index e075f97..1c69bc3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "target": "es2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */