From 7bd76627d0f18057f2bb8ad3810de6a7e3f9e656 Mon Sep 17 00:00:00 2001 From: alecps Date: Wed, 2 Aug 2023 20:27:02 -0400 Subject: [PATCH 01/27] update pnpcommon README, release sdks script, combiner deps --- .../phone-number-privacy/combiner/package.json | 1 - packages/phone-number-privacy/common/README.md | 5 +++-- scripts/deploy-sdks.ts | 14 +++++++++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/phone-number-privacy/combiner/package.json b/packages/phone-number-privacy/combiner/package.json index 3112b68489d..3e1904d6caf 100644 --- a/packages/phone-number-privacy/combiner/package.json +++ b/packages/phone-number-privacy/combiner/package.json @@ -32,7 +32,6 @@ "@celo/phone-number-privacy-common": "^3.0.0-dev", "@celo/identity": "^4.1.1-dev", "@celo/encrypted-backup": "^4.1.1-dev", - "@celo/identity-prev": "npm:@celo/identity@1.2.0", "@celo/poprf": "^0.1.9", "@types/bunyan": "^1.8.8", "blind-threshold-bls": "https://github.com/celo-org/blind-threshold-bls-wasm#e1e2f8a", diff --git a/packages/phone-number-privacy/common/README.md b/packages/phone-number-privacy/common/README.md index 369c3daaa9c..1b8f2a2e2e3 100644 --- a/packages/phone-number-privacy/common/README.md +++ b/packages/phone-number-privacy/common/README.md @@ -26,8 +26,9 @@ These instructions assume the following scenario for readability: - i.e. search and replace `3.1.1-dev` with `3.2.0-beta.1` (note that we’ve removed the `-dev`) 4. Same idea as above -- ensure the version of the `@celo/phone-number-privacy-common` package is set to the version you are trying to release (i.e. `2.0.3-beta.1`) and that all other packages are importing this version. 5. From the monorepo root directory, run `yarn reset && yarn && yarn build` (expect this to take at least 10 mins) -6. Commit your changes with the message `3.2.0-beta.1` -7. Publish the ODIS common package by navigating to the `phone-number-privacy/common` directory and running `npm publish —-tag beta --version 3.2.0-beta.1 —-otp ` +6. Commit your changes with the message `3.2.0-beta.1 +7. Publish the ODIS common package by navigating to the `phone-number-privacy/common` directory and running `npm publish —-tag beta` + - You will be prompted to enter your OTP - When publishing as `latest`, omit the `--tag beta` 8. Publish the sdks by running `npm run deploy-sdks` from the monorepo root directory - You will be prompted to enter a version number that you wish to publish. i.e. `3.2.0-beta.1` diff --git a/scripts/deploy-sdks.ts b/scripts/deploy-sdks.ts index bbb219380b7..06ea10948e1 100644 --- a/scripts/deploy-sdks.ts +++ b/scripts/deploy-sdks.ts @@ -33,10 +33,10 @@ */ import * as child_process from 'child_process' -import * as colors from 'colors' +import colors from 'colors' import * as fs from 'fs' import * as path from 'path' -import * as prompt from 'prompt' +import prompt from 'prompt' import * as semver from 'semver' const VERSIONS = ['major', 'minor', 'patch'] @@ -121,7 +121,7 @@ type Answers = { // `package.json` dependencies. const sdkNames = sdkJsons.map(({ name }) => name) - let newVersion: string + let newVersion: string = '' // Here we update the sdk `package.json` objects with updated // versions and dependencies. sdkJsons.forEach((json, index) => { @@ -200,12 +200,16 @@ type Answers = { successfulPackages.push(packageJson.name) // remove license files from sdks folders child_process.execSync('rm LICENSE', { cwd: packageFolderPath, stdio: 'inherit' }) - } catch (e) { + } catch (e: unknown) { const errorPrompt = [ { name: 'retry', description: colors.red( - `${packageJson.name} failed to publish. (Did you run 'yarn deploy-sdks'? must be run as 'npm run deploy-sdks') Error message: ${e.message} Retry? Y/N` + `${ + packageJson.name + } failed to publish. (Did you run 'yarn deploy-sdks'? must be run as 'npm run deploy-sdks') Error message: ${ + (e as Error).message + } Retry? Y/N` ), }, ] From 1d2aa5c34080220720c9fc7438032f3da63210ca Mon Sep 17 00:00:00 2001 From: Alec Schaefer Date: Wed, 2 Aug 2023 21:26:52 -0400 Subject: [PATCH 02/27] Update packages/phone-number-privacy/common/README.md Co-authored-by: soloseng <102702451+soloseng@users.noreply.github.com> --- packages/phone-number-privacy/common/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/phone-number-privacy/common/README.md b/packages/phone-number-privacy/common/README.md index 1b8f2a2e2e3..70cc0a7a014 100644 --- a/packages/phone-number-privacy/common/README.md +++ b/packages/phone-number-privacy/common/README.md @@ -26,7 +26,7 @@ These instructions assume the following scenario for readability: - i.e. search and replace `3.1.1-dev` with `3.2.0-beta.1` (note that we’ve removed the `-dev`) 4. Same idea as above -- ensure the version of the `@celo/phone-number-privacy-common` package is set to the version you are trying to release (i.e. `2.0.3-beta.1`) and that all other packages are importing this version. 5. From the monorepo root directory, run `yarn reset && yarn && yarn build` (expect this to take at least 10 mins) -6. Commit your changes with the message `3.2.0-beta.1 +6. Commit your changes with the message `3.2.0-beta.1` 7. Publish the ODIS common package by navigating to the `phone-number-privacy/common` directory and running `npm publish —-tag beta` - You will be prompted to enter your OTP - When publishing as `latest`, omit the `--tag beta` From 2077c418bb0710aff89cf8dd5e2fe687623bf686 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Thu, 3 Aug 2023 17:19:25 -0400 Subject: [PATCH 03/27] Soloseng/firebase-dep-update (#10468) * bump firebase version * format `minInstances` to number * updated peer dependecy --- .../combiner/package.json | 12 +- .../combiner/src/index.ts | 2 +- yarn.lock | 1406 +++++++++++++++-- 3 files changed, 1317 insertions(+), 103 deletions(-) diff --git a/packages/phone-number-privacy/combiner/package.json b/packages/phone-number-privacy/combiner/package.json index 3e1904d6caf..b248db4a91c 100644 --- a/packages/phone-number-privacy/combiner/package.json +++ b/packages/phone-number-privacy/combiner/package.json @@ -37,8 +37,8 @@ "blind-threshold-bls": "https://github.com/celo-org/blind-threshold-bls-wasm#e1e2f8a", "dotenv": "^8.2.0", "express": "^4.17.1", - "firebase-admin": "^9.12.0", - "firebase-functions": "^3.15.7", + "firebase-admin": "^11.10.1", + "firebase-functions": "^4.4.1", "knex": "^2.1.0", "node-fetch": "^2.6.9", "pg": "^8.2.1", @@ -50,13 +50,13 @@ "@types/express": "^4.17.6", "@types/supertest": "^2.0.12", "@types/uuid": "^7.0.3", - "firebase-functions-test": "^0.3.3", - "firebase-tools": "9.20.0" + "firebase-functions-test": "^3.1.0", + "firebase-tools": "12.4.7" }, "peerDependencies": { - "@celo/phone-number-privacy-signer": "^2.0.2" + "@celo/phone-number-privacy-signer": "^3.0.0-dev" }, "engines": { - "node": ">=14" + "node": ">=18" } } diff --git a/packages/phone-number-privacy/combiner/src/index.ts b/packages/phone-number-privacy/combiner/src/index.ts index 4d4e7822dfc..def19e58b58 100644 --- a/packages/phone-number-privacy/combiner/src/index.ts +++ b/packages/phone-number-privacy/combiner/src/index.ts @@ -10,7 +10,7 @@ export const combiner = functions .runWith({ // Keep instances warm for mainnet functions // Defined check required for running tests vs. deployment - minInstances: functions.config().service ? functions.config().service.min_instances : undefined, + minInstances: functions.config().service ? Number(functions.config().service.min_instances) : 0, }) .https.onRequest(startCombiner(config, getContractKit(config.blockchain))) export * from './config' diff --git a/yarn.lock b/yarn.lock index d18e8fa1d40..ff6d71927ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -760,6 +760,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== +"@babel/parser@^7.20.15": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -923,7 +928,7 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@celo/base@1.5.2", "@celo/base@^1.2.0": +"@celo/base@1.5.2": version "1.5.2" resolved "https://registry.yarnpkg.com/@celo/base/-/base-1.5.2.tgz#168ab5e4e30b374079d8d139fafc52ca6bfd4100" integrity sha512-KGf6Dl9E6D01vAfkgkjL2sG+zqAjspAogILIpWstljWdG5ifyA75jihrnDEHaMCoQS0KxHvTdP1XYS/GS6BEyQ== @@ -948,7 +953,7 @@ debug "^4.1.1" utf8 "3.0.0" -"@celo/contractkit@1.5.2", "@celo/contractkit@^1.2.0": +"@celo/contractkit@1.5.2": version "1.5.2" resolved "https://registry.yarnpkg.com/@celo/contractkit/-/contractkit-1.5.2.tgz#be15d570f3044a190dabb6bbe53d5081c78ea605" integrity sha512-b0r5TlfYDEscxze1Ai2jyJayiVElA9jvEehMD6aOSNtVhfP8oirjFIIffRe0Wzw1MSDGkw+q1c4m0Yw5sEOlvA== @@ -966,23 +971,6 @@ semver "^7.3.5" web3 "1.3.6" -"@celo/identity-prev@npm:@celo/identity@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@celo/identity/-/identity-1.2.0.tgz#822ce8f2237a8498fad6910a2d2707f6b67a6999" - integrity sha512-vpipC8qyEueIKKY0skPXaNwUDIhodGPv9wfFZ5mywzTIz46dbT0VmNSYkvOnoXlqvAjrwdzgvETbVMmpHpj3Xw== - dependencies: - "@celo/base" "^1.2.0" - "@celo/contractkit" "^1.2.0" - "@celo/utils" "^1.2.0" - "@types/debug" "^4.1.5" - bignumber.js "^9.0.0" - blind-threshold-bls "https://github.com/celo-org/blind-threshold-bls-wasm#e1e2f8a" - cross-fetch "3.0.4" - debug "^4.1.1" - elliptic "^6.5.4" - fp-ts "2.1.1" - io-ts "2.0.1" - "@celo/phone-number-privacy-common@1.0.39": version "1.0.39" resolved "https://registry.yarnpkg.com/@celo/phone-number-privacy-common/-/phone-number-privacy-common-1.0.39.tgz#3c9568f70378d24d11afcc4306024c5cf4f8efe9" @@ -1014,7 +1002,7 @@ lodash "~4.17.19" typechain "2.0.0" -"@celo/utils@1.5.2", "@celo/utils@^1.2.0": +"@celo/utils@1.5.2": version "1.5.2" resolved "https://registry.yarnpkg.com/@celo/utils/-/utils-1.5.2.tgz#ddb7f3b50c801225ab41d2355fbe010976329099" integrity sha512-JyKjuVMbdkyFOb1TpQw6zqamPQWYg7I9hOnva3MeIcQ3ZrJIaNHx0/I+JXFjuu3YYBc1mG8nXp2uPJJTGrwzCQ== @@ -1691,6 +1679,13 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@fastify/busboy@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-1.2.1.tgz#9c6db24a55f8b803b5222753b24fe3aea2ba9ca3" + integrity sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q== + dependencies: + text-decoding "^1.0.0" + "@firebase/app-types@0.6.3": version "0.6.3" resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.6.3.tgz#3f10514786aad846d74cd63cb693556309918f4b" @@ -1701,11 +1696,21 @@ resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.7.0.tgz#c9e16d1b8bed1a991840b8d2a725fb58d0b5899f" integrity sha512-6fbHQwDv2jp/v6bXhBw2eSRbNBpxHcd1NBF864UksSMVIqIyri9qpJB1Mn6sGZE+bnDsSQBC5j2TbMxYsJQkQg== +"@firebase/app-types@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.9.0.tgz#35b5c568341e9e263b29b3d2ba0e9cfc9ec7f01e" + integrity sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q== + "@firebase/auth-interop-types@0.1.6": version "0.1.6" resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz#5ce13fc1c527ad36f1bb1322c4492680a6cf4964" integrity sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g== +"@firebase/auth-interop-types@0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz#78884f24fa539e34a06c03612c75f222fcc33742" + integrity sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg== + "@firebase/component@0.5.13": version "0.5.13" resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.5.13.tgz#65a382e83bddd109380c9aa1f280791b1b4567c4" @@ -1714,6 +1719,14 @@ "@firebase/util" "1.5.2" tslib "^2.1.0" +"@firebase/component@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.6.4.tgz#8981a6818bd730a7554aa5e0516ffc9b1ae3f33d" + integrity sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA== + dependencies: + "@firebase/util" "1.9.3" + tslib "^2.1.0" + "@firebase/database-compat@^0.1.1": version "0.1.8" resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-0.1.8.tgz#ab627f2bdbe94367f515d5bded880c86886bbd28" @@ -1726,6 +1739,26 @@ "@firebase/util" "1.5.2" tslib "^2.1.0" +"@firebase/database-compat@^0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-0.3.4.tgz#4e57932f7a5ba761cd5ac946ab6b6ab3f660522c" + integrity sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg== + dependencies: + "@firebase/component" "0.6.4" + "@firebase/database" "0.14.4" + "@firebase/database-types" "0.10.4" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + tslib "^2.1.0" + +"@firebase/database-types@0.10.4", "@firebase/database-types@^0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.10.4.tgz#47ba81113512dab637abace61cfb65f63d645ca7" + integrity sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ== + dependencies: + "@firebase/app-types" "0.9.0" + "@firebase/util" "1.9.3" + "@firebase/database-types@0.9.7": version "0.9.7" resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.9.7.tgz#c5ee0ea9bb2703a13c1c47fe880fc577d5ce7f33" @@ -1753,6 +1786,18 @@ faye-websocket "0.11.4" tslib "^2.1.0" +"@firebase/database@0.14.4": + version "0.14.4" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.14.4.tgz#9e7435a16a540ddfdeb5d99d45618e6ede179aa6" + integrity sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ== + dependencies: + "@firebase/auth-interop-types" "0.2.1" + "@firebase/component" "0.6.4" + "@firebase/logger" "0.4.0" + "@firebase/util" "1.9.3" + faye-websocket "0.11.4" + tslib "^2.1.0" + "@firebase/logger@0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.3.2.tgz#5046ffa8295c577846d54b6ca95645a03809800e" @@ -1760,6 +1805,13 @@ dependencies: tslib "^2.1.0" +"@firebase/logger@0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.4.0.tgz#15ecc03c452525f9d47318ad9491b81d1810f113" + integrity sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA== + dependencies: + tslib "^2.1.0" + "@firebase/util@1.5.2": version "1.5.2" resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.5.2.tgz#bdd2bc11c956a8a6a0fa25fbd752a13e033558bc" @@ -1767,6 +1819,13 @@ dependencies: tslib "^2.1.0" +"@firebase/util@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.9.3.tgz#45458dd5cd02d90e55c656e84adf6f3decf4b7ed" + integrity sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA== + dependencies: + tslib "^2.1.0" + "@ganache/console.log@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@ganache/console.log/-/console.log-0.2.0.tgz#32ea0df806ed735d61bd0537d7b7fc350e511479" @@ -1826,6 +1885,16 @@ google-gax "^2.24.1" protobufjs "^6.8.6" +"@google-cloud/firestore@^6.6.0": + version "6.7.0" + resolved "https://registry.yarnpkg.com/@google-cloud/firestore/-/firestore-6.7.0.tgz#9b6105442f972307ffc252b372ba7e67e38243fd" + integrity sha512-bkH2jb5KkQSUa+NAvpip9HQ+rpYhi77IaqHovWuN07adVmvNXX08gPpvPWEzoXYa/wDjEVI7LiAtCWkJJEYTNg== + dependencies: + fast-deep-equal "^3.1.1" + functional-red-black-tree "^1.0.1" + google-gax "^3.5.7" + protobufjs "^7.0.0" + "@google-cloud/kms@~2.9.0": version "2.9.0" resolved "https://registry.yarnpkg.com/@google-cloud/kms/-/kms-2.9.0.tgz#3f7e51a3e30795a69ded4ea4f96609a59b503001" @@ -1859,6 +1928,14 @@ arrify "^2.0.0" extend "^3.0.2" +"@google-cloud/paginator@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-4.0.1.tgz#5fb8793d4f84d18c50a6f2fad3dadab8d2c533ef" + integrity sha512-6G1ui6bWhNyHjmbYwavdN7mpVPRBtyDg/bfqBTAlwr413On2TnFNfDxc9UhTJctkgoCDgQXEKiRPLPR9USlkbQ== + dependencies: + arrify "^2.0.0" + extend "^3.0.2" + "@google-cloud/precise-date@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@google-cloud/precise-date/-/precise-date-0.1.0.tgz#02ccda04b4413fa64f098fc93db51e95af5c855a" @@ -1869,6 +1946,11 @@ resolved "https://registry.yarnpkg.com/@google-cloud/precise-date/-/precise-date-2.0.4.tgz#930b0cbf557ef3a4bfeeb121cfc6da341212a2cb" integrity sha512-nOB+mZdevI/1Si0QAfxWfzzIqFdc7wrO+DYePFvgbOoMtvX+XfFTINNt7e9Zg66AbDbWCPRnikU+6f5LTm9Wyg== +"@google-cloud/precise-date@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@google-cloud/precise-date/-/precise-date-3.0.1.tgz#1e6659a14af662442037b8f4d20dbc82bf1a78bd" + integrity sha512-crK2rgNFfvLoSgcKJY7ZBOLW91IimVNmPfi1CL+kMTf78pTJYd29XqEVedAeBu4DwCJc0EDIp1MpctLgoPq+Uw== + "@google-cloud/projectify@^0.3.0", "@google-cloud/projectify@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-0.3.3.tgz#bde9103d50b20a3ea3337df8c6783a766e70d41d" @@ -1879,6 +1961,11 @@ resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-2.1.1.tgz#ae6af4fee02d78d044ae434699a630f8df0084ef" integrity sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ== +"@google-cloud/projectify@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-3.0.0.tgz#302b25f55f674854dce65c2532d98919b118a408" + integrity sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA== + "@google-cloud/promisify@^0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-0.4.0.tgz#4fbfcf4d85bb6a2e4ccf05aa63d2b10d6c9aad9b" @@ -1889,6 +1976,11 @@ resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-2.0.4.tgz#9d8705ecb2baa41b6b2673f3a8e9b7b7e1abc52a" integrity sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA== +"@google-cloud/promisify@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-3.0.1.tgz#8d724fb280f47d1ff99953aee0c1669b25238c2e" + integrity sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA== + "@google-cloud/pubsub@^0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-0.28.1.tgz#8d0605e155f5a8c36f7b51363c1e139f534b5fd8" @@ -1934,6 +2026,28 @@ lodash.snakecase "^4.1.1" p-defer "^3.0.0" +"@google-cloud/pubsub@^3.0.1": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-3.7.3.tgz#4ec354fab0e6492654b4365024e0b15def23a08b" + integrity sha512-ZRDC4g7tpIJ8fkAp4MiU+tDfousM/q6pXK6ytFn0cbYEdNQuWOf4wqopNYMOUJ+AIjaTbgmNw77dStOKTc9Acg== + dependencies: + "@google-cloud/paginator" "^4.0.0" + "@google-cloud/precise-date" "^3.0.0" + "@google-cloud/projectify" "^3.0.0" + "@google-cloud/promisify" "^2.0.0" + "@opentelemetry/api" "^1.0.0" + "@opentelemetry/semantic-conventions" "~1.3.0" + "@types/duplexify" "^3.6.0" + "@types/long" "^4.0.0" + arrify "^2.0.0" + extend "^3.0.2" + google-auth-library "^8.0.2" + google-gax "^3.6.1" + heap-js "^2.2.0" + is-stream-ended "^0.1.4" + lodash.snakecase "^4.1.1" + p-defer "^3.0.0" + "@google-cloud/secret-manager@3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@google-cloud/secret-manager/-/secret-manager-3.0.0.tgz#31842287bd0eee380210488ae40cae3732b2b32f" @@ -1997,6 +2111,30 @@ uuid "^8.0.0" xdg-basedir "^4.0.0" +"@google-cloud/storage@^6.9.5": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-6.12.0.tgz#a5d3093cc075252dca5bd19a3cfda406ad3a9de1" + integrity sha512-78nNAY7iiZ4O/BouWMWTD/oSF2YtYgYB3GZirn0To6eBOugjXVoK+GXgUXOl+HlqbAOyHxAVXOlsj3snfbQ1dw== + dependencies: + "@google-cloud/paginator" "^3.0.7" + "@google-cloud/projectify" "^3.0.0" + "@google-cloud/promisify" "^3.0.0" + abort-controller "^3.0.0" + async-retry "^1.3.3" + compressible "^2.0.12" + duplexify "^4.0.0" + ent "^2.2.0" + extend "^3.0.2" + fast-xml-parser "^4.2.2" + gaxios "^5.0.0" + google-auth-library "^8.0.1" + mime "^3.0.0" + mime-types "^2.0.8" + p-limit "^3.0.1" + retry-request "^5.0.0" + teeny-request "^8.0.0" + uuid "^8.0.0" + "@graphql-tools/batch-execute@8.5.1": version "8.5.1" resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-8.5.1.tgz#fa3321d58c64041650be44250b1ebc3aab0ba7a9" @@ -2100,6 +2238,14 @@ "@grpc/proto-loader" "^0.7.0" "@types/node" ">=12.12.47" +"@grpc/grpc-js@~1.8.0": + version "1.8.21" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.21.tgz#d282b122c71227859bf6c5866f4c40f4a2696513" + integrity sha512-KeyQeZpxeEBSqFVTi3q2K7PiPXmgBfECc4updA1ejCLjYmoAlvvM3ZMp5ztTDUCUQmoY3CpDxvchjO1+rFkoHg== + dependencies: + "@grpc/proto-loader" "^0.7.0" + "@types/node" ">=12.12.47" + "@grpc/proto-loader@0.6.9": version "0.6.9" resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.9.tgz#4014eef366da733f8e04a9ddd7376fe8a58547b7" @@ -2146,6 +2292,18 @@ resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@isaacs/string-locale-compare@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" @@ -2419,6 +2577,13 @@ resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== +"@jsdoc/salty@^0.2.1": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@jsdoc/salty/-/salty-0.2.5.tgz#1b2fa5bb8c66485b536d86eee877c263d322f692" + integrity sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw== + dependencies: + lodash "^4.17.21" + "@ledgerhq/cryptoassets@^5.53.0": version "5.53.0" resolved "https://registry.yarnpkg.com/@ledgerhq/cryptoassets/-/cryptoassets-5.53.0.tgz#11dcc93211960c6fd6620392e4dd91896aaabe58" @@ -3377,6 +3542,13 @@ "@gar/promisify" "^1.1.3" semver "^7.3.5" +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== + dependencies: + semver "^7.3.5" + "@npmcli/git@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-3.0.2.tgz#5c5de6b4d70474cf2d09af149ce42e4e1dacb931" @@ -3918,6 +4090,11 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.12.0.tgz#19c959bdb900986e74939d4227e757aa16936b91" integrity sha512-hO+bdeGOlJwqowUBoZF5LyP3ORUFOP1G0GRv8N45W/cztXbT2ZEXaAzfokRS9Xc9FWmYrDj32mF6SzH6wuoIyA== +"@opentelemetry/semantic-conventions@~1.3.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.3.1.tgz#ba07b864a3c955f061aa30ea3ef7f4ae4449794a" + integrity sha512-wU5J8rUoo32oSef/rFpOT1HIjLjAv3qIDHkw1QIhODV3OpAVHi5oVzlouozg9obUmZKtbZ0qUe/m7FP0y0yBzA== + "@openzeppelin/upgrades@^2.8.0": version "2.8.0" resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades/-/upgrades-2.8.0.tgz#8086ab9c99d9f8dac7205030b0f9e7e4a280c4a3" @@ -3952,6 +4129,32 @@ node-addon-api "^3.2.1" node-gyp-build "^4.3.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" + integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -4229,6 +4432,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + "@truffle/abi-utils@^0.3.0", "@truffle/abi-utils@^0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.3.9.tgz#c476f5cfe01072b513b3e93fd7bea05cf7bd9d96" @@ -5204,6 +5412,13 @@ dependencies: "@types/node" "*" +"@types/jsonwebtoken@^9.0.0": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#9eeb56c76dd555039be2a3972218de5bd3b8d83e" + integrity sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q== + dependencies: + "@types/node" "*" + "@types/keyv@^3.1.4": version "3.1.4" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" @@ -5235,6 +5450,11 @@ "@types/abstract-leveldown" "*" "@types/node" "*" +"@types/linkify-it@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" + integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA== + "@types/lodash@^4.14.104", "@types/lodash@^4.14.170": version "4.14.194" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" @@ -5255,6 +5475,14 @@ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== +"@types/markdown-it@^12.2.3": + version "12.2.3" + resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51" + integrity sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ== + dependencies: + "@types/linkify-it" "*" + "@types/mdurl" "*" + "@types/mathjs@^4.4.1": version "4.4.5" resolved "https://registry.yarnpkg.com/@types/mathjs/-/mathjs-4.4.5.tgz#b28d46919c68b93bcabf0551729624b302af9b4b" @@ -5262,6 +5490,11 @@ dependencies: decimal.js "^10.0.0" +"@types/mdurl@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" + integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== + "@types/mime@*": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" @@ -5515,7 +5748,7 @@ resolved "https://registry.yarnpkg.com/@types/revalidator/-/revalidator-0.3.8.tgz#86e0b03b49736000ad42ce6b002725e74c6805ff" integrity sha512-q6KSi3PklLGQ0CesZ/XuLwly4DXXlnJuucYOG9lrBqrP8rKiuPZThav2h2+pFjaheNpnT0qKK3i304QWIePeJw== -"@types/rimraf@3.0.2": +"@types/rimraf@3.0.2", "@types/rimraf@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.2.tgz#a63d175b331748e5220ad48c901d7bbf1f44eef8" integrity sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ== @@ -5856,7 +6089,7 @@ accepts@^1.3.5, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-jsx@^5.0.0: +acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -5876,6 +6109,11 @@ acorn@^8.4.1, acorn@^8.7.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + adal-node@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/adal-node/-/adal-node-0.2.4.tgz#881beed9d493b76a86706ad5c8dc6f60eff04520" @@ -5919,6 +6157,13 @@ agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" +agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + dependencies: + debug "^4.3.4" + agentkeepalive@^4.1.3, agentkeepalive@^4.2.1: version "4.3.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" @@ -5936,7 +6181,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv-formats@^2.1.1: +ajv-formats@^2.1.0, ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== @@ -5953,7 +6198,7 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.5, ajv@^6.12.6, aj json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.6.3: +ajv@^8.0.0, ajv@^8.3.0, ajv@^8.6.3: version "8.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -6009,6 +6254,13 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" +ansi-escapes@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.0.tgz#8a13ce75286f417f1963487d86ba9f90dccf9947" + integrity sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw== + dependencies: + type-fest "^3.0.0" + ansi-regex@^2.0.0, ansi-regex@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -6029,6 +6281,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -6053,6 +6310,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + ansi-wrap@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" @@ -6501,7 +6763,7 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== -ast-types@^0.13.2: +ast-types@^0.13.2, ast-types@^0.13.4: version "0.13.4" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== @@ -6530,6 +6792,11 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-lock@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.3.2.tgz#56668613f91c1c55432b4db73e65c9ced664e789" + integrity sha512-phnXdS3RP7PPcmP6NWWzWMU0sLTeyvtZCxBPpZdkYE3seGLKSQZs9FrmVO/qwypq98FUtWWUEYxziLkdGk5nnA== + async-mutex@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" @@ -6813,6 +7080,11 @@ basic-auth@~2.0.1: dependencies: safe-buffer "5.1.2" +basic-ftp@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.3.tgz#b14c0fe8111ce001ec913686434fe0c2fb461228" + integrity sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g== + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -7023,7 +7295,7 @@ bluebird@^2.9.33: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" integrity sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ== -bluebird@^3.5.0, bluebird@^3.5.2: +bluebird@^3.5.0, bluebird@^3.5.2, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -7525,6 +7797,24 @@ cacache@^16.0.0, cacache@^16.0.6, cacache@^16.1.0: tar "^6.1.11" unique-filename "^2.0.0" +cacache@^17.0.0: + version "17.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" + integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -7683,6 +7973,13 @@ catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== +catharsis@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" + integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== + dependencies: + lodash "^4.17.15" + caw@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034" @@ -7784,6 +8081,11 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + change-case@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.0.2.tgz#fd48746cce02f03f0a672577d1d3a8dc2eceb037" @@ -8059,7 +8361,16 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" -cli-table@^0.3.1: +cli-table3@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-table@0.3.11, cli-table@^0.3.1: version "0.3.11" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.11.tgz#ac69cdecbe81dccdba4889b9a18b7da312a9d3ee" integrity sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ== @@ -8347,6 +8658,11 @@ colorette@2.0.19: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== +colorette@^2.0.19: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + colors@1.0.3, colors@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -8414,6 +8730,11 @@ commander@3.0.2, commander@^3.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commander@^2.12.1, commander@^2.20.3, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -8545,7 +8866,7 @@ conf@^10.1.2: pkg-up "^3.1.0" semver "^7.3.5" -config-chain@^1.1.12: +config-chain@^1.1.11, config-chain@^1.1.12: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== @@ -8577,7 +8898,7 @@ configstore@^5.0.0, configstore@^5.0.1: write-file-atomic "^3.0.0" xdg-basedir "^4.0.0" -connect@^3.6.2: +connect@^3.6.2, connect@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== @@ -8976,6 +9297,11 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +csv-parse@^5.0.4: + version "5.4.0" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.4.0.tgz#6793210a4a49a9a74b3fde3f9d00f3f52044fd89" + integrity sha512-JiQosUWiOFgp4hQn0an+SBoV9IKdqzhROM0iiN4LB7UpfJBlsSJlWl9nq4zGgxgMAzHJ6V4t29VAVD+3+2NJAg== + csv-parser@^2.0.0: version "2.3.5" resolved "https://registry.yarnpkg.com/csv-parser/-/csv-parser-2.3.5.tgz#6b3bf0907684914ff2c5abfbadab111a69eae5db" @@ -9033,6 +9359,11 @@ data-uri-to-buffer@3: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +data-uri-to-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz#db89a9e279c2ffe74f50637a59a32fb23b3e4d7c" + integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== + dataloader@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.1.0.tgz#c69c538235e85e7ac6c6c444bae8ecabf5de9df7" @@ -9348,6 +9679,15 @@ degenerator@^3.0.2: esprima "^4.0.0" vm2 "^3.9.11" +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + delay@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" @@ -9692,6 +10032,11 @@ duplexify@^4.0.0, duplexify@^4.1.1: readable-stream "^3.1.1" stream-shift "^1.0.0" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -9780,6 +10125,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + enabled@2.0.x: version "2.0.0" resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" @@ -9854,6 +10204,11 @@ entities@^4.2.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -10056,7 +10411,7 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -escodegen@^1.8.1: +escodegen@^1.13.0, escodegen@^1.8.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== @@ -10068,6 +10423,17 @@ escodegen@^1.8.1: optionalDependencies: source-map "~0.6.1" +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -10088,6 +10454,11 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== +eslint-visitor-keys@^3.4.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz#8c2095440eca8c933bedcadf16fefa44dbe9ba5f" + integrity sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw== + eslint@^5.16.0, eslint@^5.5.0, eslint@^5.6.0: version "5.16.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" @@ -10144,6 +10515,15 @@ espree@^5.0.1: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" +espree@^9.0.0: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + esprima-extract-comments@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/esprima-extract-comments/-/esprima-extract-comments-1.1.0.tgz#0dacab567a5900240de6d344cf18c33617becbc9" @@ -10825,6 +11205,13 @@ exegesis-express@^2.0.0: dependencies: exegesis "^2.5.7" +exegesis-express@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/exegesis-express/-/exegesis-express-4.0.0.tgz#f5f8486f6f0d81739e8e27ce75ce0f61ba3f3578" + integrity sha512-V2hqwTtYRj0bj43K4MCtm0caD97YWkqOUHFMRCBW5L1x9IjyqOEc7Xa4oQjjiFbeFOSQzzwPV+BzXsQjSz08fw== + dependencies: + exegesis "^4.1.0" + exegesis@^2.5.7: version "2.5.7" resolved "https://registry.yarnpkg.com/exegesis/-/exegesis-2.5.7.tgz#232c4b01361bc2bf0d9d4c07549c479e77f2b7a3" @@ -10847,6 +11234,29 @@ exegesis@^2.5.7: raw-body "^2.3.3" semver "^7.0.0" +exegesis@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/exegesis/-/exegesis-4.1.1.tgz#555dfbec663e71d0d71297a9fe13edfdd64f8849" + integrity sha512-PvSqaMOw2absLBgsthtJyVOeCHN4lxQ1dM7ibXb6TfZZJaoXtGELoEAGJRFvdN16+u9kg8oy1okZXRk8VpimWA== + dependencies: + "@apidevtools/json-schema-ref-parser" "^9.0.3" + ajv "^8.3.0" + ajv-formats "^2.1.0" + body-parser "^1.18.3" + content-type "^1.0.4" + deep-freeze "0.0.1" + events-listener "^1.1.0" + glob "^7.1.3" + json-ptr "^3.0.1" + json-schema-traverse "^1.0.0" + lodash "^4.17.11" + openapi3-ts "^3.1.1" + promise-breaker "^6.0.0" + pump "^3.0.0" + qs "^6.6.0" + raw-body "^2.3.3" + semver "^7.0.0" + exit-code@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/exit-code/-/exit-code-1.0.2.tgz#ce165811c9f117af6a5f882940b96ae7f9aecc34" @@ -10914,6 +11324,11 @@ expect@^29.0.0, expect@^29.5.0: jest-message-util "^29.5.0" jest-util "^29.5.0" +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + export-files@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/export-files/-/export-files-2.1.1.tgz#bbf64574053a09e4eb98e5f43501d572b2c3ce7f" @@ -11140,6 +11555,13 @@ fast-url-parser@^1.1.3: dependencies: punycode "^1.3.2" +fast-xml-parser@^4.2.2: + version "4.2.7" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.2.7.tgz#871f2ca299dc4334b29f8da3658c164e68395167" + integrity sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig== + dependencies: + strnum "^1.0.5" + fastest-levenshtein@^1.0.7: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -11413,6 +11835,23 @@ findup-sync@^1.0.0: micromatch "^2.3.7" resolve-dir "^0.1.0" +firebase-admin@^11.10.1: + version "11.10.1" + resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-11.10.1.tgz#5f0f83a44627e89938d350c5e4bbac76596c963e" + integrity sha512-atv1E6GbuvcvWaD3eHwrjeP5dAVs+EaHEJhu9CThMzPY6In8QYDiUR6tq5SwGl4SdA/GcAU0nhwWc/FSJsAzfQ== + dependencies: + "@fastify/busboy" "^1.2.1" + "@firebase/database-compat" "^0.3.4" + "@firebase/database-types" "^0.10.4" + "@types/node" ">=12.12.47" + jsonwebtoken "^9.0.0" + jwks-rsa "^3.0.1" + node-forge "^1.3.1" + uuid "^9.0.0" + optionalDependencies: + "@google-cloud/firestore" "^6.6.0" + "@google-cloud/storage" "^6.9.5" + firebase-admin@^9.12.0: version "9.12.0" resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-9.12.0.tgz#d7e889e97c9c31610efbcd131bb6d06a783af757" @@ -11437,6 +11876,15 @@ firebase-functions-test@^0.3.3: "@types/lodash" "^4.14.104" lodash "^4.17.5" +firebase-functions-test@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/firebase-functions-test/-/firebase-functions-test-3.1.0.tgz#5f0946237d004d86db5ff8cfab2ab0a566ffdb75" + integrity sha512-yfm9ToguShxmRXb7TINN88zE2bM9gsBbs7vMWVKJAxGcl/n1f/U0sT5k2yho676QIcSqXVSjCONU8W4cUEL+Sw== + dependencies: + "@types/lodash" "^4.14.104" + lodash "^4.17.5" + ts-deepmerge "^2.0.1" + firebase-functions@^3.15.7: version "3.24.1" resolved "https://registry.yarnpkg.com/firebase-functions/-/firebase-functions-3.24.1.tgz#50d13274c4ae96b2308a67e9fc76f1a74cff690d" @@ -11449,58 +11897,136 @@ firebase-functions@^3.15.7: lodash "^4.17.14" node-fetch "^2.6.7" -firebase-tools@9.20.0: - version "9.20.0" - resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-9.20.0.tgz#96a551147ccc8720e976357c85fb037e371a030d" - integrity sha512-/5LzkZtW8aC57syHf34FXY1w6g9unb7qdvtlYROdJA33sk2xsWsJmuvtJylhYhTNX8zrwFsmiTHRlaBxA9YWtg== +firebase-functions@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/firebase-functions/-/firebase-functions-4.4.1.tgz#209fa3a157476722382e71782fe3375b78a529ff" + integrity sha512-3no53Lg12ToNlPSgLZtAFLQAz6si7ilHvzO8NC3/2EybyUwegpj5YhHwNiCw839lmAWp3znjATJDTvADFiZMrg== dependencies: - "@google-cloud/pubsub" "^2.7.0" - "@types/archiver" "^5.1.0" - JSONStream "^1.2.1" + "@types/cors" "^2.8.5" + "@types/express" "4.17.3" + cors "^2.8.5" + express "^4.17.1" + node-fetch "^2.6.7" + protobufjs "^7.2.2" + +firebase-tools@12.4.7: + version "12.4.7" + resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-12.4.7.tgz#3c581b9ef32d39221eaa11735bbb59a299d6d74a" + integrity sha512-L5nULzh0PElm2OK5lXsj7zkIwBBB4KsGOg0CvCnjdvJ1ROMN2IqffJ0KR/8paXuGWf5SA0VJj2QjG37jFxrAjg== + dependencies: + "@google-cloud/pubsub" "^3.0.1" abort-controller "^3.0.0" ajv "^6.12.6" archiver "^5.0.0" + async-lock "1.3.2" body-parser "^1.19.0" chokidar "^3.0.2" cjson "^0.3.1" - cli-color "^1.2.0" - cli-table "^0.3.1" + cli-table "0.3.11" + colorette "^2.0.19" commander "^4.0.1" configstore "^5.0.1" cors "^2.8.5" cross-env "^5.1.3" - cross-spawn "^7.0.1" - csv-streamify "^3.0.4" - dotenv "^6.1.0" - exegesis "^2.5.7" - exegesis-express "^2.0.0" - exit-code "^1.0.2" + cross-spawn "^7.0.3" + csv-parse "^5.0.4" + exegesis "^4.1.0" + exegesis-express "^4.0.0" express "^4.16.4" filesize "^6.1.0" - fs-extra "^5.0.0" + form-data "^4.0.0" + fs-extra "^10.1.0" glob "^7.1.2" - google-auth-library "^6.1.3" - inquirer "~6.3.1" + google-auth-library "^7.11.0" + inquirer "^8.2.0" js-yaml "^3.13.1" - jsonwebtoken "^8.5.1" + jsonwebtoken "^9.0.0" leven "^3.1.0" + libsodium-wrappers "^0.7.10" lodash "^4.17.21" - marked "^0.7.0" - marked-terminal "^3.3.0" + marked "^4.0.14" + marked-terminal "^5.1.1" mime "^2.5.2" minimatch "^3.0.4" morgan "^1.10.0" - node-fetch "^2.6.1" + node-fetch "^2.6.7" open "^6.3.0" - ora "^3.4.0" - portfinder "^1.0.23" + ora "^5.4.1" + p-limit "^3.0.1" + portfinder "^1.0.32" progress "^2.0.3" - proxy-agent "^5.0.0" + proxy-agent "^6.3.0" request "^2.87.0" + retry "^0.13.1" rimraf "^3.0.0" - semver "^5.7.1" - superstatic "^7.1.0" - tar "^4.3.0" + semver "^7.5.2" + stream-chain "^2.2.4" + stream-json "^1.7.3" + strip-ansi "^6.0.1" + superstatic "^9.0.3" + tar "^6.1.11" + tcp-port-used "^1.0.2" + tmp "^0.2.1" + triple-beam "^1.3.0" + universal-analytics "^0.5.3" + update-notifier-cjs "^5.1.6" + uuid "^8.3.2" + winston "^3.0.0" + winston-transport "^4.4.0" + ws "^7.2.3" + +firebase-tools@9.20.0: + version "9.20.0" + resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-9.20.0.tgz#96a551147ccc8720e976357c85fb037e371a030d" + integrity sha512-/5LzkZtW8aC57syHf34FXY1w6g9unb7qdvtlYROdJA33sk2xsWsJmuvtJylhYhTNX8zrwFsmiTHRlaBxA9YWtg== + dependencies: + "@google-cloud/pubsub" "^2.7.0" + "@types/archiver" "^5.1.0" + JSONStream "^1.2.1" + abort-controller "^3.0.0" + ajv "^6.12.6" + archiver "^5.0.0" + body-parser "^1.19.0" + chokidar "^3.0.2" + cjson "^0.3.1" + cli-color "^1.2.0" + cli-table "^0.3.1" + commander "^4.0.1" + configstore "^5.0.1" + cors "^2.8.5" + cross-env "^5.1.3" + cross-spawn "^7.0.1" + csv-streamify "^3.0.4" + dotenv "^6.1.0" + exegesis "^2.5.7" + exegesis-express "^2.0.0" + exit-code "^1.0.2" + express "^4.16.4" + filesize "^6.1.0" + fs-extra "^5.0.0" + glob "^7.1.2" + google-auth-library "^6.1.3" + inquirer "~6.3.1" + js-yaml "^3.13.1" + jsonwebtoken "^8.5.1" + leven "^3.1.0" + lodash "^4.17.21" + marked "^0.7.0" + marked-terminal "^3.3.0" + mime "^2.5.2" + minimatch "^3.0.4" + morgan "^1.10.0" + node-fetch "^2.6.1" + open "^6.3.0" + ora "^3.4.0" + portfinder "^1.0.23" + progress "^2.0.3" + proxy-agent "^5.0.0" + request "^2.87.0" + rimraf "^3.0.0" + semver "^5.7.1" + superstatic "^7.1.0" + tar "^4.3.0" tcp-port-used "^1.0.1" tmp "0.0.33" triple-beam "^1.3.0" @@ -11600,6 +12126,14 @@ foreach@^2.0.4: resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -11704,6 +12238,15 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^11.1.0: version "11.1.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" @@ -11782,6 +12325,13 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" +fs-minipass@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" + integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== + dependencies: + minipass "^5.0.0" + fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" @@ -11930,6 +12480,16 @@ gaxios@^4.0.0: is-stream "^2.0.0" node-fetch "^2.6.7" +gaxios@^5.0.0, gaxios@^5.0.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-5.1.3.tgz#f7fa92da0fe197c846441e5ead2573d4979e9013" + integrity sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA== + dependencies: + extend "^3.0.2" + https-proxy-agent "^5.0.0" + is-stream "^2.0.0" + node-fetch "^2.6.9" + gcp-metadata@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-1.0.0.tgz#5212440229fa099fc2f7c2a5cdcb95575e9b2ca6" @@ -11946,6 +12506,14 @@ gcp-metadata@^4.2.0: gaxios "^4.0.0" json-bigint "^1.0.0" +gcp-metadata@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-5.3.0.tgz#6f45eb473d0cb47d15001476b48b663744d25408" + integrity sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w== + dependencies: + gaxios "^5.0.0" + json-bigint "^1.0.0" + gcs-resumable-upload@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/gcs-resumable-upload/-/gcs-resumable-upload-1.1.0.tgz#2b06f5876dcf60f18a309343f79ed951aff01399" @@ -12102,6 +12670,16 @@ get-uri@3: fs-extra "^8.1.0" ftp "^0.3.10" +get-uri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.1.tgz#cff2ba8d456c3513a04b70c45de4dbcca5b1527c" + integrity sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^5.0.1" + debug "^4.3.4" + fs-extra "^8.1.0" + get-value@^1.1.5: version "1.3.1" resolved "https://registry.yarnpkg.com/get-value/-/get-value-1.3.1.tgz#8ac7ef4f20382392b2646548f9b9ad2dc6c89642" @@ -12355,6 +12933,17 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^10.2.2: + version "10.3.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.3.tgz#8360a4ffdd6ed90df84aa8d52f21f452e86a123b" + integrity sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -12389,7 +12978,7 @@ glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1: +glob@^8.0.0, glob@^8.0.1: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -12541,7 +13130,7 @@ google-auth-library@^6.1.3: jws "^4.0.0" lru-cache "^6.0.0" -google-auth-library@^7.0.0, google-auth-library@^7.14.0, google-auth-library@^7.14.1: +google-auth-library@^7.0.0, google-auth-library@^7.11.0, google-auth-library@^7.14.0, google-auth-library@^7.14.1: version "7.14.1" resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-7.14.1.tgz#e3483034162f24cc71b95c8a55a210008826213c" integrity sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA== @@ -12556,6 +13145,21 @@ google-auth-library@^7.0.0, google-auth-library@^7.14.0, google-auth-library@^7. jws "^4.0.0" lru-cache "^6.0.0" +google-auth-library@^8.0.1, google-auth-library@^8.0.2: + version "8.9.0" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-8.9.0.tgz#15a271eb2ec35d43b81deb72211bd61b1ef14dd0" + integrity sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg== + dependencies: + arrify "^2.0.0" + base64-js "^1.3.0" + ecdsa-sig-formatter "^1.0.11" + fast-text-encoding "^1.0.0" + gaxios "^5.0.0" + gcp-metadata "^5.3.0" + gtoken "^6.1.0" + jws "^4.0.0" + lru-cache "^6.0.0" + google-gax@2.30.3: version "2.30.3" resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-2.30.3.tgz#5d2c227972d99d6a6cd77963c44d0575974e7b60" @@ -12614,6 +13218,27 @@ google-gax@^2.0.1, google-gax@^2.24.1: protobufjs "6.11.3" retry-request "^4.0.0" +google-gax@^3.5.7, google-gax@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-3.6.1.tgz#02c78fc496f5adf86f2ca9145545f4b6575f6118" + integrity sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w== + dependencies: + "@grpc/grpc-js" "~1.8.0" + "@grpc/proto-loader" "^0.7.0" + "@types/long" "^4.0.0" + "@types/rimraf" "^3.0.2" + abort-controller "^3.0.0" + duplexify "^4.0.0" + fast-text-encoding "^1.0.3" + google-auth-library "^8.0.2" + is-stream-ended "^0.1.4" + node-fetch "^2.6.1" + object-hash "^3.0.0" + proto3-json-serializer "^1.0.0" + protobufjs "7.2.4" + protobufjs-cli "1.1.1" + retry-request "^5.0.0" + google-libphonenumber@^3.2.15, google-libphonenumber@^3.2.27: version "3.2.32" resolved "https://registry.yarnpkg.com/google-libphonenumber/-/google-libphonenumber-3.2.32.tgz#63c48a9c247b64a3bc2eec21bdf3fcfbf2e148c0" @@ -12634,6 +13259,13 @@ google-p12-pem@^3.1.3: dependencies: node-forge "^1.3.1" +google-p12-pem@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-4.0.1.tgz#82841798253c65b7dc2a4e5fe9df141db670172a" + integrity sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ== + dependencies: + node-forge "^1.3.1" + google-proto-files@^0.20.0: version "0.20.0" resolved "https://registry.yarnpkg.com/google-proto-files/-/google-proto-files-0.20.0.tgz#dfcd1635a0c3f00f49ca057462cf369108ff4b5e" @@ -12743,6 +13375,11 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -12817,6 +13454,15 @@ gtoken@^5.0.4: google-p12-pem "^3.1.3" jws "^4.0.0" +gtoken@^6.1.0: + version "6.1.2" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-6.1.2.tgz#aeb7bdb019ff4c3ba3ac100bbe7b6e74dce0e8bc" + integrity sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ== + dependencies: + gaxios "^5.0.1" + google-p12-pem "^4.0.0" + jws "^4.0.0" + handlebars@^4.0.1, handlebars@^4.7.6, handlebars@^4.7.7: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" @@ -13029,6 +13675,11 @@ header-case@^1.0.0: no-case "^2.2.0" upper-case "^1.1.3" +heap-js@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/heap-js/-/heap-js-2.3.0.tgz#8eed2cede31ec312aa696eef1d4df0565841f183" + integrity sha512-E5303mzwQ+4j/n2J0rDvEPBN7GKjhis10oHiYOgjxsmxYgqG++hz9NyLLOXttzH8as/DyiBHYpUrJTZWYaMo8Q== + hexoid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" @@ -13116,7 +13767,7 @@ http-basic@^8.1.1: http-response-object "^3.0.1" parse-cache-control "^1.0.1" -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -13183,6 +13834,14 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" +http-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" + integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + http-response-object@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" @@ -13231,6 +13890,14 @@ https-proxy-agent@^2.2.1: agent-base "^4.3.0" debug "^3.1.0" +https-proxy-agent@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz#0277e28f13a07d45c663633841e20a40aaafe0ab" + integrity sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -13480,6 +14147,27 @@ inquirer@^7.0.5: strip-ansi "^6.0.0" through "^2.3.6" +inquirer@^8.2.0: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^6.0.1" + inquirer@^8.2.4: version "8.2.5" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" @@ -13525,6 +14213,11 @@ install-artifact-from-github@^1.3.1: resolved "https://registry.yarnpkg.com/install-artifact-from-github/-/install-artifact-from-github-1.3.2.tgz#1a16d9508e40330523a3017ae0d4713ccc64de82" integrity sha512-yCFcLvqk0yQdxx0uJz4t9Z3adDMLAYrcGYv546uRXCSvxE+GqNYhhz/KmrGcUKGI/gVLR9n/e/zM9jX/+ASMJQ== +install-artifact-from-github@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/install-artifact-from-github/-/install-artifact-from-github-1.3.3.tgz#57d89bacfa0f47d7307fe41b6247cda9f9a8079c" + integrity sha512-x79SL0d8WOi1ZjXSTUqqs0GPQZ92YArJAN9O46wgU9wdH2U9ecyyhB9YGDbPe2OLV4ptmt6AZYRQZ2GydQZosQ== + internal-slot@^1.0.4, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" @@ -13576,7 +14269,7 @@ ip-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== -ip@^1.1.5: +ip@^1.1.5, ip@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== @@ -14358,6 +15051,15 @@ jStat@^1.5.2: resolved "https://registry.yarnpkg.com/jStat/-/jStat-1.8.6.tgz#ab4d465b21f583d37a72ab2f97a300492da7575d" integrity sha512-Oh/ePZVSoFigme69pHTQudcGh64cpNH9Lz3hBZcRJWLrDqpw7JfuYU9F3dj9py3tBYmHz7og7ZT8hXTNbYq9Rw== +jackspeak@^2.0.3: + version "2.2.2" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.2.tgz#707c62733924b8dc2a0a629dc6248577788b5385" + integrity sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jake@^10.8.5: version "10.8.5" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" @@ -14778,6 +15480,11 @@ jose@^2.0.6: dependencies: "@panva/asn1.js" "^1.0.0" +jose@^4.10.4: + version "4.14.4" + resolved "https://registry.yarnpkg.com/jose/-/jose-4.14.4.tgz#59e09204e2670c3164ee24cbfe7115c6f8bff9ca" + integrity sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g== + js-sdsl@^4.1.4: version "4.4.0" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" @@ -14826,6 +15533,13 @@ js-yaml@4.1.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +js2xmlparser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" + integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA== + dependencies: + xmlcreate "^2.0.4" + jsbi@^3.1.1: version "3.2.5" resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.2.5.tgz#b37bb90e0e5c2814c1c2a1bcd8c729888a2e37d6" @@ -14836,6 +15550,27 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +jsdoc@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-4.0.2.tgz#a1273beba964cf433ddf7a70c23fd02c3c60296e" + integrity sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg== + dependencies: + "@babel/parser" "^7.20.15" + "@jsdoc/salty" "^0.2.1" + "@types/markdown-it" "^12.2.3" + bluebird "^3.7.2" + catharsis "^0.9.0" + escape-string-regexp "^2.0.0" + js2xmlparser "^4.0.2" + klaw "^3.0.0" + markdown-it "^12.3.2" + markdown-it-anchor "^8.4.1" + marked "^4.0.10" + mkdirp "^1.0.4" + requizzle "^0.2.3" + strip-json-comments "^3.1.0" + underscore "~1.13.2" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -14896,6 +15631,11 @@ json-ptr@^2.2.0: dependencies: tslib "^2.2.0" +json-ptr@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/json-ptr/-/json-ptr-3.1.1.tgz#184c3d48db659fa9bbc1519f7db6f390ddffb659" + integrity sha512-SiSJQ805W1sDUCD1+/t1/1BIrveq2Fe9HJqENxZmMCILmrPI7WhS/pePpIOx85v6/H2z1Vy7AI08GV2TzfXocg== + json-rpc-engine@^5.3.0: version "5.4.0" resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" @@ -15052,6 +15792,16 @@ jsonwebtoken@^8.5.1: ms "^2.1.1" semver "^5.6.0" +jsonwebtoken@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz#81d8c901c112c24e497a55daf6b2be1225b40145" + integrity sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg== + dependencies: + jws "^3.2.2" + lodash "^4.17.21" + ms "^2.1.1" + semver "^7.3.8" + jsprim@^1.2.2: version "1.4.2" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" @@ -15102,6 +15852,18 @@ jwks-rsa@^2.0.2: limiter "^1.1.5" lru-memoizer "^2.1.4" +jwks-rsa@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jwks-rsa/-/jwks-rsa-3.0.1.tgz#ba79ddca7ee7520f7bb26b942ef1aee91df8d7e4" + integrity sha512-UUOZ0CVReK1QVU3rbi9bC7N5/le8ziUj0A2ef1Q0M7OPD2KvjEYizptqIxGIo6fSLYDkqBrazILS18tYuRc8gw== + dependencies: + "@types/express" "^4.17.14" + "@types/jsonwebtoken" "^9.0.0" + debug "^4.3.4" + jose "^4.10.4" + limiter "^1.1.5" + lru-memoizer "^2.1.4" + jws@3.x.x, jws@^3.1.5, jws@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" @@ -15235,6 +15997,13 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +klaw@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" + integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== + dependencies: + graceful-fs "^4.1.9" + kleur@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" @@ -15611,6 +16380,18 @@ libnpmpublish@^6.0.4: semver "^7.3.7" ssri "^9.0.0" +libsodium-wrappers@^0.7.10: + version "0.7.11" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.11.tgz#53bd20606dffcc54ea2122133c7da38218f575f7" + integrity sha512-SrcLtXj7BM19vUKtQuyQKiQCRJPgbpauzl3s0rSwD+60wtHqSUuqcoawlMDheCJga85nKOQwxNYQxf/CKAvs6Q== + dependencies: + libsodium "^0.7.11" + +libsodium@^0.7.11: + version "0.7.11" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.11.tgz#cd10aae7bcc34a300cc6ad0ac88fcca674cfbc2e" + integrity sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A== + limiter@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" @@ -15626,6 +16407,13 @@ lines-and-columns@~2.0.3: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== +linkify-it@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" + integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== + dependencies: + uc.micro "^1.0.1" + listenercount@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" @@ -16037,6 +16825,11 @@ lru-cache@^7.14.1, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== +"lru-cache@^9.1.1 || ^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" + integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== + lru-cache@~4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" @@ -16119,6 +16912,27 @@ make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6: socks-proxy-agent "^7.0.0" ssri "^9.0.0" +make-fetch-happen@^11.0.3: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + make-fetch-happen@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" @@ -16177,6 +16991,22 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +markdown-it-anchor@^8.4.1: + version "8.6.7" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" + integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA== + +markdown-it@^12.3.2: + version "12.3.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" + integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== + dependencies: + argparse "^2.0.1" + entities "~2.1.0" + linkify-it "^3.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" + markdown-table@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" @@ -16194,6 +17024,18 @@ marked-terminal@^3.3.0: node-emoji "^1.4.1" supports-hyperlinks "^1.0.1" +marked-terminal@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-5.2.0.tgz#c5370ec2bae24fb2b34e147b731c94fa933559d3" + integrity sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA== + dependencies: + ansi-escapes "^6.2.0" + cardinal "^2.1.1" + chalk "^5.2.0" + cli-table3 "^0.6.3" + node-emoji "^1.11.0" + supports-hyperlinks "^2.3.0" + marked@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" @@ -16204,6 +17046,11 @@ marked@^1.1.1: resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.9.tgz#53786f8b05d4c01a2a5a76b7d1ec9943d29d72dc" integrity sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw== +marked@^4.0.10, marked@^4.0.14: + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== + math-random@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" @@ -16237,6 +17084,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -16454,7 +17306,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.0.8, mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.0.8, mime-types@^2.1.12, mime-types@^2.1.16, mime-types@^2.1.35, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -16563,6 +17415,20 @@ minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" +minimatch@^6.1.6: + version "6.2.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42" + integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -16611,6 +17477,17 @@ minipass-fetch@^2.0.3: optionalDependencies: encoding "^0.1.13" +minipass-fetch@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" + integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== + dependencies: + minipass "^5.0.0" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-flush@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" @@ -16660,6 +17537,16 @@ minipass@^4.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.2.tgz#58a82b7d81c7010da5bd4b2c0c85ac4b4ec5131e" + integrity sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA== + minizlib@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" @@ -17287,7 +18174,7 @@ node-addon-api@^4.2.0, node-addon-api@^4.3.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== -node-emoji@^1.4.1: +node-emoji@^1.11.0, node-emoji@^1.4.1: version "1.11.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== @@ -17404,6 +18291,23 @@ node-gyp@^9.0.0, node-gyp@^9.3.0: tar "^6.1.2" which "^2.0.2" +node-gyp@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" + integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^11.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-hid@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-2.1.1.tgz#f83c8aa0bb4e6758b5f7383542477da93f67359d" @@ -18014,6 +18918,13 @@ openapi3-ts@^2.0.1: dependencies: yaml "^1.10.2" +openapi3-ts@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/openapi3-ts/-/openapi3-ts-3.2.0.tgz#7e30d33c480e938e67e809ab16f419bc9beae3f8" + integrity sha512-/ykNWRV5Qs0Nwq7Pc0nJ78fgILvOT/60OxEmB3v7yQ8a8Bwcm43D4diaYazG/KBn6czA+52XYy931WFLMCUeSg== + dependencies: + yaml "^2.2.1" + opencollective-postinstall@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" @@ -18277,6 +19188,20 @@ pac-proxy-agent@^5.0.0: raw-body "^2.2.0" socks-proxy-agent "5" +pac-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.0.tgz#db42120c64292685dafaf2bd921e223c56bfb13b" + integrity sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.0.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + pac-resolver "^7.0.0" + socks-proxy-agent "^8.0.1" + pac-resolver@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-5.0.1.tgz#c91efa3a9af9f669104fa2f51102839d01cde8e7" @@ -18286,6 +19211,15 @@ pac-resolver@^5.0.0: ip "^1.1.5" netmask "^2.0.2" +pac-resolver@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.0.tgz#79376f1ca26baf245b96b34c339d79bff25e900c" + integrity sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg== + dependencies: + degenerator "^5.0.0" + ip "^1.1.8" + netmask "^2.0.2" + package-json@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" @@ -18563,6 +19497,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -18810,7 +19752,7 @@ popper.js@1.14.3: resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095" integrity sha512-3lmujhsHXzb83+sI0PzfrE3O1XHZG8m8MXNMTupvA6LrM1/nnsiqYaacYc/RIente9VqnTDPztGEM8uvPAMGyg== -portfinder@^1.0.23: +portfinder@^1.0.23, portfinder@^1.0.32: version "1.0.32" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== @@ -19209,6 +20151,11 @@ promise-breaker@^5.0.0: resolved "https://registry.yarnpkg.com/promise-breaker/-/promise-breaker-5.0.0.tgz#58e8541f1619554057da95a211794d7834d30c1d" integrity sha512-mgsWQuG4kJ1dtO6e/QlNDLFtMkMzzecsC69aI5hlLEjGHFNpHrvGhFi4LiK5jg2SMQj74/diH+wZliL9LpGsyA== +promise-breaker@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/promise-breaker/-/promise-breaker-6.0.0.tgz#107d2b70f161236abdb4ac5a736c7eb8df489d0f" + integrity sha512-BthzO9yTPswGf7etOBiHCVuugs2N01/Q/94dIPls48z2zCmrnDptUUZzfIb+41xq0MnYZ/BzmOd6ikDR4ibNZA== + promise-call-limit@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.2.tgz#f64b8dd9ef7693c9c7613e7dfe8d6d24de3031ea" @@ -19311,6 +20258,29 @@ proto3-json-serializer@^0.1.8: dependencies: protobufjs "^6.11.2" +proto3-json-serializer@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz#1b5703152b6ce811c5cdcc6468032caf53521331" + integrity sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw== + dependencies: + protobufjs "^7.0.0" + +protobufjs-cli@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz#f531201b1c8c7772066aa822bf9a08318b24a704" + integrity sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA== + dependencies: + chalk "^4.0.0" + escodegen "^1.13.0" + espree "^9.0.0" + estraverse "^5.1.0" + glob "^8.0.0" + jsdoc "^4.0.0" + minimist "^1.2.0" + semver "^7.1.2" + tmp "^0.2.1" + uglify-js "^3.7.7" + protobufjs@6.11.2: version "6.11.2" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" @@ -19349,6 +20319,24 @@ protobufjs@6.11.3, protobufjs@^6.10.0, protobufjs@^6.11.2, protobufjs@^6.11.3, p "@types/node" ">=13.7.0" long "^4.0.0" +protobufjs@7.2.4, protobufjs@^7.2.2: + version "7.2.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.4.tgz#3fc1ec0cdc89dd91aef9ba6037ba07408485c3ae" + integrity sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + protobufjs@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-5.0.3.tgz#e4dfe9fb67c90b2630d15868249bcc4961467a17" @@ -19404,6 +20392,20 @@ proxy-agent@^5.0.0: proxy-from-env "^1.0.0" socks-proxy-agent "^5.0.0" +proxy-agent@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.3.0.tgz#72f7bb20eb06049db79f7f86c49342c34f9ba08d" + integrity sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og== + dependencies: + agent-base "^7.0.2" + debug "^4.3.4" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + lru-cache "^7.14.1" + pac-proxy-agent "^7.0.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.1" + proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -19697,6 +20699,15 @@ re2@^1.15.8: nan "^2.17.0" node-gyp "^9.3.0" +re2@^1.17.7: + version "1.20.1" + resolved "https://registry.yarnpkg.com/re2/-/re2-1.20.1.tgz#27450f6de6299635f50305a670cc15ac30687f85" + integrity sha512-JbzIoI5adNCqGUK8wHG1dMSyggvPyA4kx2hewt1lma5sP7/iWCfM15XKbCZlX2yvu5k80jSKAOQqJF7KC+2n8Q== + dependencies: + install-artifact-from-github "^1.3.3" + nan "^2.17.0" + node-gyp "^9.4.0" + react-is@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" @@ -19993,7 +21004,14 @@ registry-auth-token@^4.0.0: dependencies: rc "1.2.8" -registry-url@^5.0.0: +registry-auth-token@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== + dependencies: + "@pnpm/npm-conf" "^2.1.0" + +registry-url@^5.0.0, registry-url@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== @@ -20133,6 +21151,13 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +requizzle@^0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.4.tgz#319eb658b28c370f0c20f968fa8ceab98c13d27c" + integrity sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw== + dependencies: + lodash "^4.17.21" + reselect-tree@^1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/reselect-tree/-/reselect-tree-1.3.7.tgz#c3eca58765d9df96bae0017f6ff3504c304cdea0" @@ -20264,7 +21289,15 @@ retry-request@^4.0.0, retry-request@^4.2.2: debug "^4.1.1" extend "^3.0.2" -retry@0.13.1: +retry-request@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-5.0.2.tgz#143d85f90c755af407fcc46b7166a4ba520e44da" + integrity sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ== + dependencies: + debug "^4.1.1" + extend "^3.0.2" + +retry@0.13.1, retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== @@ -20605,6 +21638,13 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.1.2, semver@^7.5.2: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + semver@~5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -20800,6 +21840,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -20954,7 +21999,16 @@ socks-proxy-agent@^7.0.0: debug "^4.3.3" socks "^2.6.2" -socks@^2.3.3, socks@^2.6.2: +socks-proxy-agent@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz#ffc5859a66dac89b0c4dab90253b96705f3e7120" + integrity sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ== + dependencies: + agent-base "^7.0.1" + debug "^4.3.4" + socks "^2.7.1" + +socks@^2.3.3, socks@^2.6.2, socks@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== @@ -21242,6 +22296,13 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^10.0.0: + version "10.0.4" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" + integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== + dependencies: + minipass "^5.0.0" + ssri@^8.0.0, ssri@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" @@ -21308,6 +22369,11 @@ stoppable@^1.1.0: resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b" integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw== +stream-chain@^2.2.4, stream-chain@^2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/stream-chain/-/stream-chain-2.2.5.tgz#b30967e8f14ee033c5b9a19bbe8a2cba90ba0d09" + integrity sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA== + stream-events@^1.0.1, stream-events@^1.0.4, stream-events@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.5.tgz#bbc898ec4df33a4902d892333d47da9bf1c406d5" @@ -21315,6 +22381,13 @@ stream-events@^1.0.1, stream-events@^1.0.4, stream-events@^1.0.5: dependencies: stubs "^3.0.0" +stream-json@^1.7.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.8.0.tgz#53f486b2e3b4496c506131f8d7260ba42def151c" + integrity sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw== + dependencies: + stream-chain "^2.2.5" + stream-shift@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" @@ -21350,6 +22423,15 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -21367,15 +22449,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -21385,6 +22458,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string.prototype.trim@^1.2.7, string.prototype.trim@~1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" @@ -21431,6 +22513,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -21452,12 +22541,12 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: - ansi-regex "^5.0.1" + ansi-regex "^6.0.1" strip-bom@^2.0.0: version "2.0.0" @@ -21527,11 +22616,16 @@ strip-json-comments@3.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== -strip-json-comments@3.1.1, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + strong-log-transformer@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -21604,6 +22698,32 @@ superstatic@^7.1.0: optionalDependencies: re2 "^1.15.8" +superstatic@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/superstatic/-/superstatic-9.0.3.tgz#eb271841e971d9c3760f6d4b3adca5db00f29f18" + integrity sha512-e/tmW0bsnQ/33ivK6y3CapJT0Ovy4pk/ohNPGhIAGU2oasoNLRQ1cv6enua09NU9w6Y0H/fBu07cjzuiWvLXxw== + dependencies: + basic-auth-connect "^1.0.0" + commander "^10.0.0" + compression "^1.7.0" + connect "^3.7.0" + destroy "^1.0.4" + fast-url-parser "^1.1.3" + glob-slasher "^1.0.1" + is-url "^1.2.2" + join-path "^1.1.1" + lodash "^4.17.19" + mime-types "^2.1.35" + minimatch "^6.1.6" + morgan "^1.8.2" + on-finished "^2.2.0" + on-headers "^1.0.0" + path-to-regexp "^1.8.0" + router "^1.3.1" + update-notifier-cjs "^5.1.6" + optionalDependencies: + re2 "^1.17.7" + supertest@^6.2.3: version "6.3.3" resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.3.3.tgz#42f4da199fee656106fd422c094cf6c9578141db" @@ -21674,7 +22794,7 @@ supports-hyperlinks@^1.0.1: has-flag "^2.0.0" supports-color "^5.0.0" -supports-hyperlinks@^2.1.0: +supports-hyperlinks@^2.1.0, supports-hyperlinks@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== @@ -21868,7 +22988,7 @@ tarn@^3.0.2: resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== -tcp-port-used@^1.0.1: +tcp-port-used@^1.0.1, tcp-port-used@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.2.tgz#9652b7436eb1f4cfae111c79b558a25769f6faea" integrity sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA== @@ -21931,6 +23051,17 @@ teeny-request@^7.1.3: stream-events "^1.0.5" uuid "^8.0.0" +teeny-request@^8.0.0: + version "8.0.3" + resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-8.0.3.tgz#5cb9c471ef5e59f2fca8280dc3c5909595e6ca24" + integrity sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww== + dependencies: + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + node-fetch "^2.6.1" + stream-events "^1.0.5" + uuid "^9.0.0" + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -21963,6 +23094,11 @@ testrpc@0.0.1: resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== +text-decoding@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-decoding/-/text-decoding-1.0.0.tgz#38a5692d23b5c2b12942d6e245599cb58b1bc52f" + integrity sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA== + text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" @@ -22128,7 +23264,7 @@ tmp@^0.1.0: dependencies: rimraf "^2.6.3" -tmp@~0.2.1: +tmp@^0.2.1, tmp@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== @@ -22340,6 +23476,11 @@ truffle@5.9.0: optionalDependencies: "@truffle/db" "^2.0.24" +ts-deepmerge@^2.0.1: + version "2.0.7" + resolved "https://registry.yarnpkg.com/ts-deepmerge/-/ts-deepmerge-2.0.7.tgz#36786a9a10b5f3a6f5154007cf17bfba7251e0a7" + integrity sha512-3phiGcxPSSR47RBubQxPoZ+pqXsEsozLo4G4AlSrsMKTFg9TA3l+3he5BqpUi9wiuDbaHWXH/amlzQ49uEdXtg== + ts-essentials@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" @@ -22626,6 +23767,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^3.0.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" + integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -22790,7 +23936,12 @@ typical@^2.6.0, typical@^2.6.1: resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" integrity sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg== -uglify-js@^3.1.4: +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + +uglify-js@^3.1.4, uglify-js@^3.7.7: version "3.17.4" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== @@ -22838,7 +23989,7 @@ underscore@1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== -underscore@>1.4.4, "underscore@>= 1.3.1": +underscore@>1.4.4, "underscore@>= 1.3.1", underscore@~1.13.2: version "1.13.6" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== @@ -22867,6 +24018,13 @@ unique-filename@^2.0.0: dependencies: unique-slug "^3.0.0" +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + unique-slug@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" @@ -22881,6 +24039,13 @@ unique-slug@^3.0.0: dependencies: imurmurhash "^0.1.4" +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -22904,6 +24069,14 @@ universal-analytics@^0.4.16: request "^2.88.2" uuid "^3.0.0" +universal-analytics@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/universal-analytics/-/universal-analytics-0.5.3.tgz#ff2d9b850062cdd4a8f652448047982a183c8e96" + integrity sha512-HXSMyIcf2XTvwZ6ZZQLfxfViRm/yTGoRgDeTbojtq6rezeyKB0sTBcKH2fhddnteAHRcHiKgr/ACpbgjGOC6RQ== + dependencies: + debug "^4.3.1" + uuid "^8.0.0" + universal-user-agent@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" @@ -22971,6 +24144,28 @@ update-browserslist-db@^1.0.10: escalade "^3.1.1" picocolors "^1.0.0" +update-notifier-cjs@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/update-notifier-cjs/-/update-notifier-cjs-5.1.6.tgz#6e3aff745d1551b55bb0a0a5939b7e636d95877d" + integrity sha512-wgxdSBWv3x/YpMzsWz5G4p4ec7JWD0HCl8W6bmNB6E5Gwo+1ym5oN4hiXpLf0mPySVEJEIsYlkshnplkg2OP9A== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + isomorphic-fetch "^3.0.0" + pupa "^2.1.1" + registry-auth-token "^5.0.1" + registry-url "^5.1.0" + semver "^7.3.7" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + update-notifier@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3" @@ -24982,6 +26177,15 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -25007,7 +26211,7 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" -wrap-ansi@^6.2.0: +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== @@ -25016,14 +26220,14 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" @@ -25205,6 +26409,11 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== +xmlcreate@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" + integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== + xmlhttprequest@*, xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" @@ -25280,6 +26489,11 @@ yaml@^1.10.0, yaml@^1.10.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + yargs-parser@13.1.2, yargs-parser@^13.1.1, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" From 49e8044ba4f40794247004a6722bc9169a0012dc Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Mon, 7 Aug 2023 11:17:34 -0400 Subject: [PATCH 04/27] Soloseng/fix-test-quota-bypass (#10471) * enable optional quota bypass during load test. * moved log to better track failed signers * increase the range test sessionID --- .../combiner/src/common/combine.ts | 6 +- .../phone-number-privacy/monitor/src/query.ts | 6 +- .../monitor/src/scripts/run-load-test.ts | 58 +++++++++++++++++-- .../phone-number-privacy/monitor/src/test.ts | 22 +++++-- 4 files changed, 75 insertions(+), 17 deletions(-) diff --git a/packages/phone-number-privacy/combiner/src/common/combine.ts b/packages/phone-number-privacy/combiner/src/common/combine.ts index d2fd2d8754f..66350cfd32b 100644 --- a/packages/phone-number-privacy/combiner/src/common/combine.ts +++ b/packages/phone-number-privacy/combiner/src/common/combine.ts @@ -157,12 +157,12 @@ export abstract class CombineAction implements Action } private addFailureToSession(signer: Signer, errorCode: number | undefined, session: Session) { - session.logger.warn( - `Received failure from ${session.failedSigners.size}/${this.signers.length} signers` - ) // Tracking failed request count via signer url prevents // double counting the same failed request by mistake session.failedSigners.add(signer.url) + session.logger.warn( + `Received failure from ${session.failedSigners.size}/${this.signers.length} signers` + ) if (errorCode) { session.incrementErrorCodeCount(errorCode) } diff --git a/packages/phone-number-privacy/monitor/src/query.ts b/packages/phone-number-privacy/monitor/src/query.ts index b069879b162..6879b12d0c1 100644 --- a/packages/phone-number-privacy/monitor/src/query.ts +++ b/packages/phone-number-privacy/monitor/src/query.ts @@ -29,7 +29,8 @@ const newPrivateKey = async () => { export const queryOdisForSalt = async ( blockchainProvider: string, contextName: OdisContextName, - timeoutMs: number = 10000 + timeoutMs: number = 10000, + bypassQuota: boolean = false ) => { console.log(`contextName: ${contextName}`) // tslint:disable-line:no-console console.log(`blockchain provider: ${blockchainProvider}`) // tslint:disable-line:no-console @@ -52,6 +53,7 @@ export const queryOdisForSalt = async ( console.log(`ODIS salt request timed out after ${timeoutMs} ms`) // tslint:disable-line:no-console }, timeoutMs) try { + const testSessionId = Math.floor(Math.random() * 100000).toString() const res = await OdisUtils.Identifier.getObfuscatedIdentifier( phoneNumber, OdisUtils.Identifier.IdentifierPrefix.PHONE_NUMBER, @@ -61,7 +63,7 @@ export const queryOdisForSalt = async ( undefined, undefined, undefined, - genSessionID(), + bypassQuota ? testSessionId : genSessionID(), undefined, abortController ) diff --git a/packages/phone-number-privacy/monitor/src/scripts/run-load-test.ts b/packages/phone-number-privacy/monitor/src/scripts/run-load-test.ts index cac2eb23634..2f6b0afaa8c 100644 --- a/packages/phone-number-privacy/monitor/src/scripts/run-load-test.ts +++ b/packages/phone-number-privacy/monitor/src/scripts/run-load-test.ts @@ -1,10 +1,18 @@ import { OdisContextName } from '@celo/identity/lib/odis/query' +import { CombinerEndpointPNP } from '@celo/phone-number-privacy-common' import yargs from 'yargs' import { concurrentLoadTest, serialLoadTest } from '../test' /* tslint:disable:no-console */ -const runLoadTest = (contextName: string, numWorker: number, isSerial: boolean) => { +const runLoadTest = ( + contextName: string, + numWorker: number, + isSerial: boolean, + pnpQuotaEndpoint: boolean, + timeoutMs: number, + bypassQuota: boolean +) => { let blockchainProvider: string switch (contextName) { case 'alfajoresstaging': @@ -25,12 +33,26 @@ const runLoadTest = (contextName: string, numWorker: number, isSerial: boolean) process.exit(1) } if (isSerial) { - serialLoadTest(numWorker, blockchainProvider!, contextName as OdisContextName) // tslint:disable-line:no-floating-promises + serialLoadTest( + numWorker, + blockchainProvider!, + contextName as OdisContextName, + pnpQuotaEndpoint ? CombinerEndpointPNP.PNP_QUOTA : CombinerEndpointPNP.PNP_SIGN, + timeoutMs, + bypassQuota + ) } else { - concurrentLoadTest(numWorker, blockchainProvider!, contextName as OdisContextName) // tslint:disable-line:no-floating-promises + concurrentLoadTest( + numWorker, + blockchainProvider!, + contextName as OdisContextName, + pnpQuotaEndpoint ? CombinerEndpointPNP.PNP_QUOTA : CombinerEndpointPNP.PNP_SIGN, + timeoutMs, + bypassQuota + ) } } -// tslint:disable-next-line: no-unused-expression + yargs .scriptName('ODIS-load-test') .recommendCommands() @@ -52,8 +74,32 @@ yargs }) .option('isSerial', { type: 'boolean', - description: 'run test workers in series.', + description: 'Run test workers in series.', + default: false, + }) + .option('timeoutMs', { + type: 'number', + description: 'Timout in ms.', + default: 10000, + }) + .option('bypassQuota', { + type: 'boolean', + description: 'Bypass Signer quota check.', + default: false, + }) + .option('pnpQuotaEndpoint', { + type: 'boolean', + description: + 'Use this flag to load test PNP_QUOTA endpoint instead of PNP_SIGN endpoint.', default: false, }), - (args) => runLoadTest(args.contextName!, args.numWorkers!, args.isSerial) + (args) => + runLoadTest( + args.contextName!, + args.numWorkers!, + args.isSerial, + args.pnpQuotaEndpoint, + args.timeoutMs, + args.bypassQuota + ) ).argv diff --git a/packages/phone-number-privacy/monitor/src/test.ts b/packages/phone-number-privacy/monitor/src/test.ts index 33cdebd8662..7c0a3aca51c 100644 --- a/packages/phone-number-privacy/monitor/src/test.ts +++ b/packages/phone-number-privacy/monitor/src/test.ts @@ -13,14 +13,16 @@ export async function testPNPSignQuery( blockchainProvider: string, contextName: OdisContextName, endpoint: CombinerEndpointPNP.PNP_SIGN, - timeoutMs?: number + timeoutMs?: number, + bypassQuota?: boolean ) { logger.info(`Performing test PNP query for ${endpoint}`) try { const odisResponse: IdentifierHashDetails = await queryOdisForSalt( blockchainProvider, contextName, - timeoutMs + timeoutMs, + bypassQuota ) logger.info({ odisResponse }, 'ODIS salt request successful. System is healthy.') } catch (err) { @@ -82,13 +84,14 @@ export async function serialLoadTest( endpoint: | CombinerEndpointPNP.PNP_QUOTA | CombinerEndpointPNP.PNP_SIGN = CombinerEndpointPNP.PNP_SIGN, - timeoutMs?: number + timeoutMs?: number, + bypassQuota?: boolean ) { for (let i = 0; i < n; i++) { try { switch (endpoint) { case CombinerEndpointPNP.PNP_SIGN: - await testPNPSignQuery(blockchainProvider, contextName, endpoint, timeoutMs) + await testPNPSignQuery(blockchainProvider, contextName, endpoint, timeoutMs, bypassQuota) break case CombinerEndpointPNP.PNP_QUOTA: await testPNPQuotaQuery(blockchainProvider, contextName, timeoutMs) @@ -104,7 +107,8 @@ export async function concurrentLoadTest( endpoint: | CombinerEndpointPNP.PNP_QUOTA | CombinerEndpointPNP.PNP_SIGN = CombinerEndpointPNP.PNP_SIGN, - timeoutMs?: number + timeoutMs?: number, + bypassQuota?: boolean ) { while (true) { const reqs = [] @@ -117,7 +121,13 @@ export async function concurrentLoadTest( try { switch (endpoint) { case CombinerEndpointPNP.PNP_SIGN: - await testPNPSignQuery(blockchainProvider, contextName, endpoint, timeoutMs) + await testPNPSignQuery( + blockchainProvider, + contextName, + endpoint, + timeoutMs, + bypassQuota + ) break case CombinerEndpointPNP.PNP_QUOTA: await testPNPQuotaQuery(blockchainProvider, contextName, timeoutMs) From 120ea8e0f7108534551c07cd9d78cdf9d0d9d548 Mon Sep 17 00:00:00 2001 From: Alec Schaefer Date: Fri, 11 Aug 2023 12:12:02 -0400 Subject: [PATCH 05/27] odis crypto op metering (#10461) add metering --- .env.rc1 | 6 +++++- .../src/common/crypto-clients/crypto-client.ts | 13 ++++++++++++- .../signer/src/pnp/endpoints/sign/action.ts | 14 +++++++++----- .../sdk/contractkit/src/wrappers/Governance.ts | 7 +++++-- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/.env.rc1 b/.env.rc1 index a618d05bb1b..a393d6377f3 100644 --- a/.env.rc1 +++ b/.env.rc1 @@ -81,6 +81,8 @@ AZURE_ORACLE_WESTUS_CELOUSD_ORACLE_ADDRESS_AZURE_KEY_VAULTS=0x0aee051be85ba9c7c1 AZURE_ORACLE_WESTUS_CELOEUR_ORACLE_ADDRESS_AZURE_KEY_VAULTS=0xb8bDBfdd591a5be5980983A7ba1710a5F46f42B5:mainnet-eur-oracle-wus2:mainnet-oracles-westus2,0x929Ad7f2b781CE830014E824CA2eF0b7b8de87C2:mainnet-eur-oracle-wus3:mainnet-oracles-westus2,0xCCC0B54edD8dAe3c15b5C002dd5d348495d4f7fe:mainnet-eur-oracle-wus4:mainnet-oracles-westus2 AZURE_ORACLE_WESTUS_CELOBRL_ORACLE_ADDRESS_AZURE_KEY_VAULTS=0x57d8a7bf9e7f4113c49e077b140fd8e1d7f78a76:mainnet-brl-oracle-wus0:mainnet-oracles-westus2,0x1299dd007cd5120262e546dca893e30d1cff8a10:mainnet-brl-oracle-wus1:mainnet-oracles-westus2,0x116951e440aee97a328614f9937710c9bb2f0839:mainnet-brl-oracle-wus4:mainnet-oracles-westus2 AZURE_ORACLE_WESTUS_USDCUSD_ORACLE_ADDRESS_AZURE_KEY_VAULTS=0x2986c21824c9b804d170270a316ceb07149f79c5:mainnet-usdcusd-wus0,0x09e2e47bb5df7b3464407746970a65c7b02883b3:mainnet-usdcusd-wus1,0xd5e7454932f6e853af849f70044570b62ca2596e:mainnet-usdcusd-wus2,0xfe3276b7142dee2cda34b1d14852eb32f436483d:mainnet-usdcusd-wus3 +AZURE_ORACLE_WESTUS_USDCEUR_ORACLE_ADDRESS_AZURE_KEY_VAULTS=0xeccd1e9439094d025ac7d08d16b0bfe0da3bea53:mainnet-usdceur-wus0,0x9b242d2bd848fc92060ca7546033c3af352583d2:mainnet-usdceur-wus1,0x905ab001a9199d45c3f5c7b055b65ace5fc7d70a:mainnet-usdceur-wus2,0xdf5dd31d8f78520185d6a9fb0498c4bbddfe0708:mainnet-usdceur-wus3 +AZURE_ORACLE_WESTUS_USDCBRL_ORACLE_ADDRESS_AZURE_KEY_VAULTS=0x8dba01f832c7b0bb5f0bad4efe181cc07f8b322e:mainnet-usdcbrl-wus0,0xffb417d009d09bd1140244e70babbaa52d69ec84:mainnet-usdcbrl-wus1,0x5f755b8350a2e6b8b042cb3e052580e4c5b0ac35:mainnet-usdcbrl-wus2,0x8e1349b48ee82ef5437c912662e6640f3590c6f9:mainnet-usdcbrl-wus3 AZURE_ORACLE_WESTUS_FULL_NODES_COUNT=5 AZURE_ORACLE_WESTUS_FULL_NODES_ROLLING_UPDATE_PARTITION=0 AZURE_ORACLE_WESTUS_FULL_NODES_DISK_SIZE=100 @@ -101,6 +103,8 @@ AZURE_ORACLE_WESTEUROPE_CELOUSD_ORACLE_ADDRESS_AZURE_KEY_VAULTS=0xfe9925e6ae9c4c AZURE_ORACLE_WESTEUROPE_CELOEUR_ORACLE_ADDRESS_AZURE_KEY_VAULTS=0x87C45738DAd8Dc3D2b1cCe779E0766329cc408C6:mainnet-eur-oracle-weu0:mainnet-oracles-westeurope,0xeF1E143C554EFC43B0537Af00Ac27C828dE6cF8D:mainnet-eur-oracle-weu1:mainnet-oracles-westeurope,0xF4B4AA107F30206EA019DE145A9b778a220f9fc0:mainnet-eur-oracle-weu2:mainnet-oracles-westeurope,0x24c303e6395DD19806F739619960A311764e3F40:mainnet-eur-oracle-weu3:mainnet-oracles-westeurope,0xDA413875FB45E5905950Bc08a908ebD246Ee6581:mainnet-eur-oracle-weu5:mainnet-oracles-westeurope AZURE_ORACLE_WESTEUROPE_CELOBRL_ORACLE_ADDRESS_AZURE_KEY_VAULTS=0x3b91bbb873f3b979bd6671dc018d5fc1848882dd:mainnet-brl-oracle-weu0:mainnet-oracles-westeurope,0xc3994b2af0e82490e432d49e9f2246cdfd84da8f:mainnet-brl-oracle-weu1:mainnet-oracles-westeurope,0x9b376b33c33325332df8c6ca951a9896889a6d1e:mainnet-brl-oracle-weu2:mainnet-oracles-westeurope,0x554ba7f4d200c7b233b93b7f2223bc1ea7c467fd:mainnet-brl-oracle-weu3:mainnet-oracles-westeurope,0x535cea1834d6b52e4e9724642fdd7008f569ba5c:mainnet-brl-oracle-weu4:mainnet-oracles-westeurope AZURE_ORACLE_WESTEUROPE_USDCUSD_ORACLE_ADDRESS_AZURE_KEY_VAULTS=0x477185291403ca2ed5f56d59ed0d568a16222013:mainnet-usdcusd-weu0,0x9a0a52d483c62df76d54f41ab3283cc7cb41ba91:mainnet-usdcusd-weu1,0x2ddb86898a2c2c884fc5cc3ca344898b0170a00d:mainnet-usdcusd-weu2,0x79be0a692e3a4bcd22b96c3e93a108b485becbb2:mainnet-usdcusd-weu3 +AZURE_ORACLE_WESTEUROPE_USDCEUR_ORACLE_ADDRESS_AZURE_KEY_VAULTS=0x0781f530100e619936f5b427263441cb0414f885:mainnet-usdceur-weu0,0x55de75fd0c2b37987757172fef7ba2ea935d284d:mainnet-usdceur-weu1,0xdc0c15fa73b13b2e74cd3eced23d8826569904c5:mainnet-usdceur-weu2,0x9048872f739cebbe72825763a1b72064c4df8f1f:mainnet-usdceur-weu3 +AZURE_ORACLE_WESTEUROPE_USDCBRL_ORACLE_ADDRESS_AZURE_KEY_VAULTS=0x42b813b9ff8ce8f4837accea26bedda20d7c4982:mainnet-usdcbrl-weu0,0x09208127500963ee1c3af88bfbb3ef0cd34d6eb0:mainnet-usdcbrl-weu1,0xa8f5be092a8452eab98ed1c220d642114bb2731e:mainnet-usdcbrl-weu2,0xfd265c994a5a9c2847fe03a5e878648963f53a37:mainnet-usdcbrl-weu3 AZURE_ORACLE_WESTEUROPE_FULL_NODES_COUNT=5 AZURE_ORACLE_WESTEUROPE_FULL_NODES_ROLLING_UPDATE_PARTITION=0 AZURE_ORACLE_WESTEUROPE_FULL_NODES_DISK_SIZE=100 @@ -534,4 +538,4 @@ AZURE_KOMENCI_SEA_KOMENCI_NETWORK=rc1 WALLET_CONNECT_IMAGE_REPOSITORY='us.gcr.io/celo-testnet/walletconnect' WALLET_CONNECT_IMAGE_TAG='1472bcaad57e3746498f7a661c42ff5cf9acaf5a' WALLET_CONNECT_REDIS_CLUSTER_ENABLED=false -WALLET_CONNECT_REDIS_CLUSTER_USEPASSWORD=false +WALLET_CONNECT_REDIS_CLUSTER_USEPASSWORD=false \ No newline at end of file diff --git a/packages/phone-number-privacy/combiner/src/common/crypto-clients/crypto-client.ts b/packages/phone-number-privacy/combiner/src/common/crypto-clients/crypto-client.ts index 2fd8580420a..c57783a3051 100644 --- a/packages/phone-number-privacy/combiner/src/common/crypto-clients/crypto-client.ts +++ b/packages/phone-number-privacy/combiner/src/common/crypto-clients/crypto-client.ts @@ -1,5 +1,6 @@ import { ErrorMessage, KeyVersionInfo } from '@celo/phone-number-privacy-common' import Logger from 'bunyan' +import { performance } from 'perf_hooks' export interface ServicePartialSignature { url: string @@ -38,7 +39,17 @@ export abstract class CryptoClient { `${ErrorMessage.NOT_ENOUGH_PARTIAL_SIGNATURES} ${this.allSignaturesLength}/${threshold}` ) } - return this._combineBlindedSignatureShares(blindedMessage, logger) + + const start = `Start combineBlindedSignatureShares` + const end = `End combineBlindedSignatureShares` + performance.mark(start) + + const combinedSignature = this._combineBlindedSignatureShares(blindedMessage, logger) + + performance.mark(end) + performance.measure('combineBlindedSignatureShares', start, end) + + return combinedSignature } /* diff --git a/packages/phone-number-privacy/signer/src/pnp/endpoints/sign/action.ts b/packages/phone-number-privacy/signer/src/pnp/endpoints/sign/action.ts index 19982f13306..4f777a3d9bb 100644 --- a/packages/phone-number-privacy/signer/src/pnp/endpoints/sign/action.ts +++ b/packages/phone-number-privacy/signer/src/pnp/endpoints/sign/action.ts @@ -11,7 +11,7 @@ import { computeBlindedSignature } from '../../../common/bls/bls-cryptography-cl import { REQUESTS_TABLE } from '../../../common/database/models/request' import { getRequestExists } from '../../../common/database/wrappers/request' import { DefaultKeyName, Key, KeyProvider } from '../../../common/key-management/key-provider-base' -import { Counters } from '../../../common/metrics' +import { Counters, Histograms, meter } from '../../../common/metrics' import { SignerConfig } from '../../../config' import { PnpQuotaService } from '../../services/quota' import { PnpSession } from '../../session' @@ -113,10 +113,14 @@ export class PnpSignAction implements Action { } try { - const signature = await this.sign( - session.request.body.blindedQueryPhoneNumber, - key, - session + const signature = await meter( + this.sign.bind(this), + [session.request.body.blindedQueryPhoneNumber, key, session], + (err: any) => { + throw err + }, + Histograms.getBlindedSigInstrumentation, + ['sign'] ) this.io.sendSuccess(200, session.response, key, signature, quotaStatus, session.errors) return diff --git a/packages/sdk/contractkit/src/wrappers/Governance.ts b/packages/sdk/contractkit/src/wrappers/Governance.ts index 895c926f53a..a52b20f3240 100644 --- a/packages/sdk/contractkit/src/wrappers/Governance.ts +++ b/packages/sdk/contractkit/src/wrappers/Governance.ts @@ -211,7 +211,10 @@ export class GovernanceWrapper extends BaseWrapperForGoverning { * @param proposal Proposal to determine the constitution for running. */ async getConstitution(proposal: Proposal): Promise { - let constitution = new BigNumber(0) + // Default value that is harcoded on Governance contract + // it's 0.5 in Fixidity + // https://github.com/celo-org/celo-monorepo/blob/3fffa158d67ffd6366e81ba7243eadede1974b1b/packages/protocol/contracts/governance/Governance.sol#L39 + let constitution = fromFixed(new BigNumber('500000000000000000000000')) for (const tx of proposal) { constitution = BigNumber.max(await this.getTransactionConstitution(tx), constitution) } @@ -236,7 +239,7 @@ export class GovernanceWrapper extends BaseWrapperForGoverning { // in the total of yes votes required async getSupportWithConstitutionThreshold(proposalID: BigNumber.Value, constitution: BigNumber) { const support = await this.getSupport(proposalID) - support.required = support.required.times(constitution) + support.required = support.required.times(constitution).integerValue() return support } From b1e14ce5b7fb1c008b55681f0a59aed5195a264b Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Fri, 11 Aug 2023 12:13:40 -0400 Subject: [PATCH 06/27] Soloseng/loadtest-with-DEK (#10482) * add option to use DEK in loadtest * Added monitoring counter for AuthenticationMethod * randomized phonenumber to avoid replay attempts --- .../phone-number-privacy/monitor/src/query.ts | 32 +++++++++---- .../monitor/src/resources.ts | 48 +++++++++++++++++++ .../monitor/src/scripts/run-load-test.ts | 17 +++++-- .../phone-number-privacy/monitor/src/test.ts | 24 +++++++--- .../signer/src/pnp/endpoints/sign/io.ts | 7 +++ 5 files changed, 109 insertions(+), 19 deletions(-) create mode 100644 packages/phone-number-privacy/monitor/src/resources.ts diff --git a/packages/phone-number-privacy/monitor/src/query.ts b/packages/phone-number-privacy/monitor/src/query.ts index 6879b12d0c1..823deb391b0 100644 --- a/packages/phone-number-privacy/monitor/src/query.ts +++ b/packages/phone-number-privacy/monitor/src/query.ts @@ -18,8 +18,9 @@ import { genSessionID } from '@celo/phone-number-privacy-common/lib/utils/logger import { normalizeAddressWith0x, privateKeyToAddress } from '@celo/utils/lib/address' import { defined } from '@celo/utils/lib/sign-typed-data-utils' import { LocalWallet } from '@celo/wallet-local' +import { ACCOUNT_ADDRESS, dekAuthSigner, generateRandomPhoneNumber, PRIVATE_KEY } from './resources' -const phoneNumber = fetchEnv('PHONE_NUMBER') +let phoneNumber = fetchEnv('PHONE_NUMBER') const newPrivateKey = async () => { const mnemonic = await generateMnemonic(MnemonicStrength.s256_24words) @@ -30,21 +31,34 @@ export const queryOdisForSalt = async ( blockchainProvider: string, contextName: OdisContextName, timeoutMs: number = 10000, - bypassQuota: boolean = false + bypassQuota: boolean = false, + useDEK: boolean = false ) => { + let authSigner: AuthSigner + let accountAddress: string console.log(`contextName: ${contextName}`) // tslint:disable-line:no-console console.log(`blockchain provider: ${blockchainProvider}`) // tslint:disable-line:no-console + console.log(`using DEK: ${useDEK}`) // tslint:disable-line:no-console const serviceContext = getServiceContext(contextName, OdisAPI.PNP) const contractKit = newKit(blockchainProvider, new LocalWallet()) - const privateKey = await newPrivateKey() - const accountAddress = normalizeAddressWith0x(privateKeyToAddress(privateKey)) - contractKit.connection.addAccount(privateKey) - contractKit.defaultAccount = accountAddress - const authSigner: AuthSigner = { - authenticationMethod: OdisUtils.Query.AuthenticationMethod.WALLET_KEY, - contractKit, + + if (useDEK) { + accountAddress = ACCOUNT_ADDRESS + contractKit.connection.addAccount(PRIVATE_KEY) + contractKit.defaultAccount = accountAddress + authSigner = dekAuthSigner(0) + phoneNumber = generateRandomPhoneNumber() + } else { + const privateKey = await newPrivateKey() + accountAddress = normalizeAddressWith0x(privateKeyToAddress(privateKey)) + contractKit.connection.addAccount(privateKey) + contractKit.defaultAccount = accountAddress + authSigner = { + authenticationMethod: OdisUtils.Query.AuthenticationMethod.WALLET_KEY, + contractKit, + } } const abortController = new AbortController() diff --git a/packages/phone-number-privacy/monitor/src/resources.ts b/packages/phone-number-privacy/monitor/src/resources.ts new file mode 100644 index 00000000000..b7ca1ef06db --- /dev/null +++ b/packages/phone-number-privacy/monitor/src/resources.ts @@ -0,0 +1,48 @@ +import { EncryptionKeySigner } from '@celo/identity/lib/odis/query' +import { AuthenticationMethod } from '@celo/phone-number-privacy-common' +import { + ensureLeading0x, + normalizeAddressWith0x, + privateKeyToAddress, +} from '@celo/utils/lib/address' + +export const PRIVATE_KEY = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef' +export const ACCOUNT_ADDRESS = normalizeAddressWith0x(privateKeyToAddress(PRIVATE_KEY)) // 0x1be31a94361a391bbafb2a4ccd704f57dc04d4bb + +interface DEK { + privateKey: string + publicKey: string + address: string +} + +export const deks: DEK[] = [ + { + privateKey: 'bf8a2b73baf8402f8fe906ad3f42b560bf14b39f7df7797ece9e293d6f162188', + publicKey: '034846bc781cacdafc66f3a77aa9fc3c56a9dadcd683c72be3c446fee8da041070', + address: '0x7b33dF2607b85e3211738a49A6Ad6E8Ed4d13F6E', + }, + { + privateKey: '0975b0c565abc75b6638a749ea3008cb52676af3eabe4b80e19c516d82330364', + publicKey: '03b1ac8c445f0796978018c087b97e8213b32c39e6a8642ae63dce71da33a19f65', + address: '0x34332049B07Fab9a2e843A7C8991469d93cF6Ae6', + }, +] + +// The following code can be used to generate more test DEKs +// const generateDEKs = (n: number): Promise => Promise.all([...Array(n).keys()].map( +// async () => await deriveDek(await generateMnemonic()) +// )) + +export const dekAuthSigner = (index: number): EncryptionKeySigner => { + return { + authenticationMethod: AuthenticationMethod.ENCRYPTION_KEY, + rawKey: ensureLeading0x(deks[index].privateKey), + } +} + +export function generateRandomPhoneNumber() { + const min = 1000000000 // Smallest 10-digit number + const max = 9999999999 // Largest 10-digit number + const randomNumber = Math.floor(Math.random() * (max - min + 1)) + min + return '+1' + randomNumber.toString() +} diff --git a/packages/phone-number-privacy/monitor/src/scripts/run-load-test.ts b/packages/phone-number-privacy/monitor/src/scripts/run-load-test.ts index 2f6b0afaa8c..c6aa374094d 100644 --- a/packages/phone-number-privacy/monitor/src/scripts/run-load-test.ts +++ b/packages/phone-number-privacy/monitor/src/scripts/run-load-test.ts @@ -11,7 +11,8 @@ const runLoadTest = ( isSerial: boolean, pnpQuotaEndpoint: boolean, timeoutMs: number, - bypassQuota: boolean + bypassQuota: boolean, + useDEK: boolean ) => { let blockchainProvider: string switch (contextName) { @@ -39,7 +40,8 @@ const runLoadTest = ( contextName as OdisContextName, pnpQuotaEndpoint ? CombinerEndpointPNP.PNP_QUOTA : CombinerEndpointPNP.PNP_SIGN, timeoutMs, - bypassQuota + bypassQuota, + useDEK ) } else { concurrentLoadTest( @@ -48,7 +50,8 @@ const runLoadTest = ( contextName as OdisContextName, pnpQuotaEndpoint ? CombinerEndpointPNP.PNP_QUOTA : CombinerEndpointPNP.PNP_SIGN, timeoutMs, - bypassQuota + bypassQuota, + useDEK ) } } @@ -87,6 +90,11 @@ yargs description: 'Bypass Signer quota check.', default: false, }) + .option('useDEK', { + type: 'boolean', + description: 'Use Data Encryption Key (DEK) to authenticate.', + default: false, + }) .option('pnpQuotaEndpoint', { type: 'boolean', description: @@ -100,6 +108,7 @@ yargs args.isSerial, args.pnpQuotaEndpoint, args.timeoutMs, - args.bypassQuota + args.bypassQuota, + args.useDEK ) ).argv diff --git a/packages/phone-number-privacy/monitor/src/test.ts b/packages/phone-number-privacy/monitor/src/test.ts index 7c0a3aca51c..af9fa42cebc 100644 --- a/packages/phone-number-privacy/monitor/src/test.ts +++ b/packages/phone-number-privacy/monitor/src/test.ts @@ -14,7 +14,8 @@ export async function testPNPSignQuery( contextName: OdisContextName, endpoint: CombinerEndpointPNP.PNP_SIGN, timeoutMs?: number, - bypassQuota?: boolean + bypassQuota?: boolean, + useDEK?: boolean ) { logger.info(`Performing test PNP query for ${endpoint}`) try { @@ -22,7 +23,8 @@ export async function testPNPSignQuery( blockchainProvider, contextName, timeoutMs, - bypassQuota + bypassQuota, + useDEK ) logger.info({ odisResponse }, 'ODIS salt request successful. System is healthy.') } catch (err) { @@ -85,13 +87,21 @@ export async function serialLoadTest( | CombinerEndpointPNP.PNP_QUOTA | CombinerEndpointPNP.PNP_SIGN = CombinerEndpointPNP.PNP_SIGN, timeoutMs?: number, - bypassQuota?: boolean + bypassQuota?: boolean, + useDEK?: boolean ) { for (let i = 0; i < n; i++) { try { switch (endpoint) { case CombinerEndpointPNP.PNP_SIGN: - await testPNPSignQuery(blockchainProvider, contextName, endpoint, timeoutMs, bypassQuota) + await testPNPSignQuery( + blockchainProvider, + contextName, + endpoint, + timeoutMs, + bypassQuota, + useDEK + ) break case CombinerEndpointPNP.PNP_QUOTA: await testPNPQuotaQuery(blockchainProvider, contextName, timeoutMs) @@ -108,7 +118,8 @@ export async function concurrentLoadTest( | CombinerEndpointPNP.PNP_QUOTA | CombinerEndpointPNP.PNP_SIGN = CombinerEndpointPNP.PNP_SIGN, timeoutMs?: number, - bypassQuota?: boolean + bypassQuota?: boolean, + useDEK?: boolean ) { while (true) { const reqs = [] @@ -126,7 +137,8 @@ export async function concurrentLoadTest( contextName, endpoint, timeoutMs, - bypassQuota + bypassQuota, + useDEK ) break case CombinerEndpointPNP.PNP_QUOTA: diff --git a/packages/phone-number-privacy/signer/src/pnp/endpoints/sign/io.ts b/packages/phone-number-privacy/signer/src/pnp/endpoints/sign/io.ts index dfc4dfd3345..b5a10fb4252 100644 --- a/packages/phone-number-privacy/signer/src/pnp/endpoints/sign/io.ts +++ b/packages/phone-number-privacy/signer/src/pnp/endpoints/sign/io.ts @@ -1,6 +1,7 @@ import { ContractKit } from '@celo/contractkit' import { authenticateUser, + AuthenticationMethod, ErrorType, hasValidAccountParam, hasValidBlindedPhoneNumberParam, @@ -75,6 +76,12 @@ export class PnpSignIO extends IO { warnings: ErrorType[], logger: Logger ): Promise { + const authMethod = request.body.authenticationMethod + + if (authMethod && authMethod === AuthenticationMethod.WALLET_KEY) { + Counters.requestsWithWalletAddress.inc() + } + return authenticateUser( request, this.kit, From 5b1c2f02ff6a2fe95c11f67ca9011c8086638260 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Sat, 12 Aug 2023 19:27:41 -0400 Subject: [PATCH 07/27] first draft --- .../combiner/package.json | 7 +- .../combiner/script/run-migrations.ts | 25 ++ .../combiner/src/config.ts | 21 ++ .../combiner/src/database/database.ts | 16 ++ .../migrations/create-accounts-table.ts | 18 ++ .../combiner/src/database/models/account.ts | 22 ++ .../combiner/src/database/wrappers/account.ts | 58 +++++ .../combiner/src/pnp/endpoints/sign/io.ts | 2 +- .../combiner/src/utils/authentication.ts | 231 ++++++++++++++++++ 9 files changed, 398 insertions(+), 2 deletions(-) create mode 100644 packages/phone-number-privacy/combiner/script/run-migrations.ts create mode 100644 packages/phone-number-privacy/combiner/src/database/database.ts create mode 100644 packages/phone-number-privacy/combiner/src/database/migrations/create-accounts-table.ts create mode 100644 packages/phone-number-privacy/combiner/src/database/models/account.ts create mode 100644 packages/phone-number-privacy/combiner/src/database/wrappers/account.ts create mode 100644 packages/phone-number-privacy/combiner/src/utils/authentication.ts diff --git a/packages/phone-number-privacy/combiner/package.json b/packages/phone-number-privacy/combiner/package.json index b248db4a91c..cc4c3c00273 100644 --- a/packages/phone-number-privacy/combiner/package.json +++ b/packages/phone-number-privacy/combiner/package.json @@ -25,7 +25,12 @@ "test:integration": "jest --runInBand test/integration", "test:e2e": "jest test/end-to-end --verbose", "test:e2e:staging": "CONTEXT_NAME=staging yarn test:e2e", - "test:e2e:alfajores": "CONTEXT_NAME=alfajores yarn test:e2e" + "test:e2e:alfajores": "CONTEXT_NAME=alfajores yarn test:e2e", + "db:migrate": "NODE_ENV=dev FIREBASE_CONFIG=./firebase.json ts-node ./scripts/run-migrations.ts", + "db:migrate:staging": "GCLOUD_PROJECT=celo-phone-number-privacy-stg yarn db:migrate", + "db:migrate:alfajores": "GCLOUD_PROJECT=celo-phone-number-privacy yarn db:migrate", + "db:migrate:mainnet": "GCLOUD_PROJECT=celo-pgpnp-mainnet yarn db:migrate", + "db:migrate:make": "knex --migrations-directory ./migrations migrate:make -x ts" }, "dependencies": { "@celo/contractkit": "^4.1.1-dev", diff --git a/packages/phone-number-privacy/combiner/script/run-migrations.ts b/packages/phone-number-privacy/combiner/script/run-migrations.ts new file mode 100644 index 00000000000..90c34969525 --- /dev/null +++ b/packages/phone-number-privacy/combiner/script/run-migrations.ts @@ -0,0 +1,25 @@ +// tslint:disable: no-console +// TODO de-dupe with signer script +import knex from 'knex' +import config from '../src/config' + +async function start() { + console.info('Running migrations') + await knex({ + client: 'pg', + connection: config.db, + }).migrate.latest({ + directory: './migrations', + extension: 'ts', + }) +} + +start() + .then(() => { + console.info('Migrations complete') + process.exit(0) + }) + .catch((e) => { + console.error('Migration failed', e) + process.exit(1) + }) diff --git a/packages/phone-number-privacy/combiner/src/config.ts b/packages/phone-number-privacy/combiner/src/config.ts index 3d9fcb9e917..30aa28f0d18 100644 --- a/packages/phone-number-privacy/combiner/src/config.ts +++ b/packages/phone-number-privacy/combiner/src/config.ts @@ -47,6 +47,13 @@ export interface CombinerConfig { blockchain: BlockchainConfig phoneNumberPrivacy: OdisConfig domains: OdisConfig + db: { + user: string + password: string + database: string + host: string + ssl: boolean + } } let config: CombinerConfig @@ -144,6 +151,13 @@ if (DEV_MODE) { fullNodeRetryCount: RETRY_COUNT, fullNodeRetryDelayMs: RETRY_DELAY_IN_MS, }, + db: { + user: 'postgress', + password: 'fakePass', + database: 'phoneNumber+privacy', + host: 'fakeHost', + ssl: false, + }, } } else { const functionConfig = functions.config() @@ -193,6 +207,13 @@ if (DEV_MODE) { functionConfig.pnp.full_node_retry_delay_ms ?? RETRY_DELAY_IN_MS ), }, + db: { + user: functionConfig.db.username, + password: functionConfig.db.pass, + database: functionConfig.db.name, + host: `/cloudsql/${functionConfig.db.host}`, + ssl: toBool(functionConfig.db.ssl, true), + }, } } export default config diff --git a/packages/phone-number-privacy/combiner/src/database/database.ts b/packages/phone-number-privacy/combiner/src/database/database.ts new file mode 100644 index 00000000000..09189512344 --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/database/database.ts @@ -0,0 +1,16 @@ +import knex from 'knex' +import config, { DEV_MODE } from '../config' + +const db = knex({ + client: 'pg', + connection: config.db, + debug: DEV_MODE, +}) + +export function getDatabase() { + return db +} + +export function getTransaction() { + return db.transaction() +} diff --git a/packages/phone-number-privacy/combiner/src/database/migrations/create-accounts-table.ts b/packages/phone-number-privacy/combiner/src/database/migrations/create-accounts-table.ts new file mode 100644 index 00000000000..d55e5d37809 --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/database/migrations/create-accounts-table.ts @@ -0,0 +1,18 @@ +import { Knex } from 'knex' +import { ACCOUNTS_COLUMNS, ACCOUNTS_TABLE } from '../models/account' + +export async function up(knex: Knex): Promise { + if (!(await knex.schema.hasTable(ACCOUNTS_TABLE))) { + return knex.schema.createTable(ACCOUNTS_TABLE, (t) => { + t.string(ACCOUNTS_COLUMNS.address).notNullable().primary() + t.dateTime(ACCOUNTS_COLUMNS.createdAt).notNullable() + t.string(ACCOUNTS_COLUMNS.dek) + t.dateTime(ACCOUNTS_COLUMNS.onChainDataLastUpdated) + }) + } + return null +} + +export async function down(knex: Knex): Promise { + return knex.schema.dropTable(ACCOUNTS_TABLE) +} diff --git a/packages/phone-number-privacy/combiner/src/database/models/account.ts b/packages/phone-number-privacy/combiner/src/database/models/account.ts new file mode 100644 index 00000000000..319c9c04f76 --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/database/models/account.ts @@ -0,0 +1,22 @@ +export const ACCOUNTS_TABLE = 'accounts' + +export enum ACCOUNTS_COLUMNS { + address = 'address', + createdAt = 'created_at', + dek = 'dek', + onChainDataLastUpdated = 'onChainDataLastUpdated', +} + +export class Account { + [ACCOUNTS_COLUMNS.address]: string | undefined; + [ACCOUNTS_COLUMNS.createdAt]: Date = new Date(); + [ACCOUNTS_COLUMNS.dek]: string | undefined; + [ACCOUNTS_COLUMNS.onChainDataLastUpdated]: Date | null = null + + constructor(address: string, dek?: string) { + this.address = address + if (dek) { + this.dek = dek + } + } +} diff --git a/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts b/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts new file mode 100644 index 00000000000..a5d44ed7207 --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts @@ -0,0 +1,58 @@ +import { DB_TIMEOUT, ErrorMessage } from '@celo/phone-number-privacy-common' +import Logger from 'bunyan' +import { getDatabase, getTransaction } from '../database' +import { ACCOUNTS_COLUMNS, ACCOUNTS_TABLE, Account } from '../models/account' + +function accounts() { + return getDatabase()(ACCOUNTS_TABLE) +} + +/* + * Get DEK signer record from DB. + */ +export async function getDekSignerRecord( + account: string, + logger: Logger +): Promise { + try { + const dekSignerRecord = await accounts() + .where(ACCOUNTS_COLUMNS.address, account) + .select(ACCOUNTS_COLUMNS.dek) + .first() + .timeout(DB_TIMEOUT) + return dekSignerRecord ? dekSignerRecord[ACCOUNTS_COLUMNS.dek] : undefined + } catch (err) { + logger.error(ErrorMessage.DATABASE_GET_FAILURE) + logger.error(err) + return undefined + } +} + +export async function updateDekSignerRecord(account: string, newDek: string, logger: Logger) { + const trx = await getTransaction() + const accountTxBase = () => + accounts().transacting(trx).timeout(DB_TIMEOUT).where(ACCOUNTS_COLUMNS.address, account) + + accountTxBase() + .then(async (res) => { + if (res.length) { + // if account exist + await accountTxBase() + .having(ACCOUNTS_COLUMNS.dek, 'is', null) + .update({ [ACCOUNTS_COLUMNS.dek]: newDek }) + await accountTxBase() + .having(ACCOUNTS_COLUMNS.onChainDataLastUpdated, 'is', null) + .update({ [ACCOUNTS_COLUMNS.onChainDataLastUpdated]: new Date() }) + } else { + // account does not exits + const newAccount = new Account(account, newDek) + await accounts().transacting(trx).timeout(DB_TIMEOUT).insert(newAccount) + } + trx.commit() + }) + .catch((err) => { + logger.error(ErrorMessage.DATABASE_UPDATE_FAILURE) + logger.error(err) + trx.rollback() + }) +} diff --git a/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/io.ts b/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/io.ts index 0b0050b9c72..71a74f3fd79 100644 --- a/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/io.ts +++ b/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/io.ts @@ -1,6 +1,5 @@ import { ContractKit } from '@celo/contractkit' import { - authenticateUser, CombinerEndpoint, ErrorType, getSignerEndpoint, @@ -26,6 +25,7 @@ import { CryptoSession } from '../../../common/crypto-session' import { IO } from '../../../common/io' import { Session } from '../../../common/session' import { getCombinerVersion, OdisConfig } from '../../../config' +import { authenticateUser } from '../../../utils/authentication' export class PnpSignIO extends IO { readonly endpoint: CombinerEndpoint = CombinerEndpoint.PNP_SIGN diff --git a/packages/phone-number-privacy/combiner/src/utils/authentication.ts b/packages/phone-number-privacy/combiner/src/utils/authentication.ts new file mode 100644 index 00000000000..2c09661176c --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/utils/authentication.ts @@ -0,0 +1,231 @@ +import { hexToBuffer, retryAsyncWithBackOffAndTimeout } from '@celo/base' +import { ContractKit } from '@celo/contractkit' +import { AccountsWrapper } from '@celo/contractkit/lib/wrappers/Accounts' +import { AttestationsWrapper } from '@celo/contractkit/lib/wrappers/Attestations' +import { + AuthenticationMethod, + ErrorMessage, + ErrorType, + FULL_NODE_TIMEOUT_IN_MS, + PhoneNumberPrivacyRequest, + RETRY_COUNT, + RETRY_DELAY_IN_MS, + fetchEnv, + rootLogger, +} from '@celo/phone-number-privacy-common' +import { trimLeading0x } from '@celo/utils/lib/address' +import { verifySignature } from '@celo/utils/lib/signatureUtils' +import Logger from 'bunyan' +import crypto from 'crypto' +import { Request } from 'express' +import { getDekSignerRecord, updateDekSignerRecord } from '../database/wrappers/account' + +/* + * Confirms that user is who they say they are and throws error on failure to confirm. + * Authorization header should contain the EC signed body + */ +export async function authenticateUser( + request: Request<{}, {}, R>, + contractKit: ContractKit, + logger: Logger, + shouldFailOpen: boolean = false, + warnings: ErrorType[] = [], + timeoutMs: number = FULL_NODE_TIMEOUT_IN_MS, + retryCount: number = RETRY_COUNT, + retryDelay: number = RETRY_DELAY_IN_MS +): Promise { + logger.debug('Authenticating user') + + // https://tools.ietf.org/html/rfc7235#section-4.2 + const messageSignature = request.get('Authorization') + const message = JSON.stringify(request.body) + const signer = request.body.account + const authMethod = request.body.authenticationMethod + + if (!messageSignature || !signer) { + return false + } + + if (authMethod && authMethod === AuthenticationMethod.ENCRYPTION_KEY) { + let registeredEncryptionKey: string | undefined + + // XXX (soloseng): lookup in db first + // await db.transaction(async (trx) => { + // XXX: should this use a db trx? I think not, since we are not writing to db, + // XXX: so no chance of overwrite conflict. + + registeredEncryptionKey = await getDekSignerRecord(signer, logger) + + if (registeredEncryptionKey) { + logger.info({ dek: registeredEncryptionKey, account: signer }, 'Found DEK for account in db') + if (verifyDEKSignature(message, messageSignature, registeredEncryptionKey, logger)) { + return true + } + logger.warn({ account: signer }, 'Failed to verify account DEK signature found in db.') + } + + // XXX: if does not exist or failed to verify, fetch onchain. + + try { + registeredEncryptionKey = await getDataEncryptionKey( + signer, + contractKit, + logger, + timeoutMs, + retryCount, + retryDelay + ) + } catch (err) { + // getDataEncryptionKey should only throw if there is a full-node connection issue. + // That is, it does not throw if the DEK is undefined or invalid + const failureStatus = shouldFailOpen ? ErrorMessage.FAILING_OPEN : ErrorMessage.FAILING_CLOSED + logger.error({ + err, + warning: ErrorMessage.FAILURE_TO_GET_DEK, + failureStatus, + }) + warnings.push(ErrorMessage.FAILURE_TO_GET_DEK, failureStatus) + return shouldFailOpen + } + if (!registeredEncryptionKey) { + logger.warn({ account: signer }, 'Account does not have registered encryption key') + return false + } else { + logger.info({ dek: registeredEncryptionKey, account: signer }, 'Found DEK for account') + if (verifyDEKSignature(message, messageSignature, registeredEncryptionKey, logger)) { + // XXX: once found, update db with DEK. + + await updateDekSignerRecord(signer, registeredEncryptionKey!, logger) + + return true + } + } + } + + // Fallback to previous signing pattern + logger.info( + { account: signer, message, messageSignature }, + 'Message was not authenticated with DEK, attempting to authenticate using wallet key' + ) + // TODO This uses signature utils, why doesn't DEK authentication? + // (https://github.com/celo-org/celo-monorepo/issues/9803) + return verifySignature(message, messageSignature, signer) +} + +export function getMessageDigest(message: string) { + // NOTE: Elliptic will truncate the raw msg to 64 bytes before signing, + // so make sure to always pass the hex encoded msgDigest instead. + return crypto.createHash('sha256').update(JSON.stringify(message)).digest('hex') +} + +// Used primarily for signing requests with a DEK, counterpart of verifyDEKSignature +// For general signing, use SignatureUtils in @celo/utils +export function signWithRawKey(msg: string, rawKey: string) { + // NOTE: elliptic is disabled elsewhere in this library to prevent + // accidental signing of truncated messages. + // tslint:disable-next-line:import-blacklist + const EC = require('elliptic').ec + const ec = new EC('secp256k1') + + // Sign + const key = ec.keyFromPrivate(hexToBuffer(rawKey)) + return JSON.stringify(key.sign(getMessageDigest(msg)).toDER()) +} + +export function verifyDEKSignature( + message: string, + messageSignature: string, + registeredEncryptionKey: string, + logger?: Logger +) { + logger = logger ?? rootLogger(fetchEnv('SERVICE_NAME')) + try { + // NOTE: elliptic is disabled elsewhere in this library to prevent + // accidental signing of truncated messages. + // tslint:disable-next-line:import-blacklist + const EC = require('elliptic').ec + const ec = new EC('secp256k1') + const key = ec.keyFromPublic(trimLeading0x(registeredEncryptionKey), 'hex') + const parsedSig = JSON.parse(messageSignature) + // TODO why do we use a different signing method instead of SignatureUtils? + // (https://github.com/celo-org/celo-monorepo/issues/9803) + if (key.verify(getMessageDigest(message), parsedSig)) { + return true + } + return false + } catch (err) { + logger.error('Failed to verify signature with DEK') + logger.error({ err, dek: registeredEncryptionKey }) + return false + } +} + +export async function getDataEncryptionKey( + address: string, + contractKit: ContractKit, + logger: Logger, + fullNodeTimeoutMs: number, + fullNodeRetryCount: number, + fullNodeRetryDelayMs: number +): Promise { + try { + const res = await retryAsyncWithBackOffAndTimeout( + async () => { + const accountWrapper: AccountsWrapper = await contractKit.contracts.getAccounts() + return accountWrapper.getDataEncryptionKey(address) + }, + fullNodeRetryCount, + [], + fullNodeRetryDelayMs, + 1.5, + fullNodeTimeoutMs + ) + return res + } catch (error) { + logger.error('Failed to retrieve DEK: ' + error) + logger.error(ErrorMessage.FULL_NODE_ERROR) + throw error + } +} + +export async function isVerified( + account: string, + hashedPhoneNumber: string, + contractKit: ContractKit, + logger: Logger +): Promise { + try { + const res = await retryAsyncWithBackOffAndTimeout( + async () => { + const attestationsWrapper: AttestationsWrapper = + await contractKit.contracts.getAttestations() + const { + isVerified: _isVerified, + completed, + numAttestationsRemaining, + total, + } = await attestationsWrapper.getVerifiedStatus(hashedPhoneNumber, account) + + logger.debug({ + account, + isVerified: _isVerified, + completedAttestations: completed, + remainingAttestations: numAttestationsRemaining, + totalAttestationsRequested: total, + }) + return _isVerified + }, + RETRY_COUNT, + [], + RETRY_DELAY_IN_MS, + 1.5, + FULL_NODE_TIMEOUT_IN_MS + ) + return res + } catch (error) { + logger.error('Failed to get verification status: ' + error) + logger.error(ErrorMessage.FULL_NODE_ERROR) + logger.warn('Assuming user is verified') + return true + } +} From 02eb07cc700c08ad16e3f670892ed00bb1807225 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Sat, 12 Aug 2023 19:31:46 -0400 Subject: [PATCH 08/27] comments --- packages/phone-number-privacy/combiner/src/common/combine.ts | 1 + .../phone-number-privacy/combiner/src/utils/authentication.ts | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/phone-number-privacy/combiner/src/common/combine.ts b/packages/phone-number-privacy/combiner/src/common/combine.ts index 66350cfd32b..26c6f1b91ea 100644 --- a/packages/phone-number-privacy/combiner/src/common/combine.ts +++ b/packages/phone-number-privacy/combiner/src/common/combine.ts @@ -25,6 +25,7 @@ export abstract class CombineAction implements Action abstract combine(session: Session): void async perform(session: Session) { + // TODO (soloseng): check if request already exist in db await this.distribute(session) this.combine(session) } diff --git a/packages/phone-number-privacy/combiner/src/utils/authentication.ts b/packages/phone-number-privacy/combiner/src/utils/authentication.ts index 2c09661176c..cde1d107051 100644 --- a/packages/phone-number-privacy/combiner/src/utils/authentication.ts +++ b/packages/phone-number-privacy/combiner/src/utils/authentication.ts @@ -50,9 +50,6 @@ export async function authenticateUser( let registeredEncryptionKey: string | undefined // XXX (soloseng): lookup in db first - // await db.transaction(async (trx) => { - // XXX: should this use a db trx? I think not, since we are not writing to db, - // XXX: so no chance of overwrite conflict. registeredEncryptionKey = await getDekSignerRecord(signer, logger) From 7f9479618fc6b8d881d101ffd206886fc87addd8 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Tue, 15 Aug 2023 15:54:38 -0400 Subject: [PATCH 09/27] removed is null req when updating --- .../combiner/src/database/wrappers/account.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts b/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts index a5d44ed7207..d1c6fd94da8 100644 --- a/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts +++ b/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts @@ -37,12 +37,8 @@ export async function updateDekSignerRecord(account: string, newDek: string, log .then(async (res) => { if (res.length) { // if account exist - await accountTxBase() - .having(ACCOUNTS_COLUMNS.dek, 'is', null) - .update({ [ACCOUNTS_COLUMNS.dek]: newDek }) - await accountTxBase() - .having(ACCOUNTS_COLUMNS.onChainDataLastUpdated, 'is', null) - .update({ [ACCOUNTS_COLUMNS.onChainDataLastUpdated]: new Date() }) + await accountTxBase().update({ [ACCOUNTS_COLUMNS.dek]: newDek }) + await accountTxBase().update({ [ACCOUNTS_COLUMNS.onChainDataLastUpdated]: new Date() }) } else { // account does not exits const newAccount = new Account(account, newDek) From 1269498f7d51a13f7cbf7cb6823999a0aeed3766 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Tue, 15 Aug 2023 19:21:33 -0400 Subject: [PATCH 10/27] running locally --- .../{script => scripts}/run-migrations.ts | 2 +- .../combiner/src/config.ts | 4 +- ...> 20230815120000_create_accounts_table.ts} | 0 yarn.lock | 1173 ++++++++++++++++- 4 files changed, 1158 insertions(+), 21 deletions(-) rename packages/phone-number-privacy/combiner/{script => scripts}/run-migrations.ts (91%) rename packages/phone-number-privacy/combiner/src/database/migrations/{create-accounts-table.ts => 20230815120000_create_accounts_table.ts} (100%) diff --git a/packages/phone-number-privacy/combiner/script/run-migrations.ts b/packages/phone-number-privacy/combiner/scripts/run-migrations.ts similarity index 91% rename from packages/phone-number-privacy/combiner/script/run-migrations.ts rename to packages/phone-number-privacy/combiner/scripts/run-migrations.ts index 90c34969525..9c88f04639c 100644 --- a/packages/phone-number-privacy/combiner/script/run-migrations.ts +++ b/packages/phone-number-privacy/combiner/scripts/run-migrations.ts @@ -9,7 +9,7 @@ async function start() { client: 'pg', connection: config.db, }).migrate.latest({ - directory: './migrations', + directory: './src/database/migrations', extension: 'ts', }) } diff --git a/packages/phone-number-privacy/combiner/src/config.ts b/packages/phone-number-privacy/combiner/src/config.ts index 30aa28f0d18..7db806c1537 100644 --- a/packages/phone-number-privacy/combiner/src/config.ts +++ b/packages/phone-number-privacy/combiner/src/config.ts @@ -152,10 +152,10 @@ if (DEV_MODE) { fullNodeRetryDelayMs: RETRY_DELAY_IN_MS, }, db: { - user: 'postgress', + user: 'postgres', password: 'fakePass', database: 'phoneNumber+privacy', - host: 'fakeHost', + host: '127.0.0.1', ssl: false, }, } diff --git a/packages/phone-number-privacy/combiner/src/database/migrations/create-accounts-table.ts b/packages/phone-number-privacy/combiner/src/database/migrations/20230815120000_create_accounts_table.ts similarity index 100% rename from packages/phone-number-privacy/combiner/src/database/migrations/create-accounts-table.ts rename to packages/phone-number-privacy/combiner/src/database/migrations/20230815120000_create_accounts_table.ts diff --git a/yarn.lock b/yarn.lock index ff6d71927ab..4f01582688a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2230,6 +2230,14 @@ dependencies: semver "^5.5.0" +"@grpc/grpc-js@^1.7.1": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.0.tgz#bdb599e339adabb16aa7243e70c311f75a572867" + integrity sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg== + dependencies: + "@grpc/proto-loader" "^0.7.0" + "@types/node" ">=12.12.47" + "@grpc/grpc-js@~1.6.0": version "1.6.12" resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.6.12.tgz#20f710d8a8c5c396b2ae9530ba6c06b984614fdf" @@ -2287,6 +2295,77 @@ protobufjs "^7.0.0" yargs "^16.2.0" +"@hapi/b64@5.x.x": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-5.0.0.tgz#b8210cbd72f4774985e78569b77e97498d24277d" + integrity sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/boom@9.x.x", "@hapi/boom@^9.0.0": + version "9.1.4" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6" + integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/bourne@2.x.x": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.1.0.tgz#66aff77094dc3080bd5df44ec63881f2676eb020" + integrity sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q== + +"@hapi/cryptiles@5.x.x": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-5.1.0.tgz#655de4cbbc052c947f696148c83b187fc2be8f43" + integrity sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA== + dependencies: + "@hapi/boom" "9.x.x" + +"@hapi/hoek@9.x.x", "@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/iron@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-6.0.0.tgz#ca3f9136cda655bdd6028de0045da0de3d14436f" + integrity sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw== + dependencies: + "@hapi/b64" "5.x.x" + "@hapi/boom" "9.x.x" + "@hapi/bourne" "2.x.x" + "@hapi/cryptiles" "5.x.x" + "@hapi/hoek" "9.x.x" + +"@hapi/podium@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-4.1.3.tgz#91e20838fc2b5437f511d664aabebbb393578a26" + integrity sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g== + dependencies: + "@hapi/hoek" "9.x.x" + "@hapi/teamwork" "5.x.x" + "@hapi/validate" "1.x.x" + +"@hapi/teamwork@5.x.x": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-5.1.1.tgz#4d2ba3cac19118a36c44bf49a3a47674de52e4e4" + integrity sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@hapi/validate@1.x.x": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@hapi/validate/-/validate-1.1.3.tgz#f750a07283929e09b51aa16be34affb44e1931ad" + integrity sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@hutson/parse-repository-url@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" @@ -4080,11 +4159,659 @@ dependencies: "@octokit/openapi-types" "^17.0.0" -"@opentelemetry/api@^1.0.0": +"@opentelemetry/api-logs@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.41.2.tgz#600c9b3d79018e7421d2ff7189f41b6d2c987d6a" + integrity sha512-JEV2RAqijAFdWeT6HddYymfnkiRu2ASxoTBr4WsnGJhOjWZkEy6vp+Sx9ozr1NaIODOa2HUyckExIqQjn6qywQ== + dependencies: + "@opentelemetry/api" "^1.0.0" + +"@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f" integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== +"@opentelemetry/auto-instrumentations-node@^0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.38.0.tgz#9841ebc87d696aff10cf1ad03b19f5b233868bd2" + integrity sha512-lQXiUAGs79+SkaTycwmtamzH0bsXpGOccl2jNFDztZrCvMn2xD4TJkKm5PuoFp9fnRgtY/vEJck+ViefJnSCdA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.0" + "@opentelemetry/instrumentation-amqplib" "^0.33.0" + "@opentelemetry/instrumentation-aws-lambda" "^0.36.0" + "@opentelemetry/instrumentation-aws-sdk" "^0.35.0" + "@opentelemetry/instrumentation-bunyan" "^0.32.0" + "@opentelemetry/instrumentation-cassandra-driver" "^0.33.0" + "@opentelemetry/instrumentation-connect" "^0.32.0" + "@opentelemetry/instrumentation-dataloader" "^0.5.0" + "@opentelemetry/instrumentation-dns" "^0.32.0" + "@opentelemetry/instrumentation-express" "^0.33.0" + "@opentelemetry/instrumentation-fastify" "^0.32.0" + "@opentelemetry/instrumentation-fs" "^0.8.0" + "@opentelemetry/instrumentation-generic-pool" "^0.32.0" + "@opentelemetry/instrumentation-graphql" "^0.35.0" + "@opentelemetry/instrumentation-grpc" "^0.41.0" + "@opentelemetry/instrumentation-hapi" "^0.32.0" + "@opentelemetry/instrumentation-http" "^0.41.0" + "@opentelemetry/instrumentation-ioredis" "^0.35.0" + "@opentelemetry/instrumentation-knex" "^0.32.0" + "@opentelemetry/instrumentation-koa" "^0.35.0" + "@opentelemetry/instrumentation-lru-memoizer" "^0.33.0" + "@opentelemetry/instrumentation-memcached" "^0.32.0" + "@opentelemetry/instrumentation-mongodb" "^0.36.0" + "@opentelemetry/instrumentation-mongoose" "^0.33.0" + "@opentelemetry/instrumentation-mysql" "^0.34.0" + "@opentelemetry/instrumentation-mysql2" "^0.34.0" + "@opentelemetry/instrumentation-nestjs-core" "^0.33.0" + "@opentelemetry/instrumentation-net" "^0.32.0" + "@opentelemetry/instrumentation-pg" "^0.36.0" + "@opentelemetry/instrumentation-pino" "^0.34.0" + "@opentelemetry/instrumentation-redis" "^0.35.0" + "@opentelemetry/instrumentation-redis-4" "^0.35.0" + "@opentelemetry/instrumentation-restify" "^0.33.0" + "@opentelemetry/instrumentation-router" "^0.33.0" + "@opentelemetry/instrumentation-socket.io" "^0.34.0" + "@opentelemetry/instrumentation-tedious" "^0.6.0" + "@opentelemetry/instrumentation-winston" "^0.32.0" + "@opentelemetry/resource-detector-alibaba-cloud" "^0.28.0" + "@opentelemetry/resource-detector-aws" "^1.3.0" + "@opentelemetry/resource-detector-container" "^0.3.0" + "@opentelemetry/resource-detector-gcp" "^0.29.0" + "@opentelemetry/resources" "^1.12.0" + "@opentelemetry/sdk-node" "^0.41.0" + tslib "^2.3.1" + +"@opentelemetry/context-async-hooks@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.15.2.tgz#116bd5fef231137198d5bf551e8c0521fbdfe928" + integrity sha512-VAMHG67srGFQDG/N2ns5AyUT9vUcoKpZ/NpJ5fDQIPfJd7t3ju+aHwvDsMcrYBWuCh03U3Ky6o16+872CZchBg== + +"@opentelemetry/core@1.15.2", "@opentelemetry/core@^1.0.0", "@opentelemetry/core@^1.1.0", "@opentelemetry/core@^1.8.0": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.15.2.tgz#5b170bf223a2333884bbc2d29d95812cdbda7c9f" + integrity sha512-+gBv15ta96WqkHZaPpcDHiaz0utiiHZVfm2YOYSqFGrUaJpPkMoSuLBB58YFQGi6Rsb9EHos84X6X5+9JspmLw== + dependencies: + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/exporter-jaeger@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.15.2.tgz#1ac7020d798ec4e47417bd90e00763e0947e17de" + integrity sha512-BwYd5836GYvuiQcF4l5X0ca09jGJr/F37MMGyz94VH0b1dp0uYBwRJw2CQh56RlVZEdpKv29JyDRVZ/4UrRgLQ== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + jaeger-client "^3.15.0" + +"@opentelemetry/exporter-trace-otlp-grpc@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.41.2.tgz#445f850f4675e0afc3e326b2663576fa0b5fbee4" + integrity sha512-tRM/mq7PFj7mXCws5ICMVp/rmgU93JvZdoLE0uLj4tugNz231u2ZgeRYXulBjdeHM88ZQSsWTJMu2mvr/3JV1A== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-grpc-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + +"@opentelemetry/exporter-trace-otlp-http@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.41.2.tgz#4818088c652f2077a55c9c1364d8320e994dc00f" + integrity sha512-Y0fGLipjZXLMelWtlS1/MDtrPxf25oM408KukRdkN31a1MEFo4h/ZkNwS7ZfmqHGUa+4rWRt2bi6JBiqy7Ytgw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + +"@opentelemetry/exporter-trace-otlp-proto@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.41.2.tgz#8e8f823d5264e34dc7c8b400f9d03871c7bfcbc5" + integrity sha512-IGZga9IIckqYE3IpRE9FO9G5umabObIrChlXUHYpMJtDgx797dsb3qXCvLeuAwB+HoB8NsEZstlzmLnoa6/HmA== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + "@opentelemetry/otlp-proto-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + +"@opentelemetry/exporter-zipkin@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.15.2.tgz#4f72482909fd7a197fb614fc1f285b15ca008a39" + integrity sha512-j9dPe8tyx4KqIqJAfZ/LCYfkF9+ggsT0V1+bVg9ZKTBNcLf5dTsTMdcxUxc/9s599kgcn6UERnti/tozbzwa6Q== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/instrumentation-amqplib@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.33.1.tgz#a459073939691a4a1dabf96ef7c1af168fb27e35" + integrity sha512-Eg797WDHVDcRr6+5tihh7ab+ZjS5yCOoW4PkUYCcJHVT31AGfi+PlkLgHknW+uT1oKijMC4D1p6jDa/2rzRv/g== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-aws-lambda@^0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.36.0.tgz#bfd3ffac407a1339fc0bdc9afb4bb9e2dfe2ef39" + integrity sha512-GkehkjN4vHTc5HNIBlKddrm+EVch2cNEfbLcV7tXLu0Hu95kt6PPOwxHDYRxgvu1auFpJY0epUzmPd11zI706A== + dependencies: + "@opentelemetry/instrumentation" "^0.41.0" + "@opentelemetry/propagator-aws-xray" "^1.3.0" + "@opentelemetry/resources" "^1.8.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/aws-lambda" "8.10.81" + tslib "^2.3.1" + +"@opentelemetry/instrumentation-aws-sdk@^0.35.0": + version "0.35.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.35.0.tgz#359f56c956afbf526d729e1e8f7d1c28347afaef" + integrity sha512-jKf2nuTe3kYhtINGmgaVlw54q5pgX959zK2abGdvoUSdSP3Pv36YwNZk1K+jAKCN4I71R8/Qp1driAuKKj/Kxg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.0" + "@opentelemetry/propagation-utils" "^0.30.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + tslib "^2.3.1" + +"@opentelemetry/instrumentation-bunyan@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.32.1.tgz#ed315aa3ed6c5e47733c1c74d116c46a5ac1d468" + integrity sha512-TjH357ldA5DpK09XUDWffqV9Km++N9H0dwmxHrElM2TSe4Usgkgw6mlodbuh45hoVDD+cCPi+GO6Dq1QLVEdZg== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@types/bunyan" "1.8.8" + +"@opentelemetry/instrumentation-cassandra-driver@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.33.1.tgz#c68af7c975deb1e5793d2051ca327a5834a5037f" + integrity sha512-nn8XtLB1XmViEAnNnZ43jHojYxgNJ1W+QF2B3yBmfVqXJnE0IbzhIiPmU+Zx3ZSzIoWS0EQQM3ljcgDC03FZ7A== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-connect@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.32.1.tgz#020bcaf1b384e0c4a60b2023ffcdc89e998eb2c1" + integrity sha512-QHi0hTXtqZj3wSyvKwFmkGYHRnGdl8w76MHZj3Rekxe4ILpcn78fZGJSbA+0eYdOWHnGP0c483uMOeGH08XYmA== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/connect" "3.4.35" + +"@opentelemetry/instrumentation-dataloader@^0.5.0": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.5.1.tgz#1b63770793ceedacb42051b22b6a5eb7b54b26d8" + integrity sha512-dqYITnlCo7FSZ8mhyxh9TtogwcebGcuMaXTjYDyIKGshDcjCxhvhNjFDe4y3RD/g/EFKINkYVkVXB1lDqZdxTA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + +"@opentelemetry/instrumentation-dns@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.32.1.tgz#cb0e24e1e2f043112461e533aa7bdaf3389c3d7f" + integrity sha512-WtfwHITUUs2CkRCDT+hbSBy4+ltHIvQDbl/B7TZLQHwpZ6jTRQFsCBzPdhgND4XpHvsXDfLhQihguXyXRGILkg== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + semver "^7.3.2" + +"@opentelemetry/instrumentation-express@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-express/-/instrumentation-express-0.33.1.tgz#0710f839d2a395014d2ffef9390074bb60009841" + integrity sha512-awrpiTZWnLOCJ4TeDMTrs6/gH/oXbNipoPx3WUKQlA1yfMlpNynqokTyCYv1n10Zu9Y2P/nIhoNnUw0ywp61nA== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/express" "4.17.17" + +"@opentelemetry/instrumentation-fastify@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.32.1.tgz#59a2bcb9c0d233c9893ab3c73e951800caa87ab5" + integrity sha512-DGWWGAe8SCULvqlJpL2zJ7o1gYzmhAfKRjJrWmwyZshnjGEw3PQ3b1GHivoxZ6zB7D6ykttxanQovrAKk83WoA== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-fs@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.8.1.tgz#752f286d285374afd65e92ba721c9fa9119b67ac" + integrity sha512-a5U6ydfqVeT4Zp6GL5lZDZNJAmic3CCtgg/f2yqvnpq2fE0cyD/XlW9JWzGhAJaq29E1bxtb9FJ0n6ee3c9dYQ== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-generic-pool@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.32.1.tgz#ae5f58a07eac37e1ac2a797ad9b38d94764b3be8" + integrity sha512-uTsiAq9A486eKi4hSqDi5vF5TZK0KGdLn5CBqhVvc3oPTz2We69etGKqyv2sV51LwX749iRNHbVFDm2Km+wMSQ== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/generic-pool" "^3.1.9" + +"@opentelemetry/instrumentation-graphql@^0.35.0": + version "0.35.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.35.1.tgz#e49ec2256bcc4820458688abac0212ac781864c0" + integrity sha512-bAM4W5wU0lZ1UIKK/5b4p8LEU8N6W+VgpcnUIK7GTTDxdhcWTd3Q6oyS6nauhZSzEnAEmmJVXaLQAGIU4sEkyA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + +"@opentelemetry/instrumentation-grpc@^0.41.0": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.41.2.tgz#38b51eda1bcb6bf8d422410fa4596b56b03e98ab" + integrity sha512-+fh9GUFv97p25CMreUv4OdP5L21hPgfX3d4fuQ0KIgIZIaX2M6/8cr5Ik+8zWsyhYzfFX3CKq6BXm3UBg7cswQ== + dependencies: + "@opentelemetry/instrumentation" "0.41.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/instrumentation-hapi@^0.32.0": + version "0.32.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.32.0.tgz#59362dab5d2a2d7fdfe47bda0cd75dec923b0ece" + integrity sha512-Wl43lSVqqJZAxhWE1BWlV9yoInEOGiKeGqNhphoGJLqblmlF8Yxob1t2fK/wTj2srmmm1XU70olwhN09uOQxpg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/hapi__hapi" "20.0.9" + tslib "^2.3.1" + +"@opentelemetry/instrumentation-http@^0.41.0": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-http/-/instrumentation-http-0.41.2.tgz#dad5a693eaad2113ce7ed089fa46ef98d79f2bfc" + integrity sha512-dzOC6xkfK0LM6Dzo91aInLdSbdIzKA0IgSDnyLi6YZ0Z7c1bfrFncFx/3gZs8vi+KXLALgfMlpzE7IYDW/cM3A== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/instrumentation" "0.41.2" + "@opentelemetry/semantic-conventions" "1.15.2" + semver "^7.5.1" + +"@opentelemetry/instrumentation-ioredis@^0.35.0": + version "0.35.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.35.1.tgz#86d77dc0878707ab456ccebf78233cb0e7127635" + integrity sha512-lixraoS9rs81783QRjQ56/S5KzVBllC+zs7UJuTGODi5Egn/YMGp5lNnlbkUxeJl9LMyADMiP7ZGpQtfKwdc3g== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/redis-common" "^0.36.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/ioredis4" "npm:@types/ioredis@^4.28.10" + +"@opentelemetry/instrumentation-knex@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.32.1.tgz#0c21b1d35be82a9e1732879192a373b145453ed8" + integrity sha512-s+5BtsYUendDTrWAxkr50X3+kb+sVffFzp4z5DC+aZt52P/kF85wm6GyC1mREvvhhK2UKrCq2yMVKD90z0FKsA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-koa@^0.35.0": + version "0.35.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.35.0.tgz#499ff61accd398e2444c0e52f008be88eec8fb33" + integrity sha512-Q/KclXdHKE3sGlalxxX43lx4b8eY5lv5LSdG3mY8aBsrmw1Mx6Cv4VAeqA4ecCygeapTmf9jjOLmgro15IJ3AQ== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/koa" "2.13.6" + "@types/koa__router" "8.0.7" + tslib "^2.3.1" + +"@opentelemetry/instrumentation-lru-memoizer@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.33.1.tgz#636343165dfd83ed66d14abdc19f0e4c070cb1a3" + integrity sha512-1FFOlGTEigMWppEkv7o+IyeyWTXXpFAfmcFjJRph5m88RsotgzPLCnxaSeS0GMU7E8UJplusNmmsnu7jPJ2YqA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + +"@opentelemetry/instrumentation-memcached@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.32.1.tgz#7b21aa22d90d37f353d6cc2220c98390227f5396" + integrity sha512-laolY41/k6KHYnBQrWpnMlEK49/g8/OQBtvSiPdHiF46wW3eWpXmaTGMRksrRGUtyE+VMRhf7WIDRUYLZULP1g== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/memcached" "^2.2.6" + +"@opentelemetry/instrumentation-mongodb@^0.36.0": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.36.1.tgz#a92e48f2cb4e2e2de430d900c96e21911709e137" + integrity sha512-//FdYXGcUO08Y1tVPXlcEvUYCnRU8tlBgYBe3ZMjF7E1GMaFti4Xy6sAHVreyl0ZQjBTaGtHdyORHIOTKUM4ZA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/sdk-metrics" "^1.9.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-mongoose@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.33.1.tgz#0e37eed215fb7fbf8adc0e70199bb8992cb1ea21" + integrity sha512-IzYcEZSmlaOlkyACt8gTl0z3eEQafxzEAt/+W+FdNBiUdm81qpVx/1bpzJwSgIsgcLf27Dl5WsPmrSAi4+Bcng== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-mysql2@^0.34.0": + version "0.34.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.34.1.tgz#d7ce741a7d9a7da270fa791e1c64d8cedd58b5b7" + integrity sha512-SPwgLI2H+gH+GP7b5cWQlFqO/7UeHvw6ZzFKxwLr4vy8wmxYF4aBMLc8qVO8bdXFHd114v0IzOIAvpG6sl/zYQ== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@opentelemetry/sql-common" "^0.40.0" + +"@opentelemetry/instrumentation-mysql@^0.34.0": + version "0.34.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.34.1.tgz#9703d21615dd5ee6b9eda1d74029ba75eec46c9a" + integrity sha512-zQq7hN3ILm1vIJCGeKHRc4pTK8LOmkTt8oKWf0v+whFs7axieIhXZMoCqIBm6BigLy3Trg5iaKyuSrx7kO6q2g== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/mysql" "2.15.21" + +"@opentelemetry/instrumentation-nestjs-core@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.33.1.tgz#a6e0175bcda25e455339a5527268e746be969297" + integrity sha512-Y5Khvp8ODA6TuDcZKAc63cYDeeZAA/n0ceF0pcVCJwA2NBeD0hmTrCJXES2cvt7wVbHV/SYCu7OpYDQkNjbBWw== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-net@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-net/-/instrumentation-net-0.32.1.tgz#7b394b5250f160b46f2363d37c1ebe7c8c1ac6b7" + integrity sha512-r9YC8fFDi+B/JiNfMn+vJaOpgdA83bQM3u4mW9mJi2hAI/LcvjJYPx4aTRLWAPSd/HRG/Olzdvx5LdWvzL8LHg== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-pg@^0.36.0": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.36.1.tgz#66e3aa10948c6e3188d04676dbf304ae8571ce2f" + integrity sha512-k8L7RSRTQ6e+DbHEXZB8Tmf/efkQnWKeClpZb3TEdb34Pvme4PmcpG2zb6JtM99nNrshNlVDLCZ90U3xDneTbw== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@opentelemetry/sql-common" "^0.40.0" + "@types/pg" "8.6.1" + "@types/pg-pool" "2.0.3" + +"@opentelemetry/instrumentation-pino@^0.34.0": + version "0.34.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.34.1.tgz#7567d2e2298536229f5a72c6c222b79b3b6689c7" + integrity sha512-/FW/wxTshwwmiSE8KgVoWvfjxz5omKBdDbP0McKZk84V02lwwJk0m7+kc2cSOed5rk7iprpZolwO8a8AFVanNA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + +"@opentelemetry/instrumentation-redis-4@^0.35.0": + version "0.35.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.35.1.tgz#40ae092c04ef9f92148197f8b3fe9eef4657123e" + integrity sha512-tQ07wvtjUbHSvvhPPvWyZjYTSzVBTpC746ro5szLnniodvxtKkmP/N+R9KyFXfyH7wwaLIR1Scgq3XSGSppt+Q== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/redis-common" "^0.36.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-redis@^0.35.0": + version "0.35.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.35.1.tgz#d821e8d0e9470c9ab144aa45292ec7991dca6bb1" + integrity sha512-zY7eTzGyJCMX/0o04Q9yLy7gllf7Zh4s+g7Kv1d2cMLtTt9zGSlncqj49uNCnneywnpMNRUIwcmd+Ch1bQeh+g== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/redis-common" "^0.36.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-restify@^0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.33.0.tgz#4f7fbcda93e428052c07d6edc05c192e868917be" + integrity sha512-evDjcF6M9G+KH/GCjtUx9Vnm/CBZ9CBfmm/RP6Aeo20y6Kset1ZEoPK79JT7JK1sCPqViBPoj4qnFePz9/20lg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + tslib "^2.3.1" + +"@opentelemetry/instrumentation-router@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-router/-/instrumentation-router-0.33.1.tgz#ec37e7470675a442e48c2e9e4753f595951c16d8" + integrity sha512-nz8PvjYMQWFgR17Yc5Sj624CamhXP021mWaWfHx6RhI6o67sPt+DT5468yZJZV1gMnaOSQfiBkjWZ7AGQkRutw== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-socket.io@^0.34.0": + version "0.34.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.34.1.tgz#ac5814f8a805a550c9e63e5f7f9ac4186ec8d579" + integrity sha512-v9US0hXJaY7dkKOC2/CMLB526wn9F3CQrkeVUidvSm+AxFBoYXKdAUJijdBPWT4PKY98/VjFHuZ3HSe4QD8zPA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-tedious@^0.6.0": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.6.1.tgz#2b488581161839c19ef0641d0afdc9fa6cc8210b" + integrity sha512-zwgLKmWtAn0XsMb98aMaI7gCawzPqpy+LOgGTlYmUdqSVYnzMAn4QKrx24Rrd5pgmzOEIbAWHlpN7pOc1eIqxA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/tedious" "^4.0.6" + +"@opentelemetry/instrumentation-winston@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.32.1.tgz#0548543151ac7505cffc64c0019ca3d5bdda5638" + integrity sha512-wgXb2W2cbNdRQfXTH0jcnfbhlVPapmu13Wqhedj2pMpXS2aBnWAdvNFlArS6q84MEhzv3A4fVevjbwXa4uCzwQ== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + +"@opentelemetry/instrumentation@0.41.2", "@opentelemetry/instrumentation@^0.41.0", "@opentelemetry/instrumentation@^0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.41.2.tgz#cae11fa64485dcf03dae331f35b315b64bc6189f" + integrity sha512-rxU72E0pKNH6ae2w5+xgVYZLzc5mlxAbGzF4shxMVK8YC2QQsfN38B2GPbj0jvrKWWNUElfclQ+YTykkNg/grw== + dependencies: + "@types/shimmer" "^1.0.2" + import-in-the-middle "1.4.2" + require-in-the-middle "^7.1.1" + semver "^7.5.1" + shimmer "^1.2.1" + +"@opentelemetry/otlp-exporter-base@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.41.2.tgz#5928dfedb2a70117f03809862cf2cbdf8b7f9bf3" + integrity sha512-pfwa6d+Dax3itZcGWiA0AoXeVaCuZbbqUTsCtOysd2re8C2PWXNxDONUfBWsn+KgxAdi+ljwTjJGiaVLDaIEvQ== + dependencies: + "@opentelemetry/core" "1.15.2" + +"@opentelemetry/otlp-grpc-exporter-base@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.41.2.tgz#b056915aa274947517ac86b0c78533db274404e8" + integrity sha512-OErK8dYjXG01XIMIpmOV2SzL9ctkZ0Nyhf2UumICOAKtgLvR5dG1JMlsNVp8Jn0RzpsKc6Urv7JpP69wzRXN+A== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + protobufjs "^7.2.3" + +"@opentelemetry/otlp-proto-exporter-base@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.41.2.tgz#10b1a4bb973bd6e0e741931d90f22387c5a3a151" + integrity sha512-BxmEMiP6tHiFroe5/dTt9BsxCci7BTLtF7A6d4DKHLiLweWWZxQ9l7hON7qt/IhpKrQcAFD1OzZ1Gq2ZkNzhCw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + protobufjs "^7.2.3" + +"@opentelemetry/otlp-transformer@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.41.2.tgz#cd3a7185ef77fe9b7b4c2d2f9e001fa1d2fa6cf8" + integrity sha512-jJbPwB0tNu2v+Xi0c/v/R3YBLJKLonw1p+v3RVjT2VfzeUyzSp/tBeVdY7RZtL6dzZpA9XSmp8UEfWIFQo33yA== + dependencies: + "@opentelemetry/api-logs" "0.41.2" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-logs" "0.41.2" + "@opentelemetry/sdk-metrics" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + +"@opentelemetry/propagation-utils@^0.30.0": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagation-utils/-/propagation-utils-0.30.1.tgz#2fbb48cec2c118d14e5814258990973fca5e2860" + integrity sha512-GCZg19gBSOTCeHvSCVy08WUyKAp2LyIRcRQPZk8MMAbmz8JWha3huBS9tNXjB4hYwRqW2SJOZzoYjt2P/BxvEw== + +"@opentelemetry/propagator-aws-xray@^1.3.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz#7fc77a95fe89c705442b0e5a4218422c2954cc07" + integrity sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ== + dependencies: + "@opentelemetry/core" "^1.0.0" + +"@opentelemetry/propagator-b3@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.15.2.tgz#7bcb9fa645042a440922669fbac06a1a91e6704b" + integrity sha512-ZSrL3DpMEDsjD8dPt9Ze3ue53nEXJt512KyxXlLgLWnSNbe1mrWaXWkh7OLDoVJh9LqFw+tlvAhDVt/x3DaFGg== + dependencies: + "@opentelemetry/core" "1.15.2" + +"@opentelemetry/propagator-jaeger@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.15.2.tgz#90757fc9529da806a1845f502acb6d0eb821e3db" + integrity sha512-6m1yu7PVDIRz6BwA36lacfBZJCfAEHKgu+kSyukNwVdVjsTNeyD9xNPQnkl0WN7Rvhk8/yWJ83tLPEyGhk1wCQ== + dependencies: + "@opentelemetry/core" "1.15.2" + +"@opentelemetry/propagator-ot-trace@^0.27.0": + version "0.27.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-ot-trace/-/propagator-ot-trace-0.27.1.tgz#6718aefd6d0401726e2232fd7ad84515f2b34ca9" + integrity sha512-+Aeht0+1kv/7KAYxNVQFDczEgMQIhi+yO/QNBTxEUGWEQshxznqT2Knqd5nARY8IF3okFdkP4PJUFubYfjWSzw== + +"@opentelemetry/redis-common@^0.36.1": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/redis-common/-/redis-common-0.36.1.tgz#79bca902603dd27862223a751be0f4bb0be54c2b" + integrity sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw== + +"@opentelemetry/resource-detector-alibaba-cloud@^0.28.0": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.1.tgz#f65bfc25d0f26d55bce33a8caa788274353445cf" + integrity sha512-0ucRgwid6bSAgYL5fiTkLh7aS9cPyz+Ijyv961SZbpMeIgVBvU931676xrdGNqlmuxavt24BrNUUWZ4XKq8ViA== + dependencies: + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/resource-detector-aws@^1.3.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.3.1.tgz#4d221859c19b0e4e604ac88224129e82a78ec8b6" + integrity sha512-1n3U0ns0xlA8EIOMY1oEP5+5rZE/nfhIld6nw8T8PK4PkS3kAQb1ZCj3RXajs3qA+qWWIaEvCNREx3A0Ifyt3Q== + dependencies: + "@opentelemetry/core" "^1.0.0" + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/resource-detector-container@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.1.tgz#7b59f5c9d2062db78f3dd2e2c59adbfafdd7d5a9" + integrity sha512-7zQASISRLmsaCKurvaoi7kTa0ab4iQEvPVfRo4k5RLSVi4puaCcC+2qOd6Fk4jEqNueevhyn2upGUeH+0EJ6yQ== + dependencies: + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/resource-detector-gcp@^0.29.0": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.1.tgz#eef9a08fbac816f3906a327be508e77f23a15a90" + integrity sha512-u5mB53I49m0cXQ97dgZlgEnNin9xqwl9au2sXmblHG9XS6PocGoAgAiXGYYvITWhR3ID5Ei2GyGoJDFdAtCrVA== + dependencies: + "@opentelemetry/core" "^1.0.0" + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + gcp-metadata "^5.0.0" + +"@opentelemetry/resources@1.15.2", "@opentelemetry/resources@^1.0.0", "@opentelemetry/resources@^1.12.0", "@opentelemetry/resources@^1.8.0": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.15.2.tgz#0c9e26cb65652a1402834a3c030cce6028d6dd9d" + integrity sha512-xmMRLenT9CXmm5HMbzpZ1hWhaUowQf8UB4jMjFlAxx1QzQcsD3KFNAVX/CAWzFPtllTyTplrA4JrQ7sCH3qmYw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/sdk-logs@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.41.2.tgz#c3eeb6793bdfa52351d66e2e66637e433abed672" + integrity sha512-smqKIw0tTW15waj7BAPHFomii5c3aHnSE4LQYTszGoK5P9nZs8tEAIpu15UBxi3aG31ZfsLmm4EUQkjckdlFrw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + +"@opentelemetry/sdk-metrics@1.15.2", "@opentelemetry/sdk-metrics@^1.15.1", "@opentelemetry/sdk-metrics@^1.9.1": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.15.2.tgz#eadd0a049de9cd860e1e0d49eea01156469c4b60" + integrity sha512-9aIlcX8GnhcsAHW/Wl8bzk4ZnWTpNlLtud+fxUfBtFATu6OZ6TrGrF4JkT9EVrnoxwtPIDtjHdEsSjOqisY/iA== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + lodash.merge "^4.6.2" + +"@opentelemetry/sdk-node@^0.41.0", "@opentelemetry/sdk-node@^0.41.1": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-node/-/sdk-node-0.41.2.tgz#7ac2fc149d371a9f17c2adba395a9aa257ed1bf4" + integrity sha512-t3vaB5ajoXLtVFoL8TSoSgaVATmOyUfkIfBE4nvykm0dM2vQjMS/SUUelzR06eiPTbMPsr2UkevWhy2/oXy2vg== + dependencies: + "@opentelemetry/api-logs" "0.41.2" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/exporter-jaeger" "1.15.2" + "@opentelemetry/exporter-trace-otlp-grpc" "0.41.2" + "@opentelemetry/exporter-trace-otlp-http" "0.41.2" + "@opentelemetry/exporter-trace-otlp-proto" "0.41.2" + "@opentelemetry/exporter-zipkin" "1.15.2" + "@opentelemetry/instrumentation" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-logs" "0.41.2" + "@opentelemetry/sdk-metrics" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + "@opentelemetry/sdk-trace-node" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/sdk-trace-base@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.15.2.tgz#4821f94033c55a6c8bbd35ae387b715b6108517a" + integrity sha512-BEaxGZbWtvnSPchV98qqqqa96AOcb41pjgvhfzDij10tkBhIu9m0Jd6tZ1tJB5ZHfHbTffqYVYE0AOGobec/EQ== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/sdk-trace-node@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.15.2.tgz#987c929597ca274995164508f57a15f682d9de2f" + integrity sha512-5deakfKLCbPpKJRCE2GPI8LBE2LezyvR17y3t37ZI3sbaeogtyxmBaFV+slmG9fN8OaIT+EUsm1QAT1+z59gbQ== + dependencies: + "@opentelemetry/context-async-hooks" "1.15.2" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/propagator-b3" "1.15.2" + "@opentelemetry/propagator-jaeger" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + semver "^7.5.1" + +"@opentelemetry/sdk-trace-web@^1.15.1": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.15.2.tgz#1db22d0afbd07b1287e8a331e30862eb19b24e20" + integrity sha512-OjCrwtu4b+cAt540wyIr7d0lCA/cY9y42lmYDFUfJ8Ixj2bByIUJ4yyd9M7mXHpQHdiR/Kq2vzsgS14Uj+RU0Q== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/semantic-conventions@1.15.2", "@opentelemetry/semantic-conventions@^1.15.1": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.2.tgz#3bafb5de3e20e841dff6cb3c66f4d6e9694c4241" + integrity sha512-CjbOKwk2s+3xPIMcd5UNYQzsf+v94RczbdNix9/kQh38WiQkM90sUOi3if8eyHFgiBjBjhwXrA7W3ydiSQP9mw== + "@opentelemetry/semantic-conventions@^1.0.0": version "1.12.0" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.12.0.tgz#19c959bdb900986e74939d4227e757aa16936b91" @@ -4095,6 +4822,13 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.3.1.tgz#ba07b864a3c955f061aa30ea3ef7f4ae4449794a" integrity sha512-wU5J8rUoo32oSef/rFpOT1HIjLjAv3qIDHkw1QIhODV3OpAVHi5oVzlouozg9obUmZKtbZ0qUe/m7FP0y0yBzA== +"@opentelemetry/sql-common@^0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sql-common/-/sql-common-0.40.0.tgz#8cbed0722354d62997c3b9e1adf0e16257be6b15" + integrity sha512-vSqRJYUPJVjMFQpYkQS3ruexCPSZJ8esne3LazLwtCPaPRvzZ7WG3tX44RouAn7w4wMp8orKguBqtt+ng2UTnw== + dependencies: + "@opentelemetry/core" "^1.1.0" + "@openzeppelin/upgrades@^2.8.0": version "2.8.0" resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades/-/upgrades-2.8.0.tgz#8086ab9c99d9f8dac7205030b0f9e7e4a280c4a3" @@ -4308,6 +5042,23 @@ "@noble/hashes" "~1.2.0" "@scure/base" "~1.1.0" +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "@sinclair/typebox@^0.25.16": version "0.25.24" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" @@ -5022,7 +5773,7 @@ resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.1.tgz#bb16403c17754b0c4d5772d71d03b924a03d4c80" integrity sha512-YK8irIC+eMrrmtGx0H4ISn9GgzLd9dojZWJaMbjp1YHLl2VqqNFBNrL5Q3KjGf4VE3sf/4hmq6EhQZ7kZp1NoQ== -"@types/accepts@^1.3.5": +"@types/accepts@*", "@types/accepts@^1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== @@ -5043,6 +5794,11 @@ dependencies: "@types/pvutils" "*" +"@types/aws-lambda@8.10.81": + version "8.10.81" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.81.tgz#6d405269aad82e05a348687631aa9a587cdbe158" + integrity sha512-C1rFKGVZ8KwqhwBOYlpoybTSRtxu2433ea6JaO3amc6ubEe08yQoFsPa9aU9YqvX7ppeZ25CnCtC4AH9mhtxsQ== + "@types/babel__core@^7.1.14": version "7.20.0" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" @@ -5157,18 +5913,33 @@ dependencies: "@types/node" "*" -"@types/connect@*": +"@types/connect@*", "@types/connect@3.4.35": version "3.4.35" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" +"@types/content-disposition@*": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.5.tgz#650820e95de346e1f84e30667d168c8fd25aa6e3" + integrity sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA== + "@types/cookiejar@*": version "2.1.2" resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== +"@types/cookies@*": + version "0.7.7" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" + integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + "@types/cors@2.8.12": version "2.8.12" resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" @@ -5257,6 +6028,16 @@ "@types/range-parser" "*" "@types/send" "*" +"@types/express@*", "@types/express@4.17.17", "@types/express@^4.17.14", "@types/express@^4.17.6": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/express@4.17.14": version "4.17.14" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" @@ -5276,16 +6057,6 @@ "@types/express-serve-static-core" "*" "@types/serve-static" "*" -"@types/express@^4.17.14", "@types/express@^4.17.6": - version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - "@types/fetch-mock@^7.3.5": version "7.3.5" resolved "https://registry.yarnpkg.com/@types/fetch-mock/-/fetch-mock-7.3.5.tgz#7aee678c4e7c7e1a168bae8fdab5b8d712e377f6" @@ -5305,6 +6076,13 @@ dependencies: "@types/node" "*" +"@types/generic-pool@^3.1.9": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@types/generic-pool/-/generic-pool-3.8.1.tgz#b9b25b2ba4733057fa5df1818352d3205c48e87b" + integrity sha512-eaMAbZS0EfKvaP5PUZ/Cdf5uJBO2t6T3RdvQTKuMqUwGhNpCnPAsKWEMyV+mCeCQG3UiHrtgdzni8X6DmhxRaQ== + dependencies: + generic-pool "*" + "@types/glob@*": version "8.1.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" @@ -5333,6 +6111,39 @@ dependencies: "@types/node" "*" +"@types/hapi__catbox@*": + version "10.2.4" + resolved "https://registry.yarnpkg.com/@types/hapi__catbox/-/hapi__catbox-10.2.4.tgz#4d0531a6c2d0e45024f724020d536041ef8ffe30" + integrity sha512-A6ivRrXD5glmnJna1UAGw87QNZRp/vdFO9U4GS+WhOMWzHnw+oTGkMvg0g6y1930CbeheGOCm7A1qHsqH7AXqg== + +"@types/hapi__hapi@20.0.9": + version "20.0.9" + resolved "https://registry.yarnpkg.com/@types/hapi__hapi/-/hapi__hapi-20.0.9.tgz#9d570846c96268266a14c970c13aeeaccfc8e172" + integrity sha512-fGpKScknCKZityRXdZgpCLGbm41R1ppFgnKHerfZlqOOlCX/jI129S6ghgBqkqCE8m9A0CIu1h7Ch04lD9KOoA== + dependencies: + "@hapi/boom" "^9.0.0" + "@hapi/iron" "^6.0.0" + "@hapi/podium" "^4.1.3" + "@types/hapi__catbox" "*" + "@types/hapi__mimos" "*" + "@types/hapi__shot" "*" + "@types/node" "*" + joi "^17.3.0" + +"@types/hapi__mimos@*": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz#4f8a1c58345fc468553708d3cb508724aa081bd9" + integrity sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ== + dependencies: + "@types/mime-db" "*" + +"@types/hapi__shot@*": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@types/hapi__shot/-/hapi__shot-4.1.2.tgz#d4011999a91e8101030fece1462fe99769455855" + integrity sha512-8wWgLVP1TeGqgzZtCdt+F+k15DWQvLG1Yv6ZzPfb3D5WIo5/S+GGKtJBVo2uNEcqabP5Ifc71QnJTDnTmw1axA== + dependencies: + "@types/node" "*" + "@types/hdkey@^0.7.0": version "0.7.1" resolved "https://registry.yarnpkg.com/@types/hdkey/-/hdkey-0.7.1.tgz#9bc63ebbe96b107b277b65ea7a95442a677d0d61" @@ -5340,11 +6151,21 @@ dependencies: "@types/node" "*" +"@types/http-assert@*": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" + integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== + "@types/http-cache-semantics@*": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== +"@types/http-errors@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + "@types/humanize-duration@^3.18.0": version "3.27.1" resolved "https://registry.yarnpkg.com/@types/humanize-duration/-/humanize-duration-3.27.1.tgz#f14740d1f585a0a8e3f46359b62fda8b0eaa31e7" @@ -5358,6 +6179,13 @@ "@types/through" "*" rxjs "^6.4.0" +"@types/ioredis4@npm:@types/ioredis@^4.28.10": + version "4.28.10" + resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.28.10.tgz#40ceb157a4141088d1394bb87c98ed09a75a06ff" + integrity sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ== + dependencies: + "@types/node" "*" + "@types/is-base64@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/is-base64/-/is-base64-1.1.1.tgz#a17d2b0075f637f80f9ab5f76f0071a65f6965d4" @@ -5419,6 +6247,11 @@ dependencies: "@types/node" "*" +"@types/keygrip@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" + integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== + "@types/keyv@^3.1.4": version "3.1.4" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" @@ -5426,6 +6259,48 @@ dependencies: "@types/node" "*" +"@types/koa-compose@*": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" + integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== + dependencies: + "@types/koa" "*" + +"@types/koa@*": + version "2.13.8" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.8.tgz#4302d2f2712348aadb6c0b03eb614f30afde486b" + integrity sha512-Ugmxmgk/yPRW3ptBTh9VjOLwsKWJuGbymo1uGX0qdaqqL18uJiiG1ZoV0rxCOYSaDGhvEp5Ece02Amx0iwaxQQ== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/koa@2.13.6": + version "2.13.6" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.6.tgz#6dc14e727baf397310aa6f414ebe5d144983af42" + integrity sha512-diYUfp/GqfWBAiwxHtYJ/FQYIXhlEhlyaU7lB/bWQrx4Il9lCET5UwpFy3StOAohfsxxvEQ11qIJgT1j2tfBvw== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/koa__router@8.0.7": + version "8.0.7" + resolved "https://registry.yarnpkg.com/@types/koa__router/-/koa__router-8.0.7.tgz#663d69d5ddebff5aaca27c0594430b3ba6ea20be" + integrity sha512-OB3Ax75nmTP+WR9AgdzA42DI7YmBtiNKN2g1Wxl+d5Dyek9SWt740t+ukwXSmv/jMBCUPyV3YEI93vZHgdP7UQ== + dependencies: + "@types/koa" "*" + "@types/ledgerhq__hw-transport-node-hid@^4.22.2": version "4.22.2" resolved "https://registry.yarnpkg.com/@types/ledgerhq__hw-transport-node-hid/-/ledgerhq__hw-transport-node-hid-4.22.2.tgz#f3de58b9b49b461dd96e5bfb646328c242e70aca" @@ -5495,6 +6370,18 @@ resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== +"@types/memcached@^2.2.6": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@types/memcached/-/memcached-2.2.7.tgz#b3de026a11a4c0a18fb079cfeeaea10a41da20f9" + integrity sha512-ImJbz1i8pl+OnyhYdIDnHe8jAuM8TOwM/7VsciqhYX3IL0jPPUToAtVxklfcWFGYckahEYZxhd9FS0z3MM1dpA== + dependencies: + "@types/node" "*" + +"@types/mime-db@*": + version "1.43.1" + resolved "https://registry.yarnpkg.com/@types/mime-db/-/mime-db-1.43.1.tgz#c2a0522453bb9b6e84ee48b7eef765d19bcd519e" + integrity sha512-kGZJY+R+WnR5Rk+RPHUMERtb2qBRViIHCBdtUrY+NmwuGb8pQdfTqQiCKPrxpdoycl8KWm2DLdkpoSdt479XoQ== + "@types/mime@*": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" @@ -5547,6 +6434,13 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== +"@types/mysql@2.15.21": + version "2.15.21" + resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.21.tgz#7516cba7f9d077f980100c85fd500c8210bd5e45" + integrity sha512-NPotx5CVful7yB+qZbWtXL2fA4e7aEHkihHLjklc6ID8aq7bhguHgeIoC1EmSNTAuCgI6ZXrjt2ZSaXnYX0EUg== + dependencies: + "@types/node" "*" + "@types/node-fetch@^2.5.7": version "2.6.3" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.3.tgz#175d977f5e24d93ad0f57602693c435c57ad7e80" @@ -5629,6 +6523,31 @@ dependencies: "@types/node" "*" +"@types/pg-pool@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/pg-pool/-/pg-pool-2.0.3.tgz#3eb8df2933f617f219a53091ad4080c94ba1c959" + integrity sha512-fwK5WtG42Yb5RxAwxm3Cc2dJ39FlgcaNiXKvtTLAwtCn642X7dgel+w1+cLWwpSOFImR3YjsZtbkfjxbHtFAeg== + dependencies: + "@types/pg" "*" + +"@types/pg@*": + version "8.10.2" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.10.2.tgz#7814d1ca02c8071f4d0864c1b17c589b061dba43" + integrity sha512-MKFs9P6nJ+LAeHLU3V0cODEOgyThJ3OAnmOlsZsxux6sfQs3HRXR5bBn7xG5DjckEFhTAxsXi7k7cd0pCMxpJw== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^4.0.1" + +"@types/pg@8.6.1": + version "8.6.1" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.1.tgz#099450b8dc977e8197a44f5229cedef95c8747f9" + integrity sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^2.2.0" + "@types/pg@^7.14.3": version "7.14.11" resolved "https://registry.yarnpkg.com/@types/pg/-/pg-7.14.11.tgz#daf5555504a1f7af4263df265d91f140fece52e3" @@ -5794,6 +6713,11 @@ "@types/mime" "*" "@types/node" "*" +"@types/shimmer@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.0.2.tgz#93eb2c243c351f3f17d5c580c7467ae5d686b65f" + integrity sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg== + "@types/solidity-parser-antlr@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@types/solidity-parser-antlr/-/solidity-parser-antlr-0.2.3.tgz#bb2d9c6511bf483afe4fc3e2714da8a924e59e3f" @@ -5860,6 +6784,13 @@ dependencies: "@types/tar-fs" "*" +"@types/tedious@^4.0.6": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/tedious/-/tedious-4.0.9.tgz#baa3892e45c63d7aac54d7bf5b01385d210ff19e" + integrity sha512-ipwFvfy9b2m0gjHsIX0D6NAAwGCKokzf5zJqUZHUGt+7uWVlBIy6n2eyMgiKQ8ChLFVxic/zwQUhjLYNzbHDRA== + dependencies: + "@types/node" "*" + "@types/through@*": version "0.0.30" resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" @@ -6089,6 +7020,11 @@ accepts@^1.3.5, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -6109,7 +7045,7 @@ acorn@^8.4.1, acorn@^8.7.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== -acorn@^8.9.0: +acorn@^8.8.2, acorn@^8.9.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== @@ -6227,6 +7163,11 @@ ansi-align@^3.0.0: dependencies: string-width "^4.1.0" +ansi-color@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-color/-/ansi-color-0.2.1.tgz#3e75c037475217544ed763a8db5709fa9ae5bf9a" + integrity sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ== + ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" @@ -7679,6 +8620,16 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" +bufrw@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/bufrw/-/bufrw-1.3.0.tgz#28d6cfdaf34300376836310f5c31d57eeb40c8fa" + integrity sha512-jzQnSbdJqhIltU9O5KUiTtljP9ccw2u5ix59McQy4pV2xGhVLhRZIndY8GIrgh5HjXa6+QJ9AQhOd2QWQizJFQ== + dependencies: + ansi-color "^0.2.1" + error "^7.0.0" + hexer "^1.5.0" + xtend "^4.0.0" + builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -8258,6 +9209,11 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== +cjs-module-lexer@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + cjson@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/cjson/-/cjson-0.3.3.tgz#a92d9c786e5bf9b930806329ee05d5d3261b4afa" @@ -10238,6 +11194,21 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +error@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + integrity sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw== + dependencies: + string-template "~0.2.1" + xtend "~4.0.0" + +error@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" + integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA== + dependencies: + string-template "~0.2.1" + es-abstract@^1.17.0-next.1, es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: version "1.21.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" @@ -12506,7 +13477,7 @@ gcp-metadata@^4.2.0: gaxios "^4.0.0" json-bigint "^1.0.0" -gcp-metadata@^5.3.0: +gcp-metadata@^5.0.0, gcp-metadata@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-5.3.0.tgz#6f45eb473d0cb47d15001476b48b663744d25408" integrity sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w== @@ -12538,6 +13509,11 @@ generate-password@^1.5.1: resolved "https://registry.yarnpkg.com/generate-password/-/generate-password-1.7.0.tgz#00ba4eb1e71f89a72307b0d6604ee0d4e7f5770c" integrity sha512-WPCtlfy0jexf7W5IbwxGUgpIDvsZIohbI2DAq2Q6TSlKKis+G4GT9sxvPxrZUGL8kP6WUXMWNqYnxY6DDKAdFA== +generic-pool@*: + version "3.9.0" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.9.0.tgz#36f4a678e963f4fdb8707eab050823abc4e8f5e4" + integrity sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -13680,6 +14656,16 @@ heap-js@^2.2.0: resolved "https://registry.yarnpkg.com/heap-js/-/heap-js-2.3.0.tgz#8eed2cede31ec312aa696eef1d4df0565841f183" integrity sha512-E5303mzwQ+4j/n2J0rDvEPBN7GKjhis10oHiYOgjxsmxYgqG++hz9NyLLOXttzH8as/DyiBHYpUrJTZWYaMo8Q== +hexer@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/hexer/-/hexer-1.5.0.tgz#b86ce808598e8a9d1892c571f3cedd86fc9f0653" + integrity sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg== + dependencies: + ansi-color "^0.2.1" + minimist "^1.1.0" + process "^0.10.0" + xtend "^4.0.0" + hexoid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" @@ -14030,6 +15016,16 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-in-the-middle@1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz#2a266676e3495e72c04bbaa5ec14756ba168391b" + integrity sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw== + dependencies: + acorn "^8.8.2" + acorn-import-assertions "^1.9.0" + cjs-module-lexer "^1.2.2" + module-details-from-path "^1.0.3" + import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" @@ -14389,6 +15385,13 @@ is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.8.1: dependencies: has "^1.0.3" +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -15060,6 +16063,17 @@ jackspeak@^2.0.3: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jaeger-client@^3.15.0: + version "3.19.0" + resolved "https://registry.yarnpkg.com/jaeger-client/-/jaeger-client-3.19.0.tgz#9b5bd818ebd24e818616ee0f5cffe1722a53ae6e" + integrity sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw== + dependencies: + node-int64 "^0.4.0" + opentracing "^0.14.4" + thriftrw "^3.5.0" + uuid "^8.3.2" + xorshift "^1.1.1" + jake@^10.8.5: version "10.8.5" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" @@ -15464,6 +16478,17 @@ jmespath@0.16.0: resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== +joi@^17.3.0: + version "17.9.2" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" + integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + join-path@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/join-path/-/join-path-1.1.1.tgz#10535a126d24cbd65f7ffcdf15ef2e631076b505" @@ -16745,6 +17770,11 @@ loglevel@^1.6.1, loglevel@^1.6.8: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== +long@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f" + integrity sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ== + long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" @@ -17816,6 +18846,11 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +module-details-from-path@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" + integrity sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== + module-error@^1.0.1, module-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" @@ -18813,6 +19848,11 @@ oboe@2.1.5: dependencies: http-https "^1.0.0" +obuf@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + "old-identity-sdk@npm:@celo/identity@1.5.2": version "1.5.2" resolved "https://registry.yarnpkg.com/@celo/identity/-/identity-1.5.2.tgz#6401aeefbf7893374f6f940c9e0918d0a75d0411" @@ -18930,6 +19970,11 @@ opencollective-postinstall@^2.0.2: resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== +opentracing@^0.14.4: + version "0.14.7" + resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.7.tgz#25d472bd0296dc0b64d7b94cbc995219031428f5" + integrity sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q== + openzeppelin-solidity@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/openzeppelin-solidity/-/openzeppelin-solidity-2.5.1.tgz#1cdcce30c4c6a7b6625dab62ccd0440a813ab597" @@ -19592,6 +20637,11 @@ pg-int8@1.0.1: resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== +pg-numeric@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a" + integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== + pg-packet-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz#e45c3ae678b901a2873af1e17b92d787962ef914" @@ -19607,7 +20657,7 @@ pg-pool@^3.6.0: resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.0.tgz#3190df3e4747a0d23e5e9e8045bcd99bda0a712e" integrity sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ== -pg-protocol@^1.2.0, pg-protocol@^1.6.0: +pg-protocol@*, pg-protocol@^1.2.0, pg-protocol@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== @@ -19623,6 +20673,19 @@ pg-types@^2.1.0, pg-types@^2.2.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" +pg-types@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-4.0.1.tgz#31857e89d00a6c66b06a14e907c3deec03889542" + integrity sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g== + dependencies: + pg-int8 "1.0.1" + pg-numeric "1.0.2" + postgres-array "~3.0.1" + postgres-bytea "~3.0.0" + postgres-date "~2.0.1" + postgres-interval "^3.0.0" + postgres-range "^1.1.1" + pg@^7.18.0: version "7.18.2" resolved "https://registry.yarnpkg.com/pg/-/pg-7.18.2.tgz#4e219f05a00aff4db6aab1ba02f28ffa4513b0bb" @@ -19771,16 +20834,33 @@ postgres-array@~2.0.0: resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== +postgres-array@~3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-3.0.2.tgz#68d6182cb0f7f152a7e60dc6a6889ed74b0a5f98" + integrity sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog== + postgres-bytea@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== +postgres-bytea@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-3.0.0.tgz#9048dc461ac7ba70a6a42d109221619ecd1cb089" + integrity sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw== + dependencies: + obuf "~1.1.2" + postgres-date@~1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== +postgres-date@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-2.0.1.tgz#638b62e5c33764c292d37b08f5257ecb09231457" + integrity sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw== + postgres-interval@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" @@ -19788,6 +20868,16 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" +postgres-interval@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-3.0.0.tgz#baf7a8b3ebab19b7f38f07566c7aab0962f0c86a" + integrity sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw== + +postgres-range@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/postgres-range/-/postgres-range-1.1.3.tgz#9ccd7b01ca2789eb3c2e0888b3184225fa859f76" + integrity sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g== + pouchdb-abstract-mapreduce@7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/pouchdb-abstract-mapreduce/-/pouchdb-abstract-mapreduce-7.3.1.tgz#96ff4a0f41cbe273f3f52fde003b719005a2093c" @@ -20119,6 +21209,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/process/-/process-0.10.1.tgz#842457cc51cfed72dc775afeeafb8c6034372725" + integrity sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA== + process@^0.11.1, process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -20319,7 +21414,7 @@ protobufjs@6.11.3, protobufjs@^6.10.0, protobufjs@^6.11.2, protobufjs@^6.11.3, p "@types/node" ">=13.7.0" long "^4.0.0" -protobufjs@7.2.4, protobufjs@^7.2.2: +protobufjs@7.2.4, protobufjs@^7.2.2, protobufjs@^7.2.3: version "7.2.4" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.4.tgz#3fc1ec0cdc89dd91aef9ba6037ba07408485c3ae" integrity sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ== @@ -21136,6 +22231,15 @@ require-from-string@^2.0.0, require-from-string@^2.0.1, require-from-string@^2.0 resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-in-the-middle@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz#b539de8f00955444dc8aed95e17c69b0a4f10fcf" + integrity sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw== + dependencies: + debug "^4.1.1" + module-details-from-path "^1.0.3" + resolve "^1.22.1" + require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -21239,6 +22343,15 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.1, resolve@^1.14.2, resolve@^1.20 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.22.1: + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -21638,7 +22751,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.1.2, semver@^7.5.2: +semver@^7.1.2, semver@^7.5.1, semver@^7.5.2: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -21826,6 +22939,11 @@ shelljs@^0.8.4: interpret "^1.0.0" rechoir "^0.6.2" +shimmer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" + integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -22423,6 +23541,11 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +string-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + integrity sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw== + "string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -23145,6 +24268,15 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +thriftrw@^3.5.0: + version "3.11.4" + resolved "https://registry.yarnpkg.com/thriftrw/-/thriftrw-3.11.4.tgz#84c990ee89e926631c0b475909ada44ee9249870" + integrity sha512-UcuBd3eanB3T10nXWRRMwfwoaC6VMk7qe3/5YIWP2Jtw+EbHqJ0p1/K3x8ixiR5dozKSSfcg1W+0e33G1Di3XA== + dependencies: + bufrw "^1.2.1" + error "7.0.2" + long "^2.4.0" + through2@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.1.tgz#384e75314d49f32de12eebb8136b8eb6b5d59da9" @@ -26419,6 +27551,11 @@ xmlhttprequest@*, xmlhttprequest@1.8.0: resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== +xorshift@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/xorshift/-/xorshift-1.2.0.tgz#30a4cdd8e9f8d09d959ed2a88c42a09c660e8148" + integrity sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g== + xpath.js@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/xpath.js/-/xpath.js-1.1.0.tgz#3816a44ed4bb352091083d002a383dd5104a5ff1" From eb132e349bfaa7a3cbf9059a7582e566c7f0138f Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Wed, 16 Aug 2023 17:27:20 -0400 Subject: [PATCH 11/27] switch to local `authenticateUser` --- .../phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts b/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts index 6356db909f9..4183d21c93e 100644 --- a/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts +++ b/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts @@ -1,6 +1,5 @@ import { ContractKit } from '@celo/contractkit' import { - authenticateUser, CombinerEndpoint, ErrorType, getSignerEndpoint, @@ -23,6 +22,7 @@ import * as t from 'io-ts' import { IO } from '../../../common/io' import { Session } from '../../../common/session' import { getCombinerVersion, OdisConfig } from '../../../config' +import { authenticateUser } from '../../../utils/authentication' export class PnpQuotaIO extends IO { readonly endpoint: CombinerEndpoint = CombinerEndpoint.PNP_QUOTA From 5876c7faeb17a93c1d4cc4f6f7d2a63cf0fe5d25 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Wed, 16 Aug 2023 18:22:51 -0400 Subject: [PATCH 12/27] ++ primary key --- .../database/migrations/20230815120000_create_accounts_table.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/phone-number-privacy/combiner/src/database/migrations/20230815120000_create_accounts_table.ts b/packages/phone-number-privacy/combiner/src/database/migrations/20230815120000_create_accounts_table.ts index d55e5d37809..43eae57560c 100644 --- a/packages/phone-number-privacy/combiner/src/database/migrations/20230815120000_create_accounts_table.ts +++ b/packages/phone-number-privacy/combiner/src/database/migrations/20230815120000_create_accounts_table.ts @@ -8,6 +8,7 @@ export async function up(knex: Knex): Promise { t.dateTime(ACCOUNTS_COLUMNS.createdAt).notNullable() t.string(ACCOUNTS_COLUMNS.dek) t.dateTime(ACCOUNTS_COLUMNS.onChainDataLastUpdated) + t.primary([ACCOUNTS_COLUMNS.address, ACCOUNTS_COLUMNS.dek]) }) } return null From be9078ffb74667a93ea58fb67fc01da599942a8a Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Wed, 16 Aug 2023 18:32:26 -0400 Subject: [PATCH 13/27] lint --- packages/phone-number-privacy/combiner/package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/phone-number-privacy/combiner/package.json b/packages/phone-number-privacy/combiner/package.json index cc4c3c00273..bead1321a0b 100644 --- a/packages/phone-number-privacy/combiner/package.json +++ b/packages/phone-number-privacy/combiner/package.json @@ -22,7 +22,7 @@ "lint": "tslint --project .", "test": "jest --runInBand --testPathIgnorePatterns test/end-to-end", "test:coverage": "yarn test --coverage", - "test:integration": "jest --runInBand test/integration", + "test:integration": "jest --runInBand test/integration/pnp", "test:e2e": "jest test/end-to-end --verbose", "test:e2e:staging": "CONTEXT_NAME=staging yarn test:e2e", "test:e2e:alfajores": "CONTEXT_NAME=alfajores yarn test:e2e", @@ -56,7 +56,8 @@ "@types/supertest": "^2.0.12", "@types/uuid": "^7.0.3", "firebase-functions-test": "^3.1.0", - "firebase-tools": "12.4.7" + "firebase-tools": "12.4.7", + "sqlite3": "^5.0.8" }, "peerDependencies": { "@celo/phone-number-privacy-signer": "^3.0.0-dev" From 766060379b346f5d43597cc1ea04948b8434d9a1 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Wed, 16 Aug 2023 21:10:40 -0400 Subject: [PATCH 14/27] Revert "lint" This reverts commit be9078ffb74667a93ea58fb67fc01da599942a8a. --- packages/phone-number-privacy/combiner/package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/phone-number-privacy/combiner/package.json b/packages/phone-number-privacy/combiner/package.json index bead1321a0b..cc4c3c00273 100644 --- a/packages/phone-number-privacy/combiner/package.json +++ b/packages/phone-number-privacy/combiner/package.json @@ -22,7 +22,7 @@ "lint": "tslint --project .", "test": "jest --runInBand --testPathIgnorePatterns test/end-to-end", "test:coverage": "yarn test --coverage", - "test:integration": "jest --runInBand test/integration/pnp", + "test:integration": "jest --runInBand test/integration", "test:e2e": "jest test/end-to-end --verbose", "test:e2e:staging": "CONTEXT_NAME=staging yarn test:e2e", "test:e2e:alfajores": "CONTEXT_NAME=alfajores yarn test:e2e", @@ -56,8 +56,7 @@ "@types/supertest": "^2.0.12", "@types/uuid": "^7.0.3", "firebase-functions-test": "^3.1.0", - "firebase-tools": "12.4.7", - "sqlite3": "^5.0.8" + "firebase-tools": "12.4.7" }, "peerDependencies": { "@celo/phone-number-privacy-signer": "^3.0.0-dev" From 69879a3a3eef8a055b9e895ec9d7cdda0f153406 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Wed, 16 Aug 2023 21:11:17 -0400 Subject: [PATCH 15/27] lint fix --- .../phone-number-privacy/monitor/src/scripts/run-load-test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/phone-number-privacy/monitor/src/scripts/run-load-test.ts b/packages/phone-number-privacy/monitor/src/scripts/run-load-test.ts index c6aa374094d..6e38b697118 100644 --- a/packages/phone-number-privacy/monitor/src/scripts/run-load-test.ts +++ b/packages/phone-number-privacy/monitor/src/scripts/run-load-test.ts @@ -34,6 +34,7 @@ const runLoadTest = ( process.exit(1) } if (isSerial) { + // tslint:disable-next-line: no-floating-promises serialLoadTest( numWorker, blockchainProvider!, @@ -44,6 +45,7 @@ const runLoadTest = ( useDEK ) } else { + // tslint:disable-next-line: no-floating-promises concurrentLoadTest( numWorker, blockchainProvider!, @@ -56,6 +58,7 @@ const runLoadTest = ( } } +// tslint:disable-next-line: no-unused-expression yargs .scriptName('ODIS-load-test') .recommendCommands() From f97281b773f702a1065ebdff45743ecddb44be58 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Wed, 16 Aug 2023 21:34:00 -0400 Subject: [PATCH 16/27] more lint --- .../combiner/src/database/wrappers/account.ts | 2 +- .../phone-number-privacy/combiner/src/utils/authentication.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts b/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts index d1c6fd94da8..94d456caf8e 100644 --- a/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts +++ b/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts @@ -1,7 +1,7 @@ import { DB_TIMEOUT, ErrorMessage } from '@celo/phone-number-privacy-common' import Logger from 'bunyan' import { getDatabase, getTransaction } from '../database' -import { ACCOUNTS_COLUMNS, ACCOUNTS_TABLE, Account } from '../models/account' +import { Account, ACCOUNTS_COLUMNS, ACCOUNTS_TABLE } from '../models/account' function accounts() { return getDatabase()(ACCOUNTS_TABLE) diff --git a/packages/phone-number-privacy/combiner/src/utils/authentication.ts b/packages/phone-number-privacy/combiner/src/utils/authentication.ts index cde1d107051..0960df502b9 100644 --- a/packages/phone-number-privacy/combiner/src/utils/authentication.ts +++ b/packages/phone-number-privacy/combiner/src/utils/authentication.ts @@ -6,11 +6,11 @@ import { AuthenticationMethod, ErrorMessage, ErrorType, + fetchEnv, FULL_NODE_TIMEOUT_IN_MS, PhoneNumberPrivacyRequest, RETRY_COUNT, RETRY_DELAY_IN_MS, - fetchEnv, rootLogger, } from '@celo/phone-number-privacy-common' import { trimLeading0x } from '@celo/utils/lib/address' From 1676c9a25e14e6cca75ad340751793c6ab38a36b Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Thu, 17 Aug 2023 19:04:55 -0400 Subject: [PATCH 17/27] refactor to init db on combiner startup --- .../combiner/package.json | 1 + .../combiner/scripts/run-migrations.ts | 10 +- .../combiner/src/config.ts | 27 ++++- .../combiner/src/database/database.ts | 100 ++++++++++++++++-- .../combiner/src/database/wrappers/account.ts | 77 +++++++++----- .../combiner/src/index.ts | 13 ++- .../combiner/src/pnp/endpoints/quota/io.ts | 4 +- .../combiner/src/pnp/endpoints/sign/io.ts | 4 +- .../combiner/src/server.ts | 9 +- .../combiner/src/utils/authentication.ts | 15 ++- .../combiner/test/integration/domain.test.ts | 21 +++- .../combiner/test/integration/pnp.test.ts | 31 ++++-- 12 files changed, 240 insertions(+), 72 deletions(-) diff --git a/packages/phone-number-privacy/combiner/package.json b/packages/phone-number-privacy/combiner/package.json index cc4c3c00273..56b34162b9b 100644 --- a/packages/phone-number-privacy/combiner/package.json +++ b/packages/phone-number-privacy/combiner/package.json @@ -23,6 +23,7 @@ "test": "jest --runInBand --testPathIgnorePatterns test/end-to-end", "test:coverage": "yarn test --coverage", "test:integration": "jest --runInBand test/integration", + "test:integration:debugdb": "VERBOSE_DB_LOGGING=true jest --runInBand test/integration", "test:e2e": "jest test/end-to-end --verbose", "test:e2e:staging": "CONTEXT_NAME=staging yarn test:e2e", "test:e2e:alfajores": "CONTEXT_NAME=alfajores yarn test:e2e", diff --git a/packages/phone-number-privacy/combiner/scripts/run-migrations.ts b/packages/phone-number-privacy/combiner/scripts/run-migrations.ts index 9c88f04639c..72f965c7d8a 100644 --- a/packages/phone-number-privacy/combiner/scripts/run-migrations.ts +++ b/packages/phone-number-privacy/combiner/scripts/run-migrations.ts @@ -1,17 +1,11 @@ // tslint:disable: no-console // TODO de-dupe with signer script -import knex from 'knex' +import { initDatabase } from '../src/database/database' import config from '../src/config' async function start() { console.info('Running migrations') - await knex({ - client: 'pg', - connection: config.db, - }).migrate.latest({ - directory: './src/database/migrations', - extension: 'ts', - }) + await initDatabase(config, undefined, false) } start() diff --git a/packages/phone-number-privacy/combiner/src/config.ts b/packages/phone-number-privacy/combiner/src/config.ts index 7db806c1537..f8f141f1877 100644 --- a/packages/phone-number-privacy/combiner/src/config.ts +++ b/packages/phone-number-privacy/combiner/src/config.ts @@ -1,5 +1,6 @@ import { BlockchainConfig, + DB_TIMEOUT, FULL_NODE_TIMEOUT_IN_MS, RETRY_COUNT, RETRY_DELAY_IN_MS, @@ -13,6 +14,7 @@ export function getCombinerVersion(): string { } export const DEV_MODE = process.env.NODE_ENV !== 'production' || process.env.FUNCTIONS_EMULATOR === 'true' +export const VERBOSE_DB_LOGGING = toBool(process.env.VERBOSE_DB_LOGGING, false) export const FORNO_ALFAJORES = 'https://alfajores-forno.celo-testnet.org' @@ -25,6 +27,13 @@ export const MAX_BLOCK_DISCREPANCY_THRESHOLD = 3 export const MAX_TOTAL_QUOTA_DISCREPANCY_THRESHOLD = 5 export const MAX_QUERY_COUNT_DISCREPANCY_THRESHOLD = 5 +export enum SupportedDatabase { + Postgres = 'postgres', // PostgresSQL + MySql = 'mysql', // MySQL + MsSql = 'mssql', // Microsoft SQL Server + Sqlite = 'sqlite3', // SQLite (for testing) +} + export interface OdisConfig { serviceName: string enabled: boolean @@ -48,11 +57,15 @@ export interface CombinerConfig { phoneNumberPrivacy: OdisConfig domains: OdisConfig db: { + type: SupportedDatabase user: string password: string database: string host: string + port?: number ssl: boolean + poolMaxSize: number + timeout: number } } @@ -152,11 +165,15 @@ if (DEV_MODE) { fullNodeRetryDelayMs: RETRY_DELAY_IN_MS, }, db: { + type: SupportedDatabase.Sqlite, user: 'postgres', - password: 'fakePass', + password: '', database: 'phoneNumber+privacy', - host: '127.0.0.1', - ssl: false, + host: 'http://localhost', + port: undefined, + ssl: true, + poolMaxSize: 50, + timeout: DB_TIMEOUT, }, } } else { @@ -208,11 +225,15 @@ if (DEV_MODE) { ), }, db: { + type: functionConfig.db.type, user: functionConfig.db.username, password: functionConfig.db.pass, database: functionConfig.db.name, host: `/cloudsql/${functionConfig.db.host}`, + port: undefined, ssl: toBool(functionConfig.db.ssl, true), + poolMaxSize: Number(functionConfig.db.pool_max_size), + timeout: functionConfig.db.timeout, }, } } diff --git a/packages/phone-number-privacy/combiner/src/database/database.ts b/packages/phone-number-privacy/combiner/src/database/database.ts index 09189512344..88561a31152 100644 --- a/packages/phone-number-privacy/combiner/src/database/database.ts +++ b/packages/phone-number-privacy/combiner/src/database/database.ts @@ -1,16 +1,96 @@ -import knex from 'knex' -import config, { DEV_MODE } from '../config' +import { rootLogger } from '@celo/phone-number-privacy-common' +import Logger from 'bunyan' +import knex, { Knex } from 'knex' +import { CombinerConfig, DEV_MODE, SupportedDatabase, VERBOSE_DB_LOGGING } from '../config' +import { ACCOUNTS_COLUMNS, ACCOUNTS_TABLE } from './models/account' -const db = knex({ - client: 'pg', - connection: config.db, - debug: DEV_MODE, -}) +export async function initDatabase( + config: CombinerConfig, + migrationsPath?: string, + doTestQuery = true +): Promise { + const logger = rootLogger(config.serviceName) + logger.info({ config: config.db }, 'Initializing database connection') + const { type, host, port, user, password, database, ssl, poolMaxSize } = config.db -export function getDatabase() { + let connection: any + let client: string + if (type === SupportedDatabase.Postgres) { + logger.info('Using Postgres') + client = 'pg' + connection = { + user, + password, + database, + host, + port: port ?? 5432, + ssl, + pool: { max: poolMaxSize }, + } + } else if (type === SupportedDatabase.MySql) { + logger.info('Using MySql') + client = 'mysql2' + connection = { + user, + password, + database, + host, + port: port ?? 3306, + ssl, + pool: { max: poolMaxSize }, + } + } else if (type === SupportedDatabase.MsSql) { + logger.info('Using MS SQL') + client = 'mssql' + connection = { + user, + password, + database, + server: host, + port: port ?? 1433, + pool: { max: poolMaxSize }, + } + } else if (type === SupportedDatabase.Sqlite) { + logger.info('Using SQLite - combiner') + client = 'sqlite3' + connection = ':memory:' + } else { + throw new Error(`Unsupported database type: ${type}`) + } + const db = knex({ + client, + useNullAsDefault: type === SupportedDatabase.Sqlite, + connection, + debug: DEV_MODE && VERBOSE_DB_LOGGING, + }) + + logger.info('Running Migrations') + + await db.migrate.latest({ + directory: migrationsPath ?? './dist/database/migrations', + loadExtensions: ['.js'], + }) + + if (doTestQuery) { + await executeTestQuery(db, logger) + } + + logger.info('Database initialized successfully') return db } -export function getTransaction() { - return db.transaction() +async function executeTestQuery(db: Knex, logger: Logger) { + logger.info('Counting accounts') + const result = await db(ACCOUNTS_TABLE).count(ACCOUNTS_COLUMNS.address).first() + + if (!result) { + throw new Error('No result from count, have migrations been run?') + } + + const count = Object.values(result)[0] + if (count === undefined || count === null || count === '') { + throw new Error('No result from count, have migrations been run?') + } + + logger.info(`Found ${count} accounts`) } diff --git a/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts b/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts index 94d456caf8e..a003329e28d 100644 --- a/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts +++ b/packages/phone-number-privacy/combiner/src/database/wrappers/account.ts @@ -1,25 +1,28 @@ import { DB_TIMEOUT, ErrorMessage } from '@celo/phone-number-privacy-common' import Logger from 'bunyan' -import { getDatabase, getTransaction } from '../database' +import { Knex } from 'knex' import { Account, ACCOUNTS_COLUMNS, ACCOUNTS_TABLE } from '../models/account' -function accounts() { - return getDatabase()(ACCOUNTS_TABLE) +function accounts(db: Knex) { + return db(ACCOUNTS_TABLE) } /* * Get DEK signer record from DB. */ export async function getDekSignerRecord( + db: Knex, account: string, logger: Logger ): Promise { try { - const dekSignerRecord = await accounts() + logger.info('getting Dek Signer Record') + const dekSignerRecord = await accounts(db) .where(ACCOUNTS_COLUMNS.address, account) .select(ACCOUNTS_COLUMNS.dek) .first() .timeout(DB_TIMEOUT) + return dekSignerRecord ? dekSignerRecord[ACCOUNTS_COLUMNS.dek] : undefined } catch (err) { logger.error(ErrorMessage.DATABASE_GET_FAILURE) @@ -28,27 +31,49 @@ export async function getDekSignerRecord( } } -export async function updateDekSignerRecord(account: string, newDek: string, logger: Logger) { - const trx = await getTransaction() - const accountTxBase = () => - accounts().transacting(trx).timeout(DB_TIMEOUT).where(ACCOUNTS_COLUMNS.address, account) +export async function updateDekSignerRecord( + db: Knex, + account: string, + newDek: string, + logger: Logger, + trx: Knex.Transaction +) { + logger.info(`updating Dek Signer Record`) + if (await getAccountExist(db, account, trx)) { + await accounts(db) + .transacting(trx) + .timeout(DB_TIMEOUT) + .where(ACCOUNTS_COLUMNS.address, account) + .update({ [ACCOUNTS_COLUMNS.dek]: newDek }) + await accounts(db) + .transacting(trx) + .timeout(DB_TIMEOUT) + .where(ACCOUNTS_COLUMNS.address, account) + .update({ [ACCOUNTS_COLUMNS.onChainDataLastUpdated]: new Date() }) + } else { + // account does not exists + const newAccount = new Account(account, newDek) + await accounts(db).transacting(trx).timeout(DB_TIMEOUT).insert(newAccount) + } +} + +export function tableWithLockForTrx(baseQuery: Knex.QueryBuilder, trx?: Knex.Transaction) { + if (trx) { + // Lock relevant database rows for the duration of the transaction + return baseQuery.transacting(trx).forUpdate() + } + return baseQuery +} + +async function getAccountExist( + db: Knex, + account: string, + trx?: Knex.Transaction +): Promise { + const accountRecord = await tableWithLockForTrx(accounts(db), trx) + .where(ACCOUNTS_COLUMNS.address, account) + .first() + .timeout(DB_TIMEOUT) - accountTxBase() - .then(async (res) => { - if (res.length) { - // if account exist - await accountTxBase().update({ [ACCOUNTS_COLUMNS.dek]: newDek }) - await accountTxBase().update({ [ACCOUNTS_COLUMNS.onChainDataLastUpdated]: new Date() }) - } else { - // account does not exits - const newAccount = new Account(account, newDek) - await accounts().transacting(trx).timeout(DB_TIMEOUT).insert(newAccount) - } - trx.commit() - }) - .catch((err) => { - logger.error(ErrorMessage.DATABASE_UPDATE_FAILURE) - logger.error(err) - trx.rollback() - }) + return !!accountRecord } diff --git a/packages/phone-number-privacy/combiner/src/index.ts b/packages/phone-number-privacy/combiner/src/index.ts index def19e58b58..b831a5f9f1b 100644 --- a/packages/phone-number-privacy/combiner/src/index.ts +++ b/packages/phone-number-privacy/combiner/src/index.ts @@ -1,6 +1,8 @@ import { getContractKit } from '@celo/phone-number-privacy-common' import * as functions from 'firebase-functions' +import { Knex } from 'knex' import config from './config' +import { initDatabase } from './database/database' import { startCombiner } from './server' require('dotenv').config() @@ -12,5 +14,14 @@ export const combiner = functions // Defined check required for running tests vs. deployment minInstances: functions.config().service ? Number(functions.config().service.min_instances) : 0, }) - .https.onRequest(startCombiner(config, getContractKit(config.blockchain))) + .https.onRequest(async (req, res) => { + try { + const db: Knex = await initDatabase(config) + const app = startCombiner(db, config, getContractKit(config.blockchain)) + + app(req, res) + } catch (e) { + res.status(500).send('Internal Server Error') + } + }) export * from './config' diff --git a/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts b/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts index 4183d21c93e..627fcd4a001 100644 --- a/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts +++ b/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts @@ -19,6 +19,7 @@ import { import Logger from 'bunyan' import { Request, Response } from 'express' import * as t from 'io-ts' +import { Knex } from 'knex' import { IO } from '../../../common/io' import { Session } from '../../../common/session' import { getCombinerVersion, OdisConfig } from '../../../config' @@ -31,7 +32,7 @@ export class PnpQuotaIO extends IO { readonly responseSchema: t.Type = PnpQuotaResponseSchema - constructor(readonly config: OdisConfig, readonly kit: ContractKit) { + constructor(readonly db: Knex, readonly config: OdisConfig, readonly kit: ContractKit) { super(config) } @@ -62,6 +63,7 @@ export class PnpQuotaIO extends IO { async authenticate(request: Request<{}, {}, PnpQuotaRequest>, logger: Logger): Promise { return authenticateUser( + this.db, request, this.kit, logger, diff --git a/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/io.ts b/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/io.ts index 71a74f3fd79..dd58ecf8dea 100644 --- a/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/io.ts +++ b/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/io.ts @@ -20,6 +20,7 @@ import { import Logger from 'bunyan' import { Request, Response } from 'express' import * as t from 'io-ts' +import { Knex } from 'knex' import { BLSCryptographyClient } from '../../../common/crypto-clients/bls-crypto-client' import { CryptoSession } from '../../../common/crypto-session' import { IO } from '../../../common/io' @@ -35,7 +36,7 @@ export class PnpSignIO extends IO { readonly responseSchema: t.Type = SignMessageResponseSchema - constructor(readonly config: OdisConfig, readonly kit: ContractKit) { + constructor(readonly db: Knex, readonly config: OdisConfig, readonly kit: ContractKit) { super(config) } @@ -79,6 +80,7 @@ export class PnpSignIO extends IO { logger: Logger ): Promise { return authenticateUser( + this.db, request, this.kit, logger, diff --git a/packages/phone-number-privacy/combiner/src/server.ts b/packages/phone-number-privacy/combiner/src/server.ts index e5360d9eaea..cfef406778a 100644 --- a/packages/phone-number-privacy/combiner/src/server.ts +++ b/packages/phone-number-privacy/combiner/src/server.ts @@ -8,7 +8,8 @@ import { rootLogger, } from '@celo/phone-number-privacy-common' import Logger from 'bunyan' -import express, { Request, RequestHandler, Response } from 'express' +import express, { Express, Request, RequestHandler, Response } from 'express' +import { Knex } from 'knex' // tslint:disable-next-line: ordered-imports import { PerformanceObserver, performance } from 'perf_hooks' import { Controller } from './common/controller' @@ -28,7 +29,7 @@ import { PnpThresholdStateService } from './pnp/services/threshold-state' require('events').EventEmitter.defaultMaxListeners = 15 -export function startCombiner(config: CombinerConfig, kit: ContractKit) { +export function startCombiner(db: Knex, config: CombinerConfig, kit: ContractKit): Express { const logger = rootLogger(config.serviceName) logger.info('Creating combiner express server') @@ -64,7 +65,7 @@ export function startCombiner(config: CombinerConfig, kit: ContractKit) { new PnpQuotaAction( config.phoneNumberPrivacy, pnpThresholdStateService, - new PnpQuotaIO(config.phoneNumberPrivacy, kit) + new PnpQuotaIO(db, config.phoneNumberPrivacy, kit) ) ) app.post(CombinerEndpoint.PNP_QUOTA, (req, res) => @@ -75,7 +76,7 @@ export function startCombiner(config: CombinerConfig, kit: ContractKit) { new PnpSignAction( config.phoneNumberPrivacy, pnpThresholdStateService, - new PnpSignIO(config.phoneNumberPrivacy, kit) + new PnpSignIO(db, config.phoneNumberPrivacy, kit) ) ) app.post(CombinerEndpoint.PNP_SIGN, (req, res) => diff --git a/packages/phone-number-privacy/combiner/src/utils/authentication.ts b/packages/phone-number-privacy/combiner/src/utils/authentication.ts index 0960df502b9..407119bdadc 100644 --- a/packages/phone-number-privacy/combiner/src/utils/authentication.ts +++ b/packages/phone-number-privacy/combiner/src/utils/authentication.ts @@ -18,6 +18,7 @@ import { verifySignature } from '@celo/utils/lib/signatureUtils' import Logger from 'bunyan' import crypto from 'crypto' import { Request } from 'express' +import { Knex } from 'knex' import { getDekSignerRecord, updateDekSignerRecord } from '../database/wrappers/account' /* @@ -25,6 +26,7 @@ import { getDekSignerRecord, updateDekSignerRecord } from '../database/wrappers/ * Authorization header should contain the EC signed body */ export async function authenticateUser( + db: Knex, request: Request<{}, {}, R>, contractKit: ContractKit, logger: Logger, @@ -49,9 +51,7 @@ export async function authenticateUser( if (authMethod && authMethod === AuthenticationMethod.ENCRYPTION_KEY) { let registeredEncryptionKey: string | undefined - // XXX (soloseng): lookup in db first - - registeredEncryptionKey = await getDekSignerRecord(signer, logger) + registeredEncryptionKey = await getDekSignerRecord(db, signer, logger) if (registeredEncryptionKey) { logger.info({ dek: registeredEncryptionKey, account: signer }, 'Found DEK for account in db') @@ -61,8 +61,6 @@ export async function authenticateUser( logger.warn({ account: signer }, 'Failed to verify account DEK signature found in db.') } - // XXX: if does not exist or failed to verify, fetch onchain. - try { registeredEncryptionKey = await getDataEncryptionKey( signer, @@ -90,10 +88,9 @@ export async function authenticateUser( } else { logger.info({ dek: registeredEncryptionKey, account: signer }, 'Found DEK for account') if (verifyDEKSignature(message, messageSignature, registeredEncryptionKey, logger)) { - // XXX: once found, update db with DEK. - - await updateDekSignerRecord(signer, registeredEncryptionKey!, logger) - + await db.transaction(async (trx) => { + await updateDekSignerRecord(db, signer, registeredEncryptionKey!, logger, trx) + }) return true } } diff --git a/packages/phone-number-privacy/combiner/test/integration/domain.test.ts b/packages/phone-number-privacy/combiner/test/integration/domain.test.ts index d58a4aeade1..68366eb80d8 100644 --- a/packages/phone-number-privacy/combiner/test/integration/domain.test.ts +++ b/packages/phone-number-privacy/combiner/test/integration/domain.test.ts @@ -47,6 +47,7 @@ import request from 'supertest' import { MockKeyProvider } from '../../../signer/dist/common/key-management/mock-key-provider' import config from '../../src/config' import { startCombiner } from '../../src/server' +import { initDatabase as initCombinerDatabase } from '../../src/database/database' const { DOMAINS_THRESHOLD_DEV_PK_SHARE_1_V1, @@ -236,6 +237,7 @@ describe('domainService', () => { let signer2: Server | HttpsServer let signer3: Server | HttpsServer let app: any + let db: Knex const signerMigrationsPath = '../signer/dist/common/database/migrations' @@ -269,8 +271,8 @@ describe('domainService', () => { [`${DefaultKeyName.DOMAINS}-3`, DOMAINS_THRESHOLD_DEV_PK_SHARE_3_V3], ]) ) - - app = startCombiner(combinerConfig, getContractKit(combinerConfig.blockchain)) + db = await initCombinerDatabase(combinerConfig) + app = startCombiner(db, combinerConfig, getContractKit(combinerConfig.blockchain)) }) beforeEach(async () => { @@ -288,6 +290,10 @@ describe('domainService', () => { signer3?.close() }) + afterAll(async () => { + await db?.destroy() + }) + describe('when signers are operating correctly', () => { beforeEach(async () => { signer1 = startSigner(signerConfig, signerDB1, keyProvider1).listen(3001) @@ -417,6 +423,7 @@ describe('domainService', () => { ) configWithApiDisabled.domains.enabled = false const appWithApiDisabled = startCombiner( + db, configWithApiDisabled, getContractKit(configWithApiDisabled.blockchain) ) @@ -566,6 +573,7 @@ describe('domainService', () => { ) configWithApiDisabled.domains.enabled = false const appWithApiDisabled = startCombiner( + db, configWithApiDisabled, getContractKit(configWithApiDisabled.blockchain) ) @@ -896,6 +904,7 @@ describe('domainService', () => { ) configWithApiDisabled.domains.enabled = false const appWithApiDisabled = startCombiner( + db, configWithApiDisabled, getContractKit(configWithApiDisabled.blockchain) ) @@ -1218,7 +1227,11 @@ describe('domainService', () => { ], ]) ) - app = startCombiner(combinerConfigLargerN, getContractKit(combinerConfigLargerN.blockchain)) + app = startCombiner( + db, + combinerConfigLargerN, + getContractKit(combinerConfigLargerN.blockchain) + ) }) beforeEach(async () => { @@ -1241,6 +1254,8 @@ describe('domainService', () => { await signerDB3?.destroy() await signerDB4?.destroy() await signerDB5?.destroy() + await db?.destroy() + signer1?.close() signer2?.close() signer3?.close() diff --git a/packages/phone-number-privacy/combiner/test/integration/pnp.test.ts b/packages/phone-number-privacy/combiner/test/integration/pnp.test.ts index 473938ab77c..deb4ef5d433 100644 --- a/packages/phone-number-privacy/combiner/test/integration/pnp.test.ts +++ b/packages/phone-number-privacy/combiner/test/integration/pnp.test.ts @@ -40,6 +40,7 @@ import request from 'supertest' import config, { getCombinerVersion } from '../../src/config' import { startCombiner } from '../../src/server' import { getBlindedPhoneNumber } from '../utils' +import { initDatabase as initCombinerDatabase } from '../../src/database/database' const { ContractRetrieval, @@ -189,6 +190,7 @@ describe('pnpService', () => { let signer2: Server | HttpsServer let signer3: Server | HttpsServer let app: any + let db: Knex // Used by PNP_SIGN tests for various configurations of signers let userSeed: Uint8Array @@ -295,7 +297,8 @@ describe('pnpService', () => { [`${DefaultKeyName.PHONE_NUMBER_PRIVACY}-3`, PNP_THRESHOLD_DEV_PK_SHARE_3_V3], ]) ) - app = startCombiner(combinerConfig, mockKit) + db = await initCombinerDatabase(combinerConfig) + app = startCombiner(db, combinerConfig, mockKit) }) beforeEach(async () => { @@ -318,9 +321,15 @@ describe('pnpService', () => { await signerDB1?.destroy() await signerDB2?.destroy() await signerDB3?.destroy() + signer1?.close() signer2?.close() signer3?.close() + signer3?.close() + }) + + afterAll(async () => { + await db?.destroy() }) describe('when signers are operating correctly', () => { @@ -589,7 +598,7 @@ describe('pnpService', () => { JSON.stringify(combinerConfig) ) configWithApiDisabled.phoneNumberPrivacy.enabled = false - const appWithApiDisabled = startCombiner(configWithApiDisabled, mockKit) + const appWithApiDisabled = startCombiner(db, configWithApiDisabled, mockKit) const req = { account: ACCOUNT_ADDRESS1, } @@ -625,7 +634,11 @@ describe('pnpService', () => { JSON.stringify(combinerConfig) ) combinerConfigWithFailOpenEnabled.phoneNumberPrivacy.shouldFailOpen = true - const appWithFailOpenEnabled = startCombiner(combinerConfigWithFailOpenEnabled, mockKit) + const appWithFailOpenEnabled = startCombiner( + db, + combinerConfigWithFailOpenEnabled, + mockKit + ) const res = await getCombinerQuotaResponse(req, authorization, appWithFailOpenEnabled) expect(res.status).toBe(200) @@ -914,7 +927,7 @@ describe('pnpService', () => { JSON.stringify(combinerConfig) ) configWithApiDisabled.phoneNumberPrivacy.enabled = false - const appWithApiDisabled = startCombiner(configWithApiDisabled, mockKit) + const appWithApiDisabled = startCombiner(db, configWithApiDisabled, mockKit) const authorization = getPnpRequestAuthorization(req, PRIVATE_KEY1) const res = await sendPnpSignRequest(req, authorization, appWithApiDisabled) @@ -942,7 +955,11 @@ describe('pnpService', () => { JSON.stringify(combinerConfig) ) combinerConfigWithFailOpenEnabled.phoneNumberPrivacy.shouldFailOpen = true - const appWithFailOpenEnabled = startCombiner(combinerConfigWithFailOpenEnabled, mockKit) + const appWithFailOpenEnabled = startCombiner( + db, + combinerConfigWithFailOpenEnabled, + mockKit + ) const res = await sendPnpSignRequest(req, authorization, appWithFailOpenEnabled) expect(res.status).toBe(200) @@ -975,6 +992,7 @@ describe('pnpService', () => { ) combinerConfigWithFailOpenDisabled.phoneNumberPrivacy.shouldFailOpen = false const appWithFailOpenDisabled = startCombiner( + db, combinerConfigWithFailOpenDisabled, mockKit ) @@ -1301,7 +1319,8 @@ describe('pnpService', () => { ], ]) ) - app = startCombiner(combinerConfigLargerN, mockKit) + db = await initCombinerDatabase(combinerConfig) + app = startCombiner(db, combinerConfigLargerN, mockKit) }) let req: SignMessageRequest From c1df45ecab910602ca005598617cc50fbcc9c175 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Thu, 17 Aug 2023 19:10:39 -0400 Subject: [PATCH 18/27] misc cleanup --- packages/phone-number-privacy/combiner/src/common/combine.ts | 1 - packages/phone-number-privacy/combiner/src/config.ts | 2 +- .../phone-number-privacy/combiner/src/utils/authentication.ts | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/phone-number-privacy/combiner/src/common/combine.ts b/packages/phone-number-privacy/combiner/src/common/combine.ts index 26c6f1b91ea..66350cfd32b 100644 --- a/packages/phone-number-privacy/combiner/src/common/combine.ts +++ b/packages/phone-number-privacy/combiner/src/common/combine.ts @@ -25,7 +25,6 @@ export abstract class CombineAction implements Action abstract combine(session: Session): void async perform(session: Session) { - // TODO (soloseng): check if request already exist in db await this.distribute(session) this.combine(session) } diff --git a/packages/phone-number-privacy/combiner/src/config.ts b/packages/phone-number-privacy/combiner/src/config.ts index f8f141f1877..2df69455837 100644 --- a/packages/phone-number-privacy/combiner/src/config.ts +++ b/packages/phone-number-privacy/combiner/src/config.ts @@ -233,7 +233,7 @@ if (DEV_MODE) { port: undefined, ssl: toBool(functionConfig.db.ssl, true), poolMaxSize: Number(functionConfig.db.pool_max_size), - timeout: functionConfig.db.timeout, + timeout: Number(functionConfig.db.timeout), }, } } diff --git a/packages/phone-number-privacy/combiner/src/utils/authentication.ts b/packages/phone-number-privacy/combiner/src/utils/authentication.ts index 407119bdadc..bc884b995b2 100644 --- a/packages/phone-number-privacy/combiner/src/utils/authentication.ts +++ b/packages/phone-number-privacy/combiner/src/utils/authentication.ts @@ -148,8 +148,8 @@ export function verifyDEKSignature( } return false } catch (err) { - logger.error('Failed to verify signature with DEK') - logger.error({ err, dek: registeredEncryptionKey }) + logger?.error('Failed to verify signature with DEK') + logger?.error({ err, dek: registeredEncryptionKey }) return false } } From 049944935214ae76258c6fe4a8097834ffab7ba6 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Thu, 17 Aug 2023 22:03:39 -0400 Subject: [PATCH 19/27] removed user from db --- packages/phone-number-privacy/combiner/src/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/phone-number-privacy/combiner/src/config.ts b/packages/phone-number-privacy/combiner/src/config.ts index 2df69455837..bff9df22c19 100644 --- a/packages/phone-number-privacy/combiner/src/config.ts +++ b/packages/phone-number-privacy/combiner/src/config.ts @@ -166,7 +166,7 @@ if (DEV_MODE) { }, db: { type: SupportedDatabase.Sqlite, - user: 'postgres', + user: '', password: '', database: 'phoneNumber+privacy', host: 'http://localhost', From a6cc3430f9baaecb3b33f0849a28f9d5cfcd7a27 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Fri, 18 Aug 2023 10:38:30 -0400 Subject: [PATCH 20/27] fixed hanging combiner tests --- .../combiner/test/integration/domain.test.ts | 17 +++++++++-------- .../combiner/test/integration/pnp.test.ts | 17 ++++++++++------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/packages/phone-number-privacy/combiner/test/integration/domain.test.ts b/packages/phone-number-privacy/combiner/test/integration/domain.test.ts index 68366eb80d8..8144465e820 100644 --- a/packages/phone-number-privacy/combiner/test/integration/domain.test.ts +++ b/packages/phone-number-privacy/combiner/test/integration/domain.test.ts @@ -271,11 +271,12 @@ describe('domainService', () => { [`${DefaultKeyName.DOMAINS}-3`, DOMAINS_THRESHOLD_DEV_PK_SHARE_3_V3], ]) ) - db = await initCombinerDatabase(combinerConfig) - app = startCombiner(db, combinerConfig, getContractKit(combinerConfig.blockchain)) }) beforeEach(async () => { + db = await initCombinerDatabase(combinerConfig) + app = startCombiner(db, combinerConfig, getContractKit(combinerConfig.blockchain)) + signerDB1 = await initSignerDatabase(signerConfig, signerMigrationsPath) signerDB2 = await initSignerDatabase(signerConfig, signerMigrationsPath) signerDB3 = await initSignerDatabase(signerConfig, signerMigrationsPath) @@ -285,15 +286,13 @@ describe('domainService', () => { await signerDB1?.destroy() await signerDB2?.destroy() await signerDB3?.destroy() + await db?.destroy() + signer1?.close() signer2?.close() signer3?.close() }) - afterAll(async () => { - await db?.destroy() - }) - describe('when signers are operating correctly', () => { beforeEach(async () => { signer1 = startSigner(signerConfig, signerDB1, keyProvider1).listen(3001) @@ -1227,14 +1226,16 @@ describe('domainService', () => { ], ]) ) + }) + + beforeEach(async () => { + db = await initCombinerDatabase(combinerConfig) app = startCombiner( db, combinerConfigLargerN, getContractKit(combinerConfigLargerN.blockchain) ) - }) - beforeEach(async () => { signerDB1 = await initSignerDatabase(signerConfig, signerMigrationsPath) signerDB2 = await initSignerDatabase(signerConfig, signerMigrationsPath) signerDB3 = await initSignerDatabase(signerConfig, signerMigrationsPath) diff --git a/packages/phone-number-privacy/combiner/test/integration/pnp.test.ts b/packages/phone-number-privacy/combiner/test/integration/pnp.test.ts index deb4ef5d433..07c112d2bf2 100644 --- a/packages/phone-number-privacy/combiner/test/integration/pnp.test.ts +++ b/packages/phone-number-privacy/combiner/test/integration/pnp.test.ts @@ -297,11 +297,11 @@ describe('pnpService', () => { [`${DefaultKeyName.PHONE_NUMBER_PRIVACY}-3`, PNP_THRESHOLD_DEV_PK_SHARE_3_V3], ]) ) - db = await initCombinerDatabase(combinerConfig) - app = startCombiner(db, combinerConfig, mockKit) }) beforeEach(async () => { + db = await initCombinerDatabase(combinerConfig) + app = startCombiner(db, combinerConfig, mockKit) signerDB1 = await initSignerDatabase(signerConfig, signerMigrationsPath) signerDB2 = await initSignerDatabase(signerConfig, signerMigrationsPath) signerDB3 = await initSignerDatabase(signerConfig, signerMigrationsPath) @@ -321,6 +321,7 @@ describe('pnpService', () => { await signerDB1?.destroy() await signerDB2?.destroy() await signerDB3?.destroy() + await db?.destroy() signer1?.close() signer2?.close() @@ -328,9 +329,9 @@ describe('pnpService', () => { signer3?.close() }) - afterAll(async () => { - await db?.destroy() - }) + // afterAll(async () => { + // await db?.destroy() + // }) describe('when signers are operating correctly', () => { beforeEach(async () => { @@ -1319,13 +1320,14 @@ describe('pnpService', () => { ], ]) ) - db = await initCombinerDatabase(combinerConfig) - app = startCombiner(db, combinerConfigLargerN, mockKit) }) let req: SignMessageRequest beforeEach(async () => { + db = await initCombinerDatabase(combinerConfig) + app = startCombiner(db, combinerConfigLargerN, mockKit) + signerDB1 = await initSignerDatabase(signerConfig, signerMigrationsPath) signerDB2 = await initSignerDatabase(signerConfig, signerMigrationsPath) signerDB3 = await initSignerDatabase(signerConfig, signerMigrationsPath) @@ -1353,6 +1355,7 @@ describe('pnpService', () => { await signerDB3?.destroy() await signerDB4?.destroy() await signerDB5?.destroy() + await db?.destroy() signer1?.close() signer2?.close() signer3?.close() From c8a6a355dac5608294230337e96efb78e0e8c37b Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Sat, 19 Aug 2023 18:43:50 -0400 Subject: [PATCH 21/27] init request db commit --- .../combiner/src/common/io.ts | 3 +- .../20230819120000_create_request_table.ts | 20 +++++++ .../combiner/src/database/models/request.ts | 29 ++++++++++ .../combiner/src/database/wrappers/request.ts | 54 +++++++++++++++++++ .../combiner/src/pnp/endpoints/quota/io.ts | 2 +- .../combiner/src/pnp/endpoints/sign/action.ts | 43 ++++++++++++++- .../combiner/src/pnp/endpoints/sign/io.ts | 2 +- .../combiner/src/utils/utils.ts | 9 ++++ 8 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 packages/phone-number-privacy/combiner/src/database/migrations/20230819120000_create_request_table.ts create mode 100644 packages/phone-number-privacy/combiner/src/database/models/request.ts create mode 100644 packages/phone-number-privacy/combiner/src/database/wrappers/request.ts create mode 100644 packages/phone-number-privacy/combiner/src/utils/utils.ts diff --git a/packages/phone-number-privacy/combiner/src/common/io.ts b/packages/phone-number-privacy/combiner/src/common/io.ts index 89545648e2f..c97ddd128bc 100644 --- a/packages/phone-number-privacy/combiner/src/common/io.ts +++ b/packages/phone-number-privacy/combiner/src/common/io.ts @@ -16,6 +16,7 @@ import { import Logger from 'bunyan' import { Request, Response } from 'express' import * as t from 'io-ts' +import { Knex } from 'knex' import fetch, { Response as FetchResponse } from 'node-fetch' import { performance } from 'perf_hooks' import { OdisConfig } from '../config' @@ -35,7 +36,7 @@ export abstract class IO { abstract readonly requestSchema: t.Type abstract readonly responseSchema: t.Type, OdisResponse, unknown> - constructor(readonly config: OdisConfig) {} + constructor(readonly config: OdisConfig, readonly db?: Knex) {} abstract init( request: Request<{}, {}, unknown>, diff --git a/packages/phone-number-privacy/combiner/src/database/migrations/20230819120000_create_request_table.ts b/packages/phone-number-privacy/combiner/src/database/migrations/20230819120000_create_request_table.ts new file mode 100644 index 00000000000..46e4e9feb29 --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/database/migrations/20230819120000_create_request_table.ts @@ -0,0 +1,20 @@ +import { Knex } from 'knex' +import { REQUESTS_COLUMNS, REQUESTS_TABLE } from '../models/request' + +export async function up(knex: Knex): Promise { + // This check was necessary to switch from using .ts migrations to .js migrations. + if (!(await knex.schema.hasTable(REQUESTS_TABLE))) { + return knex.schema.createTable(REQUESTS_TABLE, (t) => { + t.string(REQUESTS_COLUMNS.address).notNullable() + t.dateTime(REQUESTS_COLUMNS.timestamp).notNullable() + t.string(REQUESTS_COLUMNS.blindedQuery).notNullable() + t.string(REQUESTS_COLUMNS.combinedSignature).notNullable() + t.primary([REQUESTS_COLUMNS.address, REQUESTS_COLUMNS.blindedQuery]) + }) + } + return null +} + +export async function down(knex: Knex): Promise { + return knex.schema.dropTable(REQUESTS_TABLE) +} diff --git a/packages/phone-number-privacy/combiner/src/database/models/request.ts b/packages/phone-number-privacy/combiner/src/database/models/request.ts new file mode 100644 index 00000000000..c58c4edb9ef --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/database/models/request.ts @@ -0,0 +1,29 @@ +export const REQUESTS_TABLE = 'requests' + +export enum REQUESTS_COLUMNS { + address = 'caller_address', + timestamp = 'timestamp', + blindedQuery = 'blinded_query', + combinedSignature = 'combined_signature', + //TODO (soloseng): add session response too? +} + +export interface PnpSignRequestRecord { + [REQUESTS_COLUMNS.address]: string + [REQUESTS_COLUMNS.timestamp]: Date + [REQUESTS_COLUMNS.blindedQuery]: string + [REQUESTS_COLUMNS.combinedSignature]: string +} + +export function toPnpSignRequestRecord( + account: string, + blindedQuery: string, + combinedSignature: string +): PnpSignRequestRecord { + return { + [REQUESTS_COLUMNS.address]: account, + [REQUESTS_COLUMNS.timestamp]: new Date(), + [REQUESTS_COLUMNS.blindedQuery]: blindedQuery, + [REQUESTS_COLUMNS.combinedSignature]: combinedSignature, + } +} diff --git a/packages/phone-number-privacy/combiner/src/database/wrappers/request.ts b/packages/phone-number-privacy/combiner/src/database/wrappers/request.ts new file mode 100644 index 00000000000..47f272e5cf5 --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/database/wrappers/request.ts @@ -0,0 +1,54 @@ +import Logger from 'bunyan' +import { Knex } from 'knex' +import config from '../../config' +import { tableWithLockForTrx } from '../../utils/utils' +import { + PnpSignRequestRecord, + REQUESTS_COLUMNS, + REQUESTS_TABLE, + toPnpSignRequestRecord, +} from '../models/request' + +function requests(db: Knex) { + return db(REQUESTS_TABLE) +} + +// TODO (soloseng): should return the response associated to this request. +export async function getCombinedSignatureIfRequestExists( + db: Knex, + account: string, + blindedQuery: string, + // logger: Logger, + trx?: Knex.Transaction +): Promise { + // logger.debug(`Checking if request exists for account: ${account}, blindedQuery: ${blindedQuery}`) + const existingRequest = await tableWithLockForTrx(requests(db), trx) + .where({ + [REQUESTS_COLUMNS.address]: account, + [REQUESTS_COLUMNS.blindedQuery]: blindedQuery, + }) + .first() + .timeout(config.db.timeout) + + if (existingRequest) { + return existingRequest[REQUESTS_COLUMNS.combinedSignature] + } + return null +} + +export async function storeRequest( + db: Knex, + account: string, + blindedQuery: string, + combinedSignature: string, + logger?: Logger, //revert the `?` + trx?: Knex.Transaction //revert the `?` +): Promise { + logger!.debug( + `Storing salt request for: ${account}, blindedQuery: ${blindedQuery} with combinedSignature: ${combinedSignature}` + ) + await requests(db) + .transacting(trx!) + .insert(toPnpSignRequestRecord(account, blindedQuery, combinedSignature)) + .timeout(config.db.timeout) +} diff --git a/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts b/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts index 627fcd4a001..5adb23b026a 100644 --- a/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts +++ b/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/io.ts @@ -33,7 +33,7 @@ export class PnpQuotaIO extends IO { PnpQuotaResponseSchema constructor(readonly db: Knex, readonly config: OdisConfig, readonly kit: ContractKit) { - super(config) + super(config, db) } async init( diff --git a/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/action.ts b/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/action.ts index e75ddb8e727..2aac9d317b2 100644 --- a/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/action.ts +++ b/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/action.ts @@ -5,13 +5,46 @@ import { WarningMessage, } from '@celo/phone-number-privacy-common' import { CryptoSession } from '../../../common/crypto-session' + import { SignAction } from '../../../common/sign' +import { + getCombinedSignatureIfRequestExists, + storeRequest, +} from '../../../database/wrappers/request' import { PnpSignerResponseLogger } from '../../services/log-responses' export class PnpSignAction extends SignAction { readonly responseLogger: PnpSignerResponseLogger = new PnpSignerResponseLogger() - combine(session: CryptoSession): void { + async perform(session: CryptoSession) { + //TODO (soloseng): check db for existing request and return combined signature if it exist. + + const signMessageRequest: SignMessageRequest = session.request.body + const existingCombinedSignature = await getCombinedSignatureIfRequestExists( + this.io.db!, + signMessageRequest.account, + signMessageRequest.blindedQueryPhoneNumber + ) + if (existingCombinedSignature) { + const quotaStatus = this.thresholdStateService.findCombinerQuotaState(session) + + // XXX (soloseng): should the session response be stored as well? + // session.responses.push({ url, res: signerResponse, status }) + + return this.io.sendSuccess( + 200, + session.response, //TODO (soloseng): should this be from the original response? + existingCombinedSignature, + quotaStatus, + session.warnings + ) + } else { + await this.distribute(session) + await this.combine(session) + } + } + + async combine(session: CryptoSession): Promise { this.responseLogger.logResponseDiscrepancies(session) this.responseLogger.logFailOpenResponses(session) @@ -21,6 +54,14 @@ export class PnpSignAction extends SignAction { this.parseBlindedMessage(session.request.body), session.logger ) + // TODO (soloseng): store validated request + const signMessageRequest: SignMessageRequest = session.request.body + await storeRequest( + this.io.db!, + signMessageRequest.account, + signMessageRequest.blindedQueryPhoneNumber, + combinedSignature + ) const quotaStatus = this.thresholdStateService.findCombinerQuotaState(session) return this.io.sendSuccess( diff --git a/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/io.ts b/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/io.ts index dd58ecf8dea..4db0ee63bcc 100644 --- a/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/io.ts +++ b/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/io.ts @@ -37,7 +37,7 @@ export class PnpSignIO extends IO { SignMessageResponseSchema constructor(readonly db: Knex, readonly config: OdisConfig, readonly kit: ContractKit) { - super(config) + super(config, db) } async init( diff --git a/packages/phone-number-privacy/combiner/src/utils/utils.ts b/packages/phone-number-privacy/combiner/src/utils/utils.ts new file mode 100644 index 00000000000..deb6a5a490f --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/utils/utils.ts @@ -0,0 +1,9 @@ +import { Knex } from 'knex' + +export function tableWithLockForTrx(baseQuery: Knex.QueryBuilder, trx?: Knex.Transaction) { + if (trx) { + // Lock relevant database rows for the duration of the transaction + return baseQuery.transacting(trx).forUpdate() + } + return baseQuery +} From 0102b704182e5abee9021f31f3706164b93efeb3 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Sat, 19 Aug 2023 18:44:38 -0400 Subject: [PATCH 22/27] removed duplicate primary --- .../database/migrations/20230815120000_create_accounts_table.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/phone-number-privacy/combiner/src/database/migrations/20230815120000_create_accounts_table.ts b/packages/phone-number-privacy/combiner/src/database/migrations/20230815120000_create_accounts_table.ts index 43eae57560c..d55e5d37809 100644 --- a/packages/phone-number-privacy/combiner/src/database/migrations/20230815120000_create_accounts_table.ts +++ b/packages/phone-number-privacy/combiner/src/database/migrations/20230815120000_create_accounts_table.ts @@ -8,7 +8,6 @@ export async function up(knex: Knex): Promise { t.dateTime(ACCOUNTS_COLUMNS.createdAt).notNullable() t.string(ACCOUNTS_COLUMNS.dek) t.dateTime(ACCOUNTS_COLUMNS.onChainDataLastUpdated) - t.primary([ACCOUNTS_COLUMNS.address, ACCOUNTS_COLUMNS.dek]) }) } return null From 7004a5a8962fba412d5c3718257a94a0fd41e5a0 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Mon, 21 Aug 2023 12:44:32 -0400 Subject: [PATCH 23/27] ++ default options to db configs --- .../phone-number-privacy/combiner/src/config.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/phone-number-privacy/combiner/src/config.ts b/packages/phone-number-privacy/combiner/src/config.ts index bff9df22c19..de31be8e460 100644 --- a/packages/phone-number-privacy/combiner/src/config.ts +++ b/packages/phone-number-privacy/combiner/src/config.ts @@ -1,5 +1,6 @@ import { BlockchainConfig, + DB_POOL_MAX_SIZE, DB_TIMEOUT, FULL_NODE_TIMEOUT_IN_MS, RETRY_COUNT, @@ -172,7 +173,7 @@ if (DEV_MODE) { host: 'http://localhost', port: undefined, ssl: true, - poolMaxSize: 50, + poolMaxSize: DB_POOL_MAX_SIZE, timeout: DB_TIMEOUT, }, } @@ -225,15 +226,19 @@ if (DEV_MODE) { ), }, db: { - type: functionConfig.db.type, + type: functionConfig.db.type + ? functionConfig.db.type.toLowerCase() + : SupportedDatabase.Postgres, user: functionConfig.db.username, password: functionConfig.db.pass, database: functionConfig.db.name, host: `/cloudsql/${functionConfig.db.host}`, - port: undefined, + port: functionConfig.db.port ? Number(functionConfig.db.port) : undefined, ssl: toBool(functionConfig.db.ssl, true), - poolMaxSize: Number(functionConfig.db.pool_max_size), - timeout: Number(functionConfig.db.timeout), + poolMaxSize: functionConfig.db.pool_max_size + ? Number(functionConfig.db.pool_max_size) + : DB_POOL_MAX_SIZE, + timeout: functionConfig.db.timeout ? Number(functionConfig.db.timeout) : DB_TIMEOUT, }, } } From 4a6a46abe9535da1ec1411ca4351cc48ab37af7f Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Fri, 25 Aug 2023 17:11:54 -0400 Subject: [PATCH 24/27] adapt to new achitecture --- .../src/pnp/endpoints/quota/action.ts | 6 ++- .../combiner/src/pnp/endpoints/sign/action.ts | 6 ++- .../combiner/src/server.ts | 7 +-- .../combiner/src/utils/authentication.ts | 52 +++++++++++-------- .../combiner/test/integration/domain.test.ts | 16 +++--- .../combiner/test/integration/pnp.test.ts | 14 +++-- 6 files changed, 53 insertions(+), 48 deletions(-) diff --git a/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/action.ts b/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/action.ts index 26af9325fec..2702633cb4a 100644 --- a/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/action.ts +++ b/packages/phone-number-privacy/combiner/src/pnp/endpoints/quota/action.ts @@ -1,5 +1,4 @@ import { - authenticateUser, CombinerEndpoint, DataEncryptionKeyFetcher, ErrorMessage, @@ -19,8 +18,11 @@ import { getKeyVersionInfo, sendFailure } from '../../../common/io' import { getCombinerVersion, OdisConfig } from '../../../config' import { logPnpSignerResponseDiscrepancies } from '../../services/log-responses' import { findCombinerQuotaState } from '../../services/threshold-state' +import { authenticateUser } from '../../../utils/authentication' +import { Knex } from 'knex' export function createPnpQuotaHandler( + db: Knex, signers: Signer[], config: OdisConfig, dekFetcher: DataEncryptionKeyFetcher @@ -33,7 +35,7 @@ export function createPnpQuotaHandler( return } - if (!(await authenticateUser(request, logger, dekFetcher))) { + if (!(await authenticateUser(db, request, logger, dekFetcher))) { sendFailure(WarningMessage.UNAUTHENTICATED_USER, 401, response) return } diff --git a/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/action.ts b/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/action.ts index 23458061d87..4e6300ae8ea 100644 --- a/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/action.ts +++ b/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/action.ts @@ -1,5 +1,4 @@ import { - authenticateUser, CombinerEndpoint, DataEncryptionKeyFetcher, ErrorMessage, @@ -24,8 +23,11 @@ import { getKeyVersionInfo, requestHasSupportedKeyVersion, sendFailure } from '. import { getCombinerVersion, OdisConfig } from '../../../config' import { logPnpSignerResponseDiscrepancies } from '../../services/log-responses' import { findCombinerQuotaState } from '../../services/threshold-state' +import { Knex } from 'knex' +import { authenticateUser } from '../../../utils/authentication' export function createPnpSignHandler( + db: Knex, signers: Signer[], config: OdisConfig, dekFetcher: DataEncryptionKeyFetcher @@ -42,7 +44,7 @@ export function createPnpSignHandler( return } - if (!(await authenticateUser(request, logger, dekFetcher))) { + if (!(await authenticateUser(db, request, logger, dekFetcher))) { sendFailure(WarningMessage.UNAUTHENTICATED_USER, 401, response) return } diff --git a/packages/phone-number-privacy/combiner/src/server.ts b/packages/phone-number-privacy/combiner/src/server.ts index 0335e4bc12a..ee3e852ddfc 100644 --- a/packages/phone-number-privacy/combiner/src/server.ts +++ b/packages/phone-number-privacy/combiner/src/server.ts @@ -7,7 +7,7 @@ import { OdisRequest, rootLogger, } from '@celo/phone-number-privacy-common' -import express, { RequestHandler } from 'express' +import express, { Express, RequestHandler } from 'express' import { Signer } from './common/combine' import { catchErrorHandler, @@ -21,6 +21,7 @@ import { createDomainQuotaHandler } from './domain/endpoints/quota/action' import { createDomainSignHandler } from './domain/endpoints/sign/action' import { createPnpQuotaHandler } from './pnp/endpoints/quota/action' import { createPnpSignHandler } from './pnp/endpoints/sign/action' +import { Knex } from 'knex' require('events').EventEmitter.defaultMaxListeners = 15 @@ -64,8 +65,8 @@ export function startCombiner(db: Knex, config: CombinerConfig, kit: ContractKit ) const pnpSigners: Signer[] = JSON.parse(config.phoneNumberPrivacy.odisServices.signers) - const pnpQuota = createPnpQuotaHandler(pnpSigners, config.phoneNumberPrivacy, dekFetcher) - const pnpSign = createPnpSignHandler(pnpSigners, config.phoneNumberPrivacy, dekFetcher) + const pnpQuota = createPnpQuotaHandler(db, pnpSigners, config.phoneNumberPrivacy, dekFetcher) + const pnpSign = createPnpSignHandler(db, pnpSigners, config.phoneNumberPrivacy, dekFetcher) const domainSigners: Signer[] = JSON.parse(config.domains.odisServices.signers) const domainQuota = createDomainQuotaHandler(domainSigners, config.domains) diff --git a/packages/phone-number-privacy/combiner/src/utils/authentication.ts b/packages/phone-number-privacy/combiner/src/utils/authentication.ts index bc884b995b2..a5717cdf604 100644 --- a/packages/phone-number-privacy/combiner/src/utils/authentication.ts +++ b/packages/phone-number-privacy/combiner/src/utils/authentication.ts @@ -4,6 +4,7 @@ import { AccountsWrapper } from '@celo/contractkit/lib/wrappers/Accounts' import { AttestationsWrapper } from '@celo/contractkit/lib/wrappers/Attestations' import { AuthenticationMethod, + DataEncryptionKeyFetcher, ErrorMessage, ErrorType, fetchEnv, @@ -28,13 +29,9 @@ import { getDekSignerRecord, updateDekSignerRecord } from '../database/wrappers/ export async function authenticateUser( db: Knex, request: Request<{}, {}, R>, - contractKit: ContractKit, logger: Logger, - shouldFailOpen: boolean = false, - warnings: ErrorType[] = [], - timeoutMs: number = FULL_NODE_TIMEOUT_IN_MS, - retryCount: number = RETRY_COUNT, - retryDelay: number = RETRY_DELAY_IN_MS + fetchDEK: DataEncryptionKeyFetcher, + warnings: ErrorType[] = [] ): Promise { logger.debug('Authenticating user') @@ -50,38 +47,47 @@ export async function authenticateUser( if (authMethod && authMethod === AuthenticationMethod.ENCRYPTION_KEY) { let registeredEncryptionKey: string | undefined + try { + // first look for DEK in db + registeredEncryptionKey = await getDekSignerRecord(db, signer, logger) - registeredEncryptionKey = await getDekSignerRecord(db, signer, logger) - - if (registeredEncryptionKey) { - logger.info({ dek: registeredEncryptionKey, account: signer }, 'Found DEK for account in db') - if (verifyDEKSignature(message, messageSignature, registeredEncryptionKey, logger)) { - return true + // verify DEK if found + if (registeredEncryptionKey) { + logger.info( + { dek: registeredEncryptionKey, account: signer }, + 'Found DEK for account in db' + ) + if (verifyDEKSignature(message, messageSignature, registeredEncryptionKey, logger)) { + return true + } + logger.warn({ account: signer }, 'Failed to verify account DEK signature found in db.') } - logger.warn({ account: signer }, 'Failed to verify account DEK signature found in db.') + } catch (error) { + const failureStatus = ErrorMessage.FAILING_CLOSED + logger.error({ + error, + warning: ErrorMessage.FAILURE_TO_GET_DEK, + failureStatus, + }) + warnings.push(ErrorMessage.FAILURE_TO_GET_DEK, failureStatus) + return false } try { - registeredEncryptionKey = await getDataEncryptionKey( - signer, - contractKit, - logger, - timeoutMs, - retryCount, - retryDelay - ) + registeredEncryptionKey = await fetchDEK(signer) } catch (err) { // getDataEncryptionKey should only throw if there is a full-node connection issue. // That is, it does not throw if the DEK is undefined or invalid - const failureStatus = shouldFailOpen ? ErrorMessage.FAILING_OPEN : ErrorMessage.FAILING_CLOSED + const failureStatus = ErrorMessage.FAILING_CLOSED logger.error({ err, warning: ErrorMessage.FAILURE_TO_GET_DEK, failureStatus, }) warnings.push(ErrorMessage.FAILURE_TO_GET_DEK, failureStatus) - return shouldFailOpen + return false } + if (!registeredEncryptionKey) { logger.warn({ account: signer }, 'Account does not have registered encryption key') return false diff --git a/packages/phone-number-privacy/combiner/test/integration/domain.test.ts b/packages/phone-number-privacy/combiner/test/integration/domain.test.ts index 18fde6d5b04..50630c7fc38 100644 --- a/packages/phone-number-privacy/combiner/test/integration/domain.test.ts +++ b/packages/phone-number-privacy/combiner/test/integration/domain.test.ts @@ -270,13 +270,11 @@ describe('domainService', () => { [`${DefaultKeyName.DOMAINS}-3`, DOMAINS_THRESHOLD_DEV_PK_SHARE_3_V3], ]) ) - - app = startCombiner(combinerConfig, getContractKitWithAgent(combinerConfig.blockchain)) }) beforeEach(async () => { db = await initCombinerDatabase(combinerConfig) - app = startCombiner(db, combinerConfig, getContractKit(combinerConfig.blockchain)) + app = startCombiner(db, combinerConfig, getContractKitWithAgent(combinerConfig.blockchain)) signerDB1 = await initSignerDatabase(signerConfig, signerMigrationsPath) signerDB2 = await initSignerDatabase(signerConfig, signerMigrationsPath) @@ -287,11 +285,12 @@ describe('domainService', () => { await signerDB1?.destroy() await signerDB2?.destroy() await signerDB3?.destroy() - await db?.destroy() await serverClose(signer1) await serverClose(signer2) await serverClose(signer3) + + await db?.destroy() }) describe('when signers are operating correctly', () => { @@ -1227,10 +1226,6 @@ describe('domainService', () => { ], ]) ) - app = startCombiner( - combinerConfigLargerN, - getContractKitWithAgent(combinerConfigLargerN.blockchain) - ) }) beforeEach(async () => { @@ -1238,7 +1233,7 @@ describe('domainService', () => { app = startCombiner( db, combinerConfigLargerN, - getContractKit(combinerConfigLargerN.blockchain) + getContractKitWithAgent(combinerConfigLargerN.blockchain) ) signerDB1 = await initSignerDatabase(signerConfig, signerMigrationsPath) @@ -1260,13 +1255,14 @@ describe('domainService', () => { await signerDB3?.destroy() await signerDB4?.destroy() await signerDB5?.destroy() - await db?.destroy() await serverClose(signer1) await serverClose(signer2) await serverClose(signer3) await serverClose(signer4) await serverClose(signer5) + + await db?.destroy() }) it('Should respond with 200 on valid request', async () => { diff --git a/packages/phone-number-privacy/combiner/test/integration/pnp.test.ts b/packages/phone-number-privacy/combiner/test/integration/pnp.test.ts index eb2bda89cb2..b60fd57231c 100644 --- a/packages/phone-number-privacy/combiner/test/integration/pnp.test.ts +++ b/packages/phone-number-privacy/combiner/test/integration/pnp.test.ts @@ -203,7 +203,7 @@ describe('pnpService', () => { const message = Buffer.from('test message', 'utf8') - // In current setup, the same mocked kit is used for the combiner and signers + // In current setup, the same mocked kit is used for the app and signers const mockKit = newKit('dummyKit') const sendPnpSignRequest = async ( @@ -320,16 +320,13 @@ describe('pnpService', () => { await signerDB1?.destroy() await signerDB2?.destroy() await signerDB3?.destroy() - await db?.destroy() await serverClose(signer1) await serverClose(signer2) await serverClose(signer3) - }) - // afterAll(async () => { - // await db?.destroy() - // }) + await db?.destroy() + }) describe('when signers are operating correctly', () => { beforeEach(async () => { @@ -931,7 +928,7 @@ describe('pnpService', () => { }) }) - // For testing combiner code paths when signers do not behave as expected + // For testing app code paths when signers do not behave as expected describe('when signers are not operating correctly', () => { beforeEach(() => { mockOdisPaymentsTotalPaidCUSD.mockReturnValue(onChainPaymentsDefault) @@ -1276,13 +1273,14 @@ describe('pnpService', () => { await signerDB3?.destroy() await signerDB4?.destroy() await signerDB5?.destroy() - await db?.destroy() await serverClose(signer1) await serverClose(signer2) await serverClose(signer3) await serverClose(signer4) await serverClose(signer5) + + await db?.destroy() }) it('Should respond with 200 on valid request', async () => { From 783b0e78e4e67924dca0dcb4535e0485f7062046 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Tue, 29 Aug 2023 12:07:03 -0400 Subject: [PATCH 25/27] init request db commit --- .../20230819120000_create_request_table.ts | 20 +++++++ .../combiner/src/database/models/request.ts | 29 ++++++++++ .../combiner/src/database/wrappers/request.ts | 54 +++++++++++++++++++ .../combiner/src/pnp/endpoints/sign/action.ts | 10 ++++ .../combiner/src/utils/utils.ts | 9 ++++ 5 files changed, 122 insertions(+) create mode 100644 packages/phone-number-privacy/combiner/src/database/migrations/20230819120000_create_request_table.ts create mode 100644 packages/phone-number-privacy/combiner/src/database/models/request.ts create mode 100644 packages/phone-number-privacy/combiner/src/database/wrappers/request.ts create mode 100644 packages/phone-number-privacy/combiner/src/utils/utils.ts diff --git a/packages/phone-number-privacy/combiner/src/database/migrations/20230819120000_create_request_table.ts b/packages/phone-number-privacy/combiner/src/database/migrations/20230819120000_create_request_table.ts new file mode 100644 index 00000000000..46e4e9feb29 --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/database/migrations/20230819120000_create_request_table.ts @@ -0,0 +1,20 @@ +import { Knex } from 'knex' +import { REQUESTS_COLUMNS, REQUESTS_TABLE } from '../models/request' + +export async function up(knex: Knex): Promise { + // This check was necessary to switch from using .ts migrations to .js migrations. + if (!(await knex.schema.hasTable(REQUESTS_TABLE))) { + return knex.schema.createTable(REQUESTS_TABLE, (t) => { + t.string(REQUESTS_COLUMNS.address).notNullable() + t.dateTime(REQUESTS_COLUMNS.timestamp).notNullable() + t.string(REQUESTS_COLUMNS.blindedQuery).notNullable() + t.string(REQUESTS_COLUMNS.combinedSignature).notNullable() + t.primary([REQUESTS_COLUMNS.address, REQUESTS_COLUMNS.blindedQuery]) + }) + } + return null +} + +export async function down(knex: Knex): Promise { + return knex.schema.dropTable(REQUESTS_TABLE) +} diff --git a/packages/phone-number-privacy/combiner/src/database/models/request.ts b/packages/phone-number-privacy/combiner/src/database/models/request.ts new file mode 100644 index 00000000000..c58c4edb9ef --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/database/models/request.ts @@ -0,0 +1,29 @@ +export const REQUESTS_TABLE = 'requests' + +export enum REQUESTS_COLUMNS { + address = 'caller_address', + timestamp = 'timestamp', + blindedQuery = 'blinded_query', + combinedSignature = 'combined_signature', + //TODO (soloseng): add session response too? +} + +export interface PnpSignRequestRecord { + [REQUESTS_COLUMNS.address]: string + [REQUESTS_COLUMNS.timestamp]: Date + [REQUESTS_COLUMNS.blindedQuery]: string + [REQUESTS_COLUMNS.combinedSignature]: string +} + +export function toPnpSignRequestRecord( + account: string, + blindedQuery: string, + combinedSignature: string +): PnpSignRequestRecord { + return { + [REQUESTS_COLUMNS.address]: account, + [REQUESTS_COLUMNS.timestamp]: new Date(), + [REQUESTS_COLUMNS.blindedQuery]: blindedQuery, + [REQUESTS_COLUMNS.combinedSignature]: combinedSignature, + } +} diff --git a/packages/phone-number-privacy/combiner/src/database/wrappers/request.ts b/packages/phone-number-privacy/combiner/src/database/wrappers/request.ts new file mode 100644 index 00000000000..47f272e5cf5 --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/database/wrappers/request.ts @@ -0,0 +1,54 @@ +import Logger from 'bunyan' +import { Knex } from 'knex' +import config from '../../config' +import { tableWithLockForTrx } from '../../utils/utils' +import { + PnpSignRequestRecord, + REQUESTS_COLUMNS, + REQUESTS_TABLE, + toPnpSignRequestRecord, +} from '../models/request' + +function requests(db: Knex) { + return db(REQUESTS_TABLE) +} + +// TODO (soloseng): should return the response associated to this request. +export async function getCombinedSignatureIfRequestExists( + db: Knex, + account: string, + blindedQuery: string, + // logger: Logger, + trx?: Knex.Transaction +): Promise { + // logger.debug(`Checking if request exists for account: ${account}, blindedQuery: ${blindedQuery}`) + const existingRequest = await tableWithLockForTrx(requests(db), trx) + .where({ + [REQUESTS_COLUMNS.address]: account, + [REQUESTS_COLUMNS.blindedQuery]: blindedQuery, + }) + .first() + .timeout(config.db.timeout) + + if (existingRequest) { + return existingRequest[REQUESTS_COLUMNS.combinedSignature] + } + return null +} + +export async function storeRequest( + db: Knex, + account: string, + blindedQuery: string, + combinedSignature: string, + logger?: Logger, //revert the `?` + trx?: Knex.Transaction //revert the `?` +): Promise { + logger!.debug( + `Storing salt request for: ${account}, blindedQuery: ${blindedQuery} with combinedSignature: ${combinedSignature}` + ) + await requests(db) + .transacting(trx!) + .insert(toPnpSignRequestRecord(account, blindedQuery, combinedSignature)) + .timeout(config.db.timeout) +} diff --git a/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/action.ts b/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/action.ts index 4e6300ae8ea..044942379c1 100644 --- a/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/action.ts +++ b/packages/phone-number-privacy/combiner/src/pnp/endpoints/sign/action.ts @@ -26,6 +26,8 @@ import { findCombinerQuotaState } from '../../services/threshold-state' import { Knex } from 'knex' import { authenticateUser } from '../../../utils/authentication' +import { storeRequest } from '../../../database/wrappers/request' + export function createPnpSignHandler( db: Knex, signers: Signer[], @@ -104,6 +106,14 @@ export function createPnpSignHandler( request.body.blindedQueryPhoneNumber, logger ) + // TODO (soloseng): store validated request + const signMessageRequest: SignMessageRequest = request.body + await storeRequest( + db, + signMessageRequest.account, + signMessageRequest.blindedQueryPhoneNumber, + combinedSignature + ) return send( response, diff --git a/packages/phone-number-privacy/combiner/src/utils/utils.ts b/packages/phone-number-privacy/combiner/src/utils/utils.ts new file mode 100644 index 00000000000..deb6a5a490f --- /dev/null +++ b/packages/phone-number-privacy/combiner/src/utils/utils.ts @@ -0,0 +1,9 @@ +import { Knex } from 'knex' + +export function tableWithLockForTrx(baseQuery: Knex.QueryBuilder, trx?: Knex.Transaction) { + if (trx) { + // Lock relevant database rows for the duration of the transaction + return baseQuery.transacting(trx).forUpdate() + } + return baseQuery +} From 2bfb83d2bee704a4ab5265227a0875ecb0c68600 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Tue, 29 Aug 2023 17:05:56 -0400 Subject: [PATCH 26/27] updated db config --- .../combiner/src/config.ts | 34 +++++++++++-------- .../combiner/src/utils/firebase-configs.ts | 14 ++++++++ 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/packages/phone-number-privacy/combiner/src/config.ts b/packages/phone-number-privacy/combiner/src/config.ts index 1a6a9f0901f..233654a3581 100644 --- a/packages/phone-number-privacy/combiner/src/config.ts +++ b/packages/phone-number-privacy/combiner/src/config.ts @@ -7,10 +7,20 @@ import { RETRY_DELAY_IN_MS, rootLogger, TestUtils, + toBool, } from '@celo/phone-number-privacy-common' import { blockchainApiKey, blockchainProvider, + dbHost, + dbName, + dbPassword, + dbPoolMaxSize, + dbPort, + dbSsl, + dbTimeout, + dbType, + dbUsername, domainEnabled, domainFullNodeDelaysMs, domainFullNodeRetryCount, @@ -79,7 +89,7 @@ export interface CombinerConfig { phoneNumberPrivacy: OdisConfig domains: OdisConfig db: { - type: SupportedDatabase + type: SupportedDatabase | string user: string password: string database: string @@ -234,19 +244,15 @@ if (DEV_MODE) { fullNodeRetryDelayMs: domainFullNodeDelaysMs.value(), }, db: { - type: functionConfig.db.type - ? functionConfig.db.type.toLowerCase() - : SupportedDatabase.Postgres, - user: functionConfig.db.username, - password: functionConfig.db.pass, - database: functionConfig.db.name, - host: `/cloudsql/${functionConfig.db.host}`, - port: functionConfig.db.port ? Number(functionConfig.db.port) : undefined, - ssl: toBool(functionConfig.db.ssl, true), - poolMaxSize: functionConfig.db.pool_max_size - ? Number(functionConfig.db.pool_max_size) - : DB_POOL_MAX_SIZE, - timeout: functionConfig.db.timeout ? Number(functionConfig.db.timeout) : DB_TIMEOUT, + type: dbType.value(), + user: dbUsername.value(), + password: dbPassword.value(), + database: dbName.value(), + host: `/cloudsql/${dbHost.value()}`, + port: dbPort.value(), + ssl: dbSsl.value(), + poolMaxSize: dbPoolMaxSize.value(), + timeout: dbTimeout.value(), }, } } diff --git a/packages/phone-number-privacy/combiner/src/utils/firebase-configs.ts b/packages/phone-number-privacy/combiner/src/utils/firebase-configs.ts index 4a76f8b5951..f553f0836b1 100644 --- a/packages/phone-number-privacy/combiner/src/utils/firebase-configs.ts +++ b/packages/phone-number-privacy/combiner/src/utils/firebase-configs.ts @@ -1,9 +1,12 @@ import { + DB_POOL_MAX_SIZE, + DB_TIMEOUT, FULL_NODE_TIMEOUT_IN_MS, RETRY_COUNT, RETRY_DELAY_IN_MS, } from '@celo/phone-number-privacy-common' import { defineBoolean, defineInt, defineSecret, defineString } from 'firebase-functions/params' +import { SupportedDatabase } from '../config' const defaultServiceName = 'odis-combiner' @@ -65,3 +68,14 @@ export const domainFullNodeRetryCount = defineInt('DOMAIN_FULL_NODE_RETRY_COUNT' export const domainFullNodeDelaysMs = defineInt('DOMAIN_FULL_NODE_DELAY_MS', { default: RETRY_DELAY_IN_MS, }) + +// DB +export const dbType = defineString('DB_TYPE', { default: SupportedDatabase.Postgres.toString() }) +export const dbUsername = defineString('DB_USERNAME') +export const dbPassword = defineSecret('DB_PASSWORD') +export const dbName = defineString('DB_NAME') +export const dbHost = defineString('DB_HOST') +export const dbPort = defineInt('DB_PORT', { default: undefined }) +export const dbSsl = defineBoolean('DB_SSL', { default: true }) +export const dbPoolMaxSize = defineInt('DB_POOL_MAX_SIZE', { default: DB_POOL_MAX_SIZE }) +export const dbTimeout = defineInt('DB_TIMEOUT', { default: DB_TIMEOUT }) From 7b0486e61e527f747ad3cb7c8b1fd77d05fb182b Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Tue, 29 Aug 2023 17:07:16 -0400 Subject: [PATCH 27/27] remove comment --- packages/phone-number-privacy/combiner/src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/phone-number-privacy/combiner/src/index.ts b/packages/phone-number-privacy/combiner/src/index.ts index 9d20597d999..b22b96614fe 100644 --- a/packages/phone-number-privacy/combiner/src/index.ts +++ b/packages/phone-number-privacy/combiner/src/index.ts @@ -26,6 +26,5 @@ export const combinerGen2 = functions.onRequest( res.status(500).send('Internal Server Error') } } - // startCombiner(config, getContractKit(config.blockchain)) ) export * from './config'