diff --git a/event-watcher/.env.sample b/event-watcher/.env.sample index 1b412e81..1c773804 100644 --- a/event-watcher/.env.sample +++ b/event-watcher/.env.sample @@ -4,11 +4,12 @@ LOG_LEVEL=info ETH_RPC= DB_SOURCE= JSON_DB_FILE=db.json -FIRESTORE_ACCOUNT_KEY_PATH= -FIRESTORE_COLLECTION= -FIRESTORE_LATEST_COLLECTION= -GOOGLE_APPLICATION_CREDENTIALS= -BIGTABLE_TABLE_ID= -BIGTABLE_INSTANCE_ID= -BIGTABLE_SIGNED_VAAS_TABLE_ID= -BIGTABLE_VAAS_BY_TX_HASH_TABLE_ID= \ No newline at end of file + +MONGODB_URI=mongodb://localhost:27017 +MONGODB_DATABASE=wormhole + +AWS_SNS_REGION= +AWS_TOPIC_ARN= +AWS_SNS_SUBJECT=EventWatcher +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= \ No newline at end of file diff --git a/event-watcher/package-lock.json b/event-watcher/package-lock.json index 7fc15e8a..358dd610 100644 --- a/event-watcher/package-lock.json +++ b/event-watcher/package-lock.json @@ -8,8 +8,10 @@ "name": "@wormhole-foundation/wormhole-monitor-watcher", "version": "0.0.1", "dependencies": { + "@aws-sdk/client-sns": "3.391.0", "@celo-tools/celo-ethers-wrapper": "^0.3.0", "@certusone/wormhole-sdk": "^0.9.22", + "@fastify/swagger": "^8.8.0", "@google-cloud/bigtable": "^4.1.0", "@google-cloud/pubsub": "^3.4.1", "@mysten/sui.js": "^0.33.0", @@ -19,8 +21,10 @@ "axios": "^1.2.1", "bs58": "^5.0.0", "dotenv": "^16.0.3", + "fastify": "^4.21.0", "firebase-admin": "^11.4.0", "js-sha512": "^0.8.0", + "mongodb": "^5.7.0", "near-api-js": "^1.1.0", "ora": "^5.4.1", "winston": "^3.8.2", @@ -111,6 +115,585 @@ "form-data": "^4.0.0" } }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-sns": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sns/-/client-sns-3.391.0.tgz", + "integrity": "sha512-pV3oaTFLyCIKHlYagOfrt5kHlsQ72h5Pg/BYG+Wbrj18ABsmvxZe+NFadu4X8zFjVcHrx89RAYCtVFLQUP63dg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.391.0", + "@aws-sdk/credential-provider-node": "3.391.0", + "@aws-sdk/middleware-host-header": "3.391.0", + "@aws-sdk/middleware-logger": "3.391.0", + "@aws-sdk/middleware-recursion-detection": "3.391.0", + "@aws-sdk/middleware-signing": "3.391.0", + "@aws-sdk/middleware-user-agent": "3.391.0", + "@aws-sdk/types": "3.391.0", + "@aws-sdk/util-endpoints": "3.391.0", + "@aws-sdk/util-user-agent-browser": "3.391.0", + "@aws-sdk/util-user-agent-node": "3.391.0", + "@smithy/config-resolver": "^2.0.3", + "@smithy/fetch-http-handler": "^2.0.3", + "@smithy/hash-node": "^2.0.3", + "@smithy/invalid-dependency": "^2.0.3", + "@smithy/middleware-content-length": "^2.0.3", + "@smithy/middleware-endpoint": "^2.0.3", + "@smithy/middleware-retry": "^2.0.3", + "@smithy/middleware-serde": "^2.0.3", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.3", + "@smithy/node-http-handler": "^2.0.3", + "@smithy/protocol-http": "^2.0.3", + "@smithy/smithy-client": "^2.0.3", + "@smithy/types": "^2.2.0", + "@smithy/url-parser": "^2.0.3", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.3", + "@smithy/util-defaults-mode-node": "^2.0.3", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sns/node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.391.0.tgz", + "integrity": "sha512-aT+O1CbWIWYlCtWK6g3ZaMvFNImOgFGurOEPscuedqzG5UQc1bRtRrGYShLyzcZgfXP+s0cKYJqgGeRNoWiwqA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.391.0", + "@aws-sdk/middleware-logger": "3.391.0", + "@aws-sdk/middleware-recursion-detection": "3.391.0", + "@aws-sdk/middleware-user-agent": "3.391.0", + "@aws-sdk/types": "3.391.0", + "@aws-sdk/util-endpoints": "3.391.0", + "@aws-sdk/util-user-agent-browser": "3.391.0", + "@aws-sdk/util-user-agent-node": "3.391.0", + "@smithy/config-resolver": "^2.0.3", + "@smithy/fetch-http-handler": "^2.0.3", + "@smithy/hash-node": "^2.0.3", + "@smithy/invalid-dependency": "^2.0.3", + "@smithy/middleware-content-length": "^2.0.3", + "@smithy/middleware-endpoint": "^2.0.3", + "@smithy/middleware-retry": "^2.0.3", + "@smithy/middleware-serde": "^2.0.3", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.3", + "@smithy/node-http-handler": "^2.0.3", + "@smithy/protocol-http": "^2.0.3", + "@smithy/smithy-client": "^2.0.3", + "@smithy/types": "^2.2.0", + "@smithy/url-parser": "^2.0.3", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.3", + "@smithy/util-defaults-mode-node": "^2.0.3", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.391.0.tgz", + "integrity": "sha512-y+KmorcUx9o5O99sXVPbhGUpsLpfhzYRaYCqxArLsyzZTCO6XDXMi8vg/xtS+b703j9lWEl5GxAv2oBaEwEnhQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.391.0", + "@aws-sdk/middleware-host-header": "3.391.0", + "@aws-sdk/middleware-logger": "3.391.0", + "@aws-sdk/middleware-recursion-detection": "3.391.0", + "@aws-sdk/middleware-sdk-sts": "3.391.0", + "@aws-sdk/middleware-signing": "3.391.0", + "@aws-sdk/middleware-user-agent": "3.391.0", + "@aws-sdk/types": "3.391.0", + "@aws-sdk/util-endpoints": "3.391.0", + "@aws-sdk/util-user-agent-browser": "3.391.0", + "@aws-sdk/util-user-agent-node": "3.391.0", + "@smithy/config-resolver": "^2.0.3", + "@smithy/fetch-http-handler": "^2.0.3", + "@smithy/hash-node": "^2.0.3", + "@smithy/invalid-dependency": "^2.0.3", + "@smithy/middleware-content-length": "^2.0.3", + "@smithy/middleware-endpoint": "^2.0.3", + "@smithy/middleware-retry": "^2.0.3", + "@smithy/middleware-serde": "^2.0.3", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.3", + "@smithy/node-http-handler": "^2.0.3", + "@smithy/protocol-http": "^2.0.3", + "@smithy/smithy-client": "^2.0.3", + "@smithy/types": "^2.2.0", + "@smithy/url-parser": "^2.0.3", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.3", + "@smithy/util-defaults-mode-node": "^2.0.3", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.391.0.tgz", + "integrity": "sha512-mAzICedcg4bfL0mM5O6QTd9mQ331NLse1DMr6XL21ZZiLB48ej19L7AGV2xq5QwVbqKU3IVv1myRyhvpDM9jMg==", + "dependencies": { + "@aws-sdk/types": "3.391.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.391.0.tgz", + "integrity": "sha512-DJZmbmRMqNSfSV7UF8eBVhADz16KAMCTxnFuvgioHHfYUTZQEhCxRHI8jJqYWxhLTriS7AuTBIWr+1AIbwsCTA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.391.0", + "@aws-sdk/credential-provider-process": "3.391.0", + "@aws-sdk/credential-provider-sso": "3.391.0", + "@aws-sdk/credential-provider-web-identity": "3.391.0", + "@aws-sdk/types": "3.391.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.391.0.tgz", + "integrity": "sha512-LXHQwsTw4WBwRzD9swu8254Hao5MoIaGXIzbhX4EQ84dtOkKYbwiY4pDpLfcHcw3B1lFKkVclMze8WAs4EdEww==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.391.0", + "@aws-sdk/credential-provider-ini": "3.391.0", + "@aws-sdk/credential-provider-process": "3.391.0", + "@aws-sdk/credential-provider-sso": "3.391.0", + "@aws-sdk/credential-provider-web-identity": "3.391.0", + "@aws-sdk/types": "3.391.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.391.0.tgz", + "integrity": "sha512-KMlzPlBI+hBmXDo+EoFZdLgCVRkRa9B9iEE6x0+hQQ6g9bW6HI7cDRVdceR1ZoPasSaNAZ9QOXMTIBxTpn0sPQ==", + "dependencies": { + "@aws-sdk/types": "3.391.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.391.0.tgz", + "integrity": "sha512-FT/WoiRHiKys+FcRwvjui0yKuzNtJdn2uGuI1hYE0gpW1wVmW02ouufLckJTmcw09THUZ4w53OoCVU5OY00p8A==", + "dependencies": { + "@aws-sdk/client-sso": "3.391.0", + "@aws-sdk/token-providers": "3.391.0", + "@aws-sdk/types": "3.391.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.391.0.tgz", + "integrity": "sha512-n0vYg82B8bc4rxKltVbVqclev7hx+elyS9pEnZs3YbnbWJq0qqsznXmDfLqd1TcWpa09PGXcah0nsRDolVThsA==", + "dependencies": { + "@aws-sdk/types": "3.391.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.391.0.tgz", + "integrity": "sha512-+nyNr0rb2ixY7mU48nibr7L7gsw37y4oELhqgnNKhcjZDJ34imBwKIMFa64n21FdftmhcjR8IdSpzXE9xrkJ8g==", + "dependencies": { + "@aws-sdk/types": "3.391.0", + "@smithy/protocol-http": "^2.0.3", + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.391.0.tgz", + "integrity": "sha512-KOwl5zo16b17JDhqILHBStccBQ2w35em7+/6vdkJdUII6OU8aVIFTlIQT9wOUvd4do6biIRBMZG3IK0Rg7mRDQ==", + "dependencies": { + "@aws-sdk/types": "3.391.0", + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.391.0.tgz", + "integrity": "sha512-hVR3z59G7pX4pjDQs9Ag1tMgbLeGXOzeAAaNP9fEtHSd3KBMAGQgN3K3b9WPjzE2W0EoloHRJMK4qxZErdde2g==", + "dependencies": { + "@aws-sdk/types": "3.391.0", + "@smithy/protocol-http": "^2.0.3", + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.391.0.tgz", + "integrity": "sha512-6ZXI3Z4QU+TnT5PwKWloGmRHG81tWeI18/zxf9wWzrO2NhYFvITzEJH0vWLLiXdWtn/BYfLULXtDvkTaepbI5A==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.391.0", + "@aws-sdk/types": "3.391.0", + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.391.0.tgz", + "integrity": "sha512-2pAJJlZqaHc0d+cz2FTVrQmWi8ygKfqfczHUo/loCtOaMNtWXBHb/JsLEecs6cXdizy6gi3YsLz6VZYwY4Ssxw==", + "dependencies": { + "@aws-sdk/types": "3.391.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.3", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.2.0", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.391.0.tgz", + "integrity": "sha512-LdK9uMNA14zqRw3B79Mhy7GX36qld/GYo93xuu+lr+AQ98leZEdc6GUbrtNDI3fP1Z8TMQcyHUKBml4/B+wXpQ==", + "dependencies": { + "@aws-sdk/types": "3.391.0", + "@aws-sdk/util-endpoints": "3.391.0", + "@smithy/protocol-http": "^2.0.3", + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.391.0.tgz", + "integrity": "sha512-kgfArsKLDJE71qQjfXiHiM5cZqgDHlMsqEx35+A65GmTWJaS1PGDqu3ZvVVU8E5mxnCCLw7vho21fsjvH6TBpg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.391.0", + "@aws-sdk/middleware-logger": "3.391.0", + "@aws-sdk/middleware-recursion-detection": "3.391.0", + "@aws-sdk/middleware-user-agent": "3.391.0", + "@aws-sdk/types": "3.391.0", + "@aws-sdk/util-endpoints": "3.391.0", + "@aws-sdk/util-user-agent-browser": "3.391.0", + "@aws-sdk/util-user-agent-node": "3.391.0", + "@smithy/config-resolver": "^2.0.3", + "@smithy/fetch-http-handler": "^2.0.3", + "@smithy/hash-node": "^2.0.3", + "@smithy/invalid-dependency": "^2.0.3", + "@smithy/middleware-content-length": "^2.0.3", + "@smithy/middleware-endpoint": "^2.0.3", + "@smithy/middleware-retry": "^2.0.3", + "@smithy/middleware-serde": "^2.0.3", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.3", + "@smithy/node-http-handler": "^2.0.3", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.3", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/smithy-client": "^2.0.3", + "@smithy/types": "^2.2.0", + "@smithy/url-parser": "^2.0.3", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.3", + "@smithy/util-defaults-mode-node": "^2.0.3", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.391.0.tgz", + "integrity": "sha512-QpYVFKMOnzHz/JMj/b8wb18qxiT92U/5r5MmtRz2R3LOH6ooTO96k4ozXCrYr0qNed1PAnOj73rPrrH2wnCJKQ==", + "dependencies": { + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.391.0.tgz", + "integrity": "sha512-zv4sYDTQhNxyLoekcE02/nk3xvoo6yCHDy1kDJk0MFxOKaqUB+CvZdQBR4YBLSDlD4o4DUBmdYgKT58FfbM8sQ==", + "dependencies": { + "@aws-sdk/types": "3.391.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.391.0.tgz", + "integrity": "sha512-6ipHOB1WdCBNeAMJauN7l2qNE0WLVaTNhkD290/ElXm1FHGTL8yw6lIDIjhIFO1bmbZxDiKApwDiG7ROhaJoxQ==", + "dependencies": { + "@aws-sdk/types": "3.391.0", + "@smithy/types": "^2.2.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.391.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.391.0.tgz", + "integrity": "sha512-PVvAK/Lf4BdB1eJIZtyFpGSslGQwKpYt9/hKs5NlR+qxBMXU9T0DnTqH4GiXZaazvXr7OUVWitIF2b7iKBMTow==", + "dependencies": { + "@aws-sdk/types": "3.391.0", + "@smithy/node-config-provider": "^2.0.3", + "@smithy/types": "^2.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, "node_modules/@babel/code-frame": { "version": "7.22.10", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", @@ -1929,6 +2512,16 @@ "@ethersproject/strings": "^5.7.0" } }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", + "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, "node_modules/@fastify/busboy": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-1.2.1.tgz", @@ -1940,6 +2533,36 @@ "node": ">=14" } }, + "node_modules/@fastify/deepmerge": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", + "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" + }, + "node_modules/@fastify/error": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.3.0.tgz", + "integrity": "sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "dependencies": { + "fast-json-stringify": "^5.7.0" + } + }, + "node_modules/@fastify/swagger": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@fastify/swagger/-/swagger-8.8.0.tgz", + "integrity": "sha512-tYI2lbItb4yg9FhQj+leK6DdIBICLbXkSR2vZjo117ygHyYQLxw2v0ere/d2PtDmYAx7SOJzxvg3w6y0Sxc3iw==", + "dependencies": { + "fastify-plugin": "^4.0.0", + "json-schema-resolver": "^2.0.0", + "openapi-types": "^12.0.0", + "rfdc": "^1.3.0", + "yaml": "^2.2.2" + } + }, "node_modules/@firebase/app-types": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", @@ -3165,6 +3788,490 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@smithy/abort-controller": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.4.tgz", + "integrity": "sha512-3+3/xRQ0K/NFVtKSiTGsUa3muZnVaBmHrLNgxwoBLZO9rNhwZtjjjf7pFJ6aoucoul/c/w3xobRkgi8F9MWX8Q==", + "dependencies": { + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.4.tgz", + "integrity": "sha512-JtKWIKoCFeOY5JGQeEl81AKdIpzeLLSjSMmO5yoKqc58Yn3cxmteylT6Elba3FgAHjK1OthARRXz5JXaKKRB7g==", + "dependencies": { + "@smithy/types": "^2.2.1", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.4.tgz", + "integrity": "sha512-vW7xoDKZwjjf/2GCwVf/uvZce/QJOAYan9r8UsqlzOrnnpeS2ffhxeZjLK0/emZu8n6qU3amGgZ/BTo3oVtEyQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.4", + "@smithy/property-provider": "^2.0.4", + "@smithy/types": "^2.2.1", + "@smithy/url-parser": "^2.0.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.4.tgz", + "integrity": "sha512-DkVLcQjhOxPj/4pf2hNj2kvOeoLczirHe57g7czMNJCUBvg9cpU9hNgqS37Y5sjdEtMSa2oTyCS5oeHZtKgoIw==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.2.1", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.0.4.tgz", + "integrity": "sha512-1dwR8T+QMe5Gs60NpZgF7ReZp0SXz1O/aX5BdDhsOJh72fi3Bx2UZlDihCdb++9vPyBRMXFRF7I8/C4x8iIm8A==", + "dependencies": { + "@smithy/protocol-http": "^2.0.4", + "@smithy/querystring-builder": "^2.0.4", + "@smithy/types": "^2.2.1", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.4.tgz", + "integrity": "sha512-vZ6a/fvEAFJKNtxJsn0I2WM8uBdypLLhLTpP4BA6fRsBAtwIl5S4wTt0Hspy6uGNn/74LmCxGmFSTMMbSd7ZDA==", + "dependencies": { + "@smithy/types": "^2.2.1", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.4.tgz", + "integrity": "sha512-zfbPPZFiZvhIXJYKlzQwDUnxmWK/SmyDcM6iQJRZHU2jQZAzhHUXFGIu2lKH9L02VUqysOgQi3S/HY4fhrVT8w==", + "dependencies": { + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.4.tgz", + "integrity": "sha512-Pdd+fhRbvizqsgYJ0pLWE6hjhq42wDFWzMj/1T7mEY9tG9bP6/AcdsQK8SAOckrBLURDoeSqTAwPKalsgcZBxw==", + "dependencies": { + "@smithy/protocol-http": "^2.0.4", + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.4.tgz", + "integrity": "sha512-aLPqkqKjZQ1V718P0Ostpp53nWfwK32uD0HFKSAOT25RvL285dqzGl0PAKDXpyLsPsPmHe0Yrg0AUFkRv4CRbQ==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.4", + "@smithy/types": "^2.2.1", + "@smithy/url-parser": "^2.0.4", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.4.tgz", + "integrity": "sha512-stozO6NgH9W/OSfFMOJEtlJCsnJFSoGyV4LHzIVQeXTzZ2RHjmytQ/Ez7GngHGZ1YsB4zxE1qDTXAU0AlaKf2w==", + "dependencies": { + "@smithy/protocol-http": "^2.0.4", + "@smithy/service-error-classification": "^2.0.0", + "@smithy/types": "^2.2.1", + "@smithy/util-middleware": "^2.0.0", + "@smithy/util-retry": "^2.0.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.4.tgz", + "integrity": "sha512-oDttJMMES7yXmopjQHnqTkxu8vZOdjB9VpSj94Ff4/GXdKQH7ozKLNIPq4C568nbeQbBt/gsLb6Ttbx1+j+JPQ==", + "dependencies": { + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.0.tgz", + "integrity": "sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.4.tgz", + "integrity": "sha512-s9O90cEhkpzZulvdHBBaroZ6AJ5uV6qtmycgYKP1yOCSfPHGIWYwaULdbfxraUsvzCcnMosDNkfckqXYoKI6jw==", + "dependencies": { + "@smithy/property-provider": "^2.0.4", + "@smithy/shared-ini-file-loader": "^2.0.4", + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.0.4.tgz", + "integrity": "sha512-svqeqkGgQz1B2m3IurHtp1O8vfuUGbqw6vynFmOrvPirRdiIPukHTZW1GN/JuBCtDpq9mNPutSVipfz2n4sZbQ==", + "dependencies": { + "@smithy/abort-controller": "^2.0.4", + "@smithy/protocol-http": "^2.0.4", + "@smithy/querystring-builder": "^2.0.4", + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.4.tgz", + "integrity": "sha512-OfaUIhnyvOkuCPHWMPkJqX++dUaDKsiZWuZqCdU04Z9dNAl2TtZAh7dw2rsZGb57vq6YH3PierNrDfQJTAKYtg==", + "dependencies": { + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.4.tgz", + "integrity": "sha512-I1vCZ/m1U424gA9TXkL/pJ3HlRfujY8+Oj3GfDWcrNiWVmAeyx3CTvXw+yMHp2X01BOOu5fnyAa6JwAn1O+txA==", + "dependencies": { + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.4.tgz", + "integrity": "sha512-Jc7UPx1pNeisYcABkoo2Pn4kvomy1UI7uxv7R+1W3806KMAKgYHutWmZG01aPHu2XH0zY2RF2KfGiuialsxHvA==", + "dependencies": { + "@smithy/types": "^2.2.1", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.4.tgz", + "integrity": "sha512-Uh6+PhGxSo17qe2g/JlyoekvTHKn7dYWfmHqUzPAvkW+dHlc3DNVG3++PV48z33lCo5YDVBBturWQ9N/TKn+EA==", + "dependencies": { + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.0.tgz", + "integrity": "sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.4.tgz", + "integrity": "sha512-091yneupXnSqvAU+vLG7h0g4QRRO6TjulpECXYVU6yW/LiNp7QE533DBpaphmbtI6tTC4EfGrhn35gTa0w+GQg==", + "dependencies": { + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.4.tgz", + "integrity": "sha512-y2xblkS0hb44QJDn9YjPp5aRFYSiI7w0bI3tATE3ybOrII2fppqD0SE3zgvew/B/3rTunuiCW+frTD0W4UYb9Q==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.4", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.2.1", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.0", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.0.4.tgz", + "integrity": "sha512-Dg1dkqyj3jwa03RFs6E4ASmfQ7CjplbGISJIJNSt3F8NfIid2RalbeCMOIHK7VagKh9qngZNyoKxObZC9LB9Lg==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.0", + "@smithy/types": "^2.2.1", + "@smithy/util-stream": "^2.0.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.2.1.tgz", + "integrity": "sha512-6nyDOf027ZeJiQVm6PXmLm7dR+hR2YJUkr4VwUniXA8xZUGAu5Mk0zfx2BPFrt+e5YauvlIqQoH0CsrM4tLkfg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.4.tgz", + "integrity": "sha512-puIQ6+TJpI2AAPw7IGdGG6d2DEcVP5nJqa1VjrxzUcy2Jx7LtGn+gDHY2o9Pc9vQkmoicovTEKgvv7CdqP+0gg==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.4", + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.0.0.tgz", + "integrity": "sha512-ZV7Z/WHTMxHJe/xL/56qZwSUcl63/5aaPAGjkfynJm4poILjdD4GmFI+V+YWabh2WJIjwTKZ5PNsuvPQKt93Mg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.4.tgz", + "integrity": "sha512-wGdnPt4Ng72duUd97HrlqVkq6DKVB/yjaGkSg5n3uuQKzzHjoi3OdjXGumD/VYPHz0dYd7wpLNG2CnMm/nfDrg==", + "dependencies": { + "@smithy/property-provider": "^2.0.4", + "@smithy/types": "^2.2.1", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.4.tgz", + "integrity": "sha512-QMkNcV6x52BeeeIvhvow6UmOu7nP7DXQljY6DKOP/aAokrli53IWTP/kUTd9B0Mp9tbW3WC10O6zaM69xiMNYw==", + "dependencies": { + "@smithy/config-resolver": "^2.0.4", + "@smithy/credential-provider-imds": "^2.0.4", + "@smithy/node-config-provider": "^2.0.4", + "@smithy/property-provider": "^2.0.4", + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.0.tgz", + "integrity": "sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.0.tgz", + "integrity": "sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.4.tgz", + "integrity": "sha512-ZVje79afuv3DB1Ma/g5m/5v9Zda8nA0xNgvE1pOD3EnoTp/Ekch1z20AN6gfVsf7JYWK2VSMVDiqI9N8Ua4wbg==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.0.4", + "@smithy/node-http-handler": "^2.0.4", + "@smithy/types": "^2.2.1", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@solana/buffer-layout": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", @@ -3741,6 +4848,20 @@ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, "node_modules/@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", @@ -3874,6 +4995,11 @@ "node": ">=6.5" } }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, "node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -3929,6 +5055,37 @@ "node": ">= 8.0.0" } }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/algo-msgpack-with-bigint": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz", @@ -4049,6 +5206,11 @@ "@scure/base": "~1.1.0" } }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -4091,6 +5253,24 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.1.tgz", + "integrity": "sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==", + "dependencies": { + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.1" + } + }, "node_modules/axios": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", @@ -4383,6 +5563,11 @@ "base-x": "^3.0.2" } }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4514,6 +5699,14 @@ "node-int64": "^0.4.0" } }, + "node_modules/bson": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.4.0.tgz", + "integrity": "sha512-WRZ5SQI5GfUuKnPTNmAYPiKIof3ORXAF4IRU5UcgmivNIon01rWQlw5RUH954dpu8yGL8T59YShVddIPaU/gFA==", + "engines": { + "node": ">=14.20.1" + } + }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -4883,6 +6076,14 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/copyfiles": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", @@ -5784,6 +6985,14 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -5867,11 +7076,20 @@ "node": "> 0.1.90" } }, + "node_modules/fast-content-type-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.0.0.tgz", + "integrity": "sha512-Xbc4XcysUXcsP5aHUU7Nq3OwvHq97C+WnbkeIefpeYLX+ryzFJlU6OStFJhs6Ol0LkUGpcK+wL0JwfM+FCU5IA==" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "optional": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", @@ -5879,11 +7097,40 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-json-stringify": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.8.0.tgz", + "integrity": "sha512-VVwK8CFMSALIvt14U8AvrSzQAwN/0vaVRiFFUVlpnXSnDGrSkOAO5MtzyN8oQNjLd5AqTW5OZRgyjoNuAuR3jQ==", + "dependencies": { + "@fastify/deepmerge": "^1.0.0", + "ajv": "^8.10.0", + "ajv-formats": "^2.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "rfdc": "^1.2.0" + } + }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/fast-stable-stringify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", @@ -5894,6 +7141,11 @@ "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" }, + "node_modules/fast-uri": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.2.0.tgz", + "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" + }, "node_modules/fast-xml-parser": { "version": "4.2.7", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.7.tgz", @@ -5916,6 +7168,56 @@ "fxparser": "src/cli/cli.js" } }, + "node_modules/fastify": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.21.0.tgz", + "integrity": "sha512-tsu4bcwE4HetxqW8prA5fbC9bKHMYDp7jGEDWyzK1l90a3uOaLoIcQbdGcWeODNLVJviQnzh1wvIjTZE3MJFEg==", + "dependencies": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.2.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.2.1", + "fast-content-type-parse": "^1.0.0", + "fast-json-stringify": "^5.7.0", + "find-my-way": "^7.6.0", + "light-my-request": "^5.9.1", + "pino": "^8.12.0", + "process-warning": "^2.2.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.5.0", + "semver": "^7.5.0", + "tiny-lru": "^11.0.1" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==" + }, + "node_modules/fastify/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -5958,6 +7260,19 @@ "node": ">=8" } }, + "node_modules/find-my-way": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.2.tgz", + "integrity": "sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -6030,6 +7345,14 @@ "node": ">= 6" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -6615,6 +7938,19 @@ "node": ">= 0.10" } }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", @@ -7549,6 +8885,27 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-schema-resolver": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-schema-resolver/-/json-schema-resolver-2.0.0.tgz", + "integrity": "sha512-pJ4XLQP4Q9HTxl6RVDLJ8Cyh1uitSs0CzDBAz1uoJ4sRD/Bk7cFSXL1FUXDW3zJ7YnfliJx6eu8Jn283bpZ4Yg==", + "dependencies": { + "debug": "^4.1.1", + "rfdc": "^1.1.4", + "uri-js": "^4.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/Eomm/json-schema-resolver?sponsor=1" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -7772,6 +9129,16 @@ "libsodium": "^0.7.11" } }, + "node_modules/light-my-request": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.10.0.tgz", + "integrity": "sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==", + "dependencies": { + "cookie": "^0.5.0", + "process-warning": "^2.0.0", + "set-cookie-parser": "^2.4.1" + } + }, "node_modules/limiter": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", @@ -8128,6 +9495,12 @@ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -8234,6 +9607,86 @@ "node": ">=10" } }, + "node_modules/mongodb": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.7.0.tgz", + "integrity": "sha512-zm82Bq33QbqtxDf58fLWBwTjARK3NSvKYjyz997KSy6hpat0prjeX/kxjbPVyZY60XYPDNETaHkHJI2UCzSLuw==", + "dependencies": { + "bson": "^5.4.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "saslprep": "^1.0.3" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.201.0", + "@mongodb-js/zstd": "^1.1.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -8449,6 +9902,11 @@ "node": ">= 0.4" } }, + "node_modules/on-exit-leak-free": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", + "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -8479,6 +9937,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==" + }, "node_modules/optimism": { "version": "0.17.5", "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.17.5.tgz", @@ -8683,6 +10146,56 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pino": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.15.0.tgz", + "integrity": "sha512-olUADJByk4twxccmAxb1RiGKOSvddHugCV3wkqjyv+3Sooa2KLrmXrKEWOKi0XPCLasRR5jBXxioE1jxUa4KzQ==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.0.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.1.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", + "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, "node_modules/pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", @@ -8753,12 +10266,25 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "optional": true }, + "node_modules/process-warning": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", + "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==" + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -8906,6 +10432,18 @@ "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -8935,6 +10473,14 @@ "pump": "^3.0.0" } }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, "node_modules/pure-rand": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", @@ -8951,6 +10497,11 @@ } ] }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -8995,6 +10546,14 @@ "integrity": "sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==", "optional": true }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -9020,6 +10579,14 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requizzle": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", @@ -9112,6 +10679,14 @@ "node": ">=8" } }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -9133,6 +10708,20 @@ "node": ">=12" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -9254,6 +10843,14 @@ } ] }, + "node_modules/safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "dependencies": { + "ret": "~0.2.0" + } + }, "node_modules/safe-stable-stringify": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", @@ -9262,6 +10859,18 @@ "node": ">=10" } }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", @@ -9281,6 +10890,11 @@ "node": ">=10.0.0" } }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -9290,6 +10904,11 @@ "semver": "bin/semver.js" } }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -9407,6 +11026,15 @@ "node": ">=8" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -9442,6 +11070,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sonic-boom": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", + "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9461,6 +11110,23 @@ "source-map": "^0.6.0" } }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -9613,8 +11279,7 @@ "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, "node_modules/stubs": { "version": "3.0.0", @@ -9706,6 +11371,14 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "node_modules/thread-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.0.tgz", + "integrity": "sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==", + "dependencies": { + "real-require": "^0.2.0" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -9757,6 +11430,14 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/tiny-lru": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.0.1.tgz", + "integrity": "sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==", + "engines": { + "node": ">=12" + } + }, "node_modules/tiny-secp256k1": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", @@ -10091,6 +11772,14 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/utf-8-validate": { "version": "5.0.10", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", @@ -10364,6 +12053,14 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/event-watcher/package.json b/event-watcher/package.json index a6235183..29528775 100644 --- a/event-watcher/package.json +++ b/event-watcher/package.json @@ -21,6 +21,7 @@ "read-firestore": "ts-node scripts/readFirestore.ts" }, "dependencies": { + "@aws-sdk/client-sns": "3.391.0", "@celo-tools/celo-ethers-wrapper": "^0.3.0", "@certusone/wormhole-sdk": "^0.9.22", "@fastify/swagger": "^8.8.0", diff --git a/event-watcher/src/common/arrays.ts b/event-watcher/src/common/arrays.ts new file mode 100644 index 00000000..4262f88c --- /dev/null +++ b/event-watcher/src/common/arrays.ts @@ -0,0 +1,7 @@ +export function chunkArray(arr: T[], size: number): T[][] { + const chunks = []; + for (let i = 0; i < arr.length; i += size) { + chunks.push(arr.slice(i, i + size)); + } + return chunks; +} diff --git a/event-watcher/src/common/consts.ts b/event-watcher/src/common/consts.ts new file mode 100644 index 00000000..16b12cd4 --- /dev/null +++ b/event-watcher/src/common/consts.ts @@ -0,0 +1,86 @@ +import { + ChainId, + ChainName, + coalesceChainName, +} from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; + +export const INITIAL_DEPLOYMENT_BLOCK_BY_CHAIN: { + [key in ChainName]?: string; +} = { + ethereum: '12959638', + terra: '4810000', // not sure exactly but this should be before the first known message + bsc: '9745450', + polygon: '20629146', + avalanche: '8237163', + oasis: '1757', + algorand: '22931277', + fantom: '31817467', + karura: '1824665', + acala: '1144161', + klaytn: '90563824', + celo: '12947144', + moonbeam: '1486591', + terra2: '399813', + injective: '20908376', + arbitrum: '18128584', + optimism: '69401779', + aptos: '0', // block is 1094390 but AptosWatcher uses sequence number instead + near: '72767136', + xpla: '777549', + solana: '94401321', // https://explorer.solana.com/tx/KhLy688yDxbP7xbXVXK7TGpZU5DAFHbYiaoX16zZArxvVySz8i8g7N7Ss2noQYoq9XRbg6HDzrQBjUfmNcSWwhe + sui: '1485552', // https://explorer.sui.io/txblock/671SoTvVUvBZQWKXeameDvAwzHQvnr8Nj7dR9MUwm3CV?network=https%3A%2F%2Frpc.mainnet.sui.io + base: '1422314', +}; + +export const TOKEN_BRIDGE_EMITTERS: { [key in ChainName]?: string } = { + solana: 'ec7372995d5cc8732397fb0ad35c0121e0eaa90d26f828a534cab54391b3a4f5', + ethereum: '0000000000000000000000003ee18b2214aff97000d974cf647e7c347e8fa585', + terra: '0000000000000000000000007cf7b764e38a0a5e967972c1df77d432510564e2', + terra2: 'a463ad028fb79679cfc8ce1efba35ac0e77b35080a1abe9bebe83461f176b0a3', + bsc: '000000000000000000000000b6f6d86a8f9879a9c87f643768d9efc38c1da6e7', + polygon: '0000000000000000000000005a58505a96d1dbf8df91cb21b54419fc36e93fde', + avalanche: '0000000000000000000000000e082f06ff657d94310cb8ce8b0d9a04541d8052', + oasis: '0000000000000000000000005848c791e09901b40a9ef749f2a6735b418d7564', + algorand: '67e93fa6c8ac5c819990aa7340c0c16b508abb1178be9b30d024b8ac25193d45', + aptos: '0000000000000000000000000000000000000000000000000000000000000001', + aurora: '00000000000000000000000051b5123a7b0f9b2ba265f9c4c8de7d78d52f510f', + fantom: '0000000000000000000000007c9fc5741288cdfdd83ceb07f3ea7e22618d79d2', + karura: '000000000000000000000000ae9d7fe007b3327aa64a32824aaac52c42a6e624', + acala: '000000000000000000000000ae9d7fe007b3327aa64a32824aaac52c42a6e624', + klaytn: '0000000000000000000000005b08ac39eaed75c0439fc750d9fe7e1f9dd0193f', + celo: '000000000000000000000000796dff6d74f3e27060b71255fe517bfb23c93eed', + near: '148410499d3fcda4dcfd68a1ebfcdddda16ab28326448d4aae4d2f0465cdfcb7', + moonbeam: '000000000000000000000000b1731c586ca89a23809861c6103f0b96b3f57d92', + arbitrum: '0000000000000000000000000b2402144bb366a632d14b83f244d2e0e21bd39c', + optimism: '0000000000000000000000001d68124e65fafc907325e3edbf8c4d84499daa8b', + xpla: '8f9cf727175353b17a5f574270e370776123d90fd74956ae4277962b4fdee24c', + injective: '00000000000000000000000045dbea4617971d93188eda21530bc6503d153313', + sui: 'ccceeb29348f71bdd22ffef43a2a19c1f5b5e17c5cca5411529120182672ade5', + base: '0000000000000000000000008d2de8d2f73F1F4cAB472AC9A881C9b123C79627', +}; + +export const isTokenBridgeEmitter = (chain: ChainId | ChainName, emitter: string) => + TOKEN_BRIDGE_EMITTERS[coalesceChainName(chain)] === emitter; + +export const NFT_BRIDGE_EMITTERS: { [key in ChainName]?: string } = { + solana: '0def15a24423e1edd1a5ab16f557b9060303ddbab8c803d2ee48f4b78a1cfd6b', + ethereum: '0000000000000000000000006ffd7ede62328b3af38fcd61461bbfc52f5651fe', + bsc: '0000000000000000000000005a58505a96d1dbf8df91cb21b54419fc36e93fde', + polygon: '00000000000000000000000090bbd86a6fe93d3bc3ed6335935447e75fab7fcf', + avalanche: '000000000000000000000000f7b6737ca9c4e08ae573f75a97b73d7a813f5de5', + oasis: '00000000000000000000000004952d522ff217f40b5ef3cbf659eca7b952a6c1', + aurora: '0000000000000000000000006dcc0484472523ed9cdc017f711bcbf909789284', + fantom: '000000000000000000000000a9c7119abda80d4a4e0c06c8f4d8cf5893234535', + karura: '000000000000000000000000b91e3638f82a1facb28690b37e3aae45d2c33808', + acala: '000000000000000000000000b91e3638f82a1facb28690b37e3aae45d2c33808', + klaytn: '0000000000000000000000003c3c561757baa0b78c5c025cdeaa4ee24c1dffef', + celo: '000000000000000000000000a6a377d75ca5c9052c9a77ed1e865cc25bd97bf3', + moonbeam: '000000000000000000000000453cfbe096c0f8d763e8c5f24b441097d577bde2', + arbitrum: '0000000000000000000000003dd14d553cfd986eac8e3bddf629d82073e188c8', + optimism: '000000000000000000000000fe8cd454b4a1ca468b57d79c0cc77ef5b6f64585', + aptos: '0000000000000000000000000000000000000000000000000000000000000005', + base: '000000000000000000000000DA3adC6621B2677BEf9aD26598e6939CF0D92f88', +}; + +export const isNFTBridgeEmitter = (chain: ChainId | ChainName, emitter: string) => + NFT_BRIDGE_EMITTERS[coalesceChainName(chain)] === emitter; diff --git a/event-watcher/src/common/index.ts b/event-watcher/src/common/index.ts new file mode 100644 index 00000000..36526a13 --- /dev/null +++ b/event-watcher/src/common/index.ts @@ -0,0 +1,3 @@ +export * from './arrays'; +export * from './consts'; +export * from './utils'; diff --git a/event-watcher/src/common/package.json b/event-watcher/src/common/package.json deleted file mode 100644 index 90f594e5..00000000 --- a/event-watcher/src/common/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "@wormhole-foundation/wormhole-monitor-common", - "version": "0.0.1", - "private": true, - "main": "dist/index.js", - "types": "dist/index.d.ts" -} diff --git a/event-watcher/src/common/tsconfig.json b/event-watcher/src/common/tsconfig.json deleted file mode 100644 index c17b0438..00000000 --- a/event-watcher/src/common/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../tsconfig.base.json", - "compilerOptions": { - "rootDir": "src", - "outDir": "dist" - }, - "include": ["src"] -} diff --git a/event-watcher/src/common/tsconfig.tsbuildinfo b/event-watcher/src/common/tsconfig.tsbuildinfo deleted file mode 100644 index 183074de..00000000 --- a/event-watcher/src/common/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"program":{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.es2021.d.ts","../node_modules/typescript/lib/lib.es2022.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.es2021.promise.d.ts","../node_modules/typescript/lib/lib.es2021.string.d.ts","../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../node_modules/typescript/lib/lib.es2021.intl.d.ts","../node_modules/typescript/lib/lib.es2022.array.d.ts","../node_modules/typescript/lib/lib.es2022.error.d.ts","../node_modules/typescript/lib/lib.es2022.intl.d.ts","../node_modules/typescript/lib/lib.es2022.object.d.ts","../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2022.string.d.ts","../node_modules/typescript/lib/lib.esnext.intl.d.ts","./src/arrays.ts","../node_modules/@certusone/wormhole-sdk/lib/cjs/utils/consts.d.ts","./src/consts.ts","./src/utils.ts","./src/index.ts","../node_modules/@types/aria-query/index.d.ts","../node_modules/@babel/types/lib/index.d.ts","../node_modules/@types/babel__generator/index.d.ts","../node_modules/@babel/parser/typings/babel-parser.d.ts","../node_modules/@types/babel__template/index.d.ts","../node_modules/@types/babel__traverse/index.d.ts","../node_modules/@types/babel__core/index.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/globals.global.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/bn.js/index.d.ts","../node_modules/@types/connect/index.d.ts","../node_modules/@types/body-parser/index.d.ts","../node_modules/@types/bonjour/index.d.ts","../node_modules/base-x/src/index.d.ts","../node_modules/@types/bs58/index.d.ts","../node_modules/keyv/src/index.d.ts","../node_modules/@types/http-cache-semantics/index.d.ts","../node_modules/@types/responselike/index.d.ts","../node_modules/@types/cacheable-request/index.d.ts","../node_modules/@types/range-parser/index.d.ts","../node_modules/@types/qs/index.d.ts","../node_modules/@types/express-serve-static-core/index.d.ts","../node_modules/@types/connect-history-api-fallback/index.d.ts","../node_modules/@types/duplexify/index.d.ts","../node_modules/@types/eslint/helpers.d.ts","../node_modules/@types/estree/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/eslint/index.d.ts","../node_modules/@types/eslint-scope/index.d.ts","../node_modules/@types/mime/mime.d.ts","../node_modules/@types/mime/index.d.ts","../node_modules/@types/serve-static/index.d.ts","../node_modules/@types/express/index.d.ts","../node_modules/@types/minimatch/index.d.ts","../node_modules/@types/glob/index.d.ts","../node_modules/@types/graceful-fs/index.d.ts","../node_modules/@types/html-minifier-terser/index.d.ts","../node_modules/@types/http-proxy/index.d.ts","../node_modules/@types/istanbul-lib-coverage/index.d.ts","../node_modules/@types/istanbul-lib-report/index.d.ts","../node_modules/@types/istanbul-reports/index.d.ts","../node_modules/@jest/expect-utils/build/index.d.ts","../node_modules/jest-matcher-utils/node_modules/chalk/index.d.ts","../node_modules/@sinclair/typebox/typebox.d.ts","../node_modules/@jest/schemas/build/index.d.ts","../node_modules/jest-diff/node_modules/pretty-format/build/index.d.ts","../node_modules/jest-diff/build/index.d.ts","../node_modules/jest-matcher-utils/build/index.d.ts","../node_modules/expect/build/index.d.ts","../node_modules/@types/jest/node_modules/pretty-format/build/index.d.ts","../node_modules/@types/jest/index.d.ts","../node_modules/@types/json5/index.d.ts","../node_modules/@types/jsonwebtoken/index.d.ts","../node_modules/@types/keyv/index.d.ts","../node_modules/@types/linkify-it/index.d.ts","../node_modules/@types/lodash/common/common.d.ts","../node_modules/@types/lodash/common/array.d.ts","../node_modules/@types/lodash/common/collection.d.ts","../node_modules/@types/lodash/common/date.d.ts","../node_modules/@types/lodash/common/function.d.ts","../node_modules/@types/lodash/common/lang.d.ts","../node_modules/@types/lodash/common/math.d.ts","../node_modules/@types/lodash/common/number.d.ts","../node_modules/@types/lodash/common/object.d.ts","../node_modules/@types/lodash/common/seq.d.ts","../node_modules/@types/lodash/common/string.d.ts","../node_modules/@types/lodash/common/util.d.ts","../node_modules/@types/lodash/index.d.ts","../node_modules/@types/lodash.values/index.d.ts","../node_modules/@types/long/index.d.ts","../node_modules/@types/mdurl/encode.d.ts","../node_modules/@types/mdurl/decode.d.ts","../node_modules/@types/mdurl/parse.d.ts","../node_modules/@types/mdurl/format.d.ts","../node_modules/@types/mdurl/index.d.ts","../node_modules/@types/markdown-it/lib/common/utils.d.ts","../node_modules/@types/markdown-it/lib/token.d.ts","../node_modules/@types/markdown-it/lib/rules_inline/state_inline.d.ts","../node_modules/@types/markdown-it/lib/helpers/parse_link_label.d.ts","../node_modules/@types/markdown-it/lib/helpers/parse_link_destination.d.ts","../node_modules/@types/markdown-it/lib/helpers/parse_link_title.d.ts","../node_modules/@types/markdown-it/lib/helpers/index.d.ts","../node_modules/@types/markdown-it/lib/ruler.d.ts","../node_modules/@types/markdown-it/lib/rules_block/state_block.d.ts","../node_modules/@types/markdown-it/lib/parser_block.d.ts","../node_modules/@types/markdown-it/lib/rules_core/state_core.d.ts","../node_modules/@types/markdown-it/lib/parser_core.d.ts","../node_modules/@types/markdown-it/lib/parser_inline.d.ts","../node_modules/@types/markdown-it/lib/renderer.d.ts","../node_modules/@types/markdown-it/lib/index.d.ts","../node_modules/@types/markdown-it/index.d.ts","../node_modules/@types/normalize-package-data/index.d.ts","../node_modules/@types/numeral/index.d.ts","../node_modules/@types/parse-json/index.d.ts","../node_modules/@types/pbkdf2/index.d.ts","../node_modules/@types/prettier/index.d.ts","../node_modules/@types/prop-types/index.d.ts","../node_modules/@types/q/index.d.ts","../node_modules/@types/react/global.d.ts","../node_modules/csstype/index.d.ts","../node_modules/@types/scheduler/tracing.d.ts","../node_modules/@types/react/index.d.ts","../node_modules/@types/react-dom/index.d.ts","../node_modules/@types/react-is/index.d.ts","../node_modules/@types/react-timeago/index.d.ts","../node_modules/@types/react-transition-group/transition.d.ts","../node_modules/@types/react-transition-group/csstransition.d.ts","../node_modules/@types/react-transition-group/transitiongroup.d.ts","../node_modules/@types/react-transition-group/switchtransition.d.ts","../node_modules/@types/react-transition-group/config.d.ts","../node_modules/@types/react-transition-group/index.d.ts","../node_modules/@types/resolve/index.d.ts","../node_modules/@types/retry/index.d.ts","../node_modules/@types/rimraf/index.d.ts","../node_modules/@types/scheduler/index.d.ts","../node_modules/@types/secp256k1/index.d.ts","../node_modules/@types/semver/classes/semver.d.ts","../node_modules/@types/semver/functions/parse.d.ts","../node_modules/@types/semver/functions/valid.d.ts","../node_modules/@types/semver/functions/clean.d.ts","../node_modules/@types/semver/functions/inc.d.ts","../node_modules/@types/semver/functions/diff.d.ts","../node_modules/@types/semver/functions/major.d.ts","../node_modules/@types/semver/functions/minor.d.ts","../node_modules/@types/semver/functions/patch.d.ts","../node_modules/@types/semver/functions/prerelease.d.ts","../node_modules/@types/semver/functions/compare.d.ts","../node_modules/@types/semver/functions/rcompare.d.ts","../node_modules/@types/semver/functions/compare-loose.d.ts","../node_modules/@types/semver/functions/compare-build.d.ts","../node_modules/@types/semver/functions/sort.d.ts","../node_modules/@types/semver/functions/rsort.d.ts","../node_modules/@types/semver/functions/gt.d.ts","../node_modules/@types/semver/functions/lt.d.ts","../node_modules/@types/semver/functions/eq.d.ts","../node_modules/@types/semver/functions/neq.d.ts","../node_modules/@types/semver/functions/gte.d.ts","../node_modules/@types/semver/functions/lte.d.ts","../node_modules/@types/semver/functions/cmp.d.ts","../node_modules/@types/semver/functions/coerce.d.ts","../node_modules/@types/semver/classes/comparator.d.ts","../node_modules/@types/semver/classes/range.d.ts","../node_modules/@types/semver/functions/satisfies.d.ts","../node_modules/@types/semver/ranges/max-satisfying.d.ts","../node_modules/@types/semver/ranges/min-satisfying.d.ts","../node_modules/@types/semver/ranges/to-comparators.d.ts","../node_modules/@types/semver/ranges/min-version.d.ts","../node_modules/@types/semver/ranges/valid.d.ts","../node_modules/@types/semver/ranges/outside.d.ts","../node_modules/@types/semver/ranges/gtr.d.ts","../node_modules/@types/semver/ranges/ltr.d.ts","../node_modules/@types/semver/ranges/intersects.d.ts","../node_modules/@types/semver/ranges/simplify.d.ts","../node_modules/@types/semver/ranges/subset.d.ts","../node_modules/@types/semver/internals/identifiers.d.ts","../node_modules/@types/semver/index.d.ts","../node_modules/@types/serve-index/index.d.ts","../node_modules/@types/sockjs/index.d.ts","../node_modules/@types/stack-utils/index.d.ts","../node_modules/@types/testing-library__jest-dom/matchers.d.ts","../node_modules/@types/testing-library__jest-dom/index.d.ts","../node_modules/@types/trusted-types/lib/index.d.ts","../node_modules/@types/trusted-types/index.d.ts","../node_modules/@types/ws/index.d.ts","../node_modules/@types/yargs-parser/index.d.ts","../node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9","746d62152361558ea6d6115cf0da4dd10ede041d14882ede3568bce5dc4b4f1f","d11a03592451da2d1065e09e61f4e2a9bf68f780f4f6623c18b57816a9679d17",{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"6c55633c733c8378db65ac3da7a767c3cf2cf3057f0565a9124a16a3a2019e87","affectsGlobalScope":true},{"version":"fb4416144c1bf0323ccbc9afb0ab289c07312214e8820ad17d709498c865a3fe","affectsGlobalScope":true},{"version":"5b0ca94ec819d68d33da516306c15297acec88efeb0ae9e2b39f71dbd9685ef7","affectsGlobalScope":true},{"version":"34c839eaaa6d78c8674ae2c37af2236dee6831b13db7b4ef4df3ec889a04d4f2","affectsGlobalScope":true},{"version":"34478567f8a80171f88f2f30808beb7da15eac0538ae91282dd33dce928d98ed","affectsGlobalScope":true},{"version":"ab7d58e6161a550ff92e5aff755dc37fe896245348332cd5f1e1203479fe0ed1","affectsGlobalScope":true},{"version":"6bda95ea27a59a276e46043b7065b55bd4b316c25e70e29b572958fa77565d43","affectsGlobalScope":true},{"version":"aedb8de1abb2ff1095c153854a6df7deae4a5709c37297f9d6e9948b6806fa66","affectsGlobalScope":true},{"version":"a4da0551fd39b90ca7ce5f68fb55d4dc0c1396d589b612e1902f68ee090aaada","affectsGlobalScope":true},{"version":"11ffe3c281f375fff9ffdde8bbec7669b4dd671905509079f866f2354a788064","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},{"version":"6b9b0348f633910684c37e9a30f142a3fc7693ccb737b7d54b813aaa627c818b","signature":"52f62d9b21a1338a978409fc105ccdaa63582c051f8f43c5baf936ed862683d9"},"717d75e718fc304940f50fa07d0fb73b68b44321d60c7f12e5f4182fccf16d5b",{"version":"20e9542d76ea76fd505a89d5fdeafd80fbe2009f7a79a5ef9124885c5a02d031","signature":"1ab6cdf8ecbab7117720a7b92a4cd95e50cae223067dd6dbda1ad175f7c21bf0"},{"version":"4b14399d80c216a0215ef5dc17e65b453b0e6cf7ae6cfe0e1e6717b69037288f","signature":"f667a2bdcc3454981da0546659caf715478d18a703215dca2b870214400d0d37"},"03a8d2639857d693705adbb073ac92792c6ec22ba6176b0e6f02da8eb3760c41","21522c0f405e58c8dd89cd97eb3d1aa9865ba017fde102d01f86ab50b44e5610","3078727fed04c123165efdb42deeac5dceaa42ac62216ca13cb809dc7e13415f","cc957354aa3c94c9961ebf46282cfde1e81d107fc5785a61f62c67f1dd3ac2eb","b4f76b34637d79cefad486127115fed843762c69512d7101b7096e1293699679","93de1c6dab503f053efe8d304cb522bb3a89feab8c98f307a674a4fae04773e9","dae3d1adc67ac3dbd1cd471889301339ec439837b5df565982345be20c8fca9a","b6ddf3a46ccfa4441d8be84d2e9bf3087573c48804196faedbd4a25b60631beb","7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"ca72190df0eb9b09d4b600821c8c7b6c9747b75a1c700c4d57dc0bb72abc074c","affectsGlobalScope":true},"21a167fec8f933752fb8157f06d28fab6817af3ad9b0bdb1908a10762391eab9",{"version":"bb65c6267c5d6676be61acbf6604cf0a4555ac4b505df58ac15c831fcbff4e3e","affectsGlobalScope":true},"0c0cee62cb619aed81133b904f644515ba3064487002a7da83fd8aa07b1b4abd","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","dab86d9604fe40854ef3c0a6f9e8948873dc3509213418e5e457f410fd11200f","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","489532ff54b714f0e0939947a1c560e516d3ae93d51d639ab02e907a0e950114","f30bb836526d930a74593f7b0f5c1c46d10856415a8f69e5e2fc3db80371e362","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"816ad2e607a96de5bcac7d437f843f5afd8957f1fa5eefa6bba8e4ed7ca8fd84","affectsGlobalScope":true},"cec36af22f514322f870e81d30675c78df82ae8bf4863f5fd4e4424c040c678d","d903fafe96674bc0b2ac38a5be4a8fc07b14c2548d1cdb165a80ea24c44c0c54","5eec82ac21f84d83586c59a16b9b8502d34505d1393393556682fe7e7fde9ef2","04eb6578a588d6a46f50299b55f30e3a04ef27d0c5a46c57d8fcc211cd530faa","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e8b18c6385ff784228a6f369694fcf1a6b475355ba89090a88de13587a9391d5","affectsGlobalScope":true},"d076fede3cb042e7b13fc29442aaa03a57806bc51e2b26a67a01fbc66a7c0c12","7c013aa892414a7fdcfd861ae524a668eaa3ede8c7c0acafaf611948122c8d93","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"b3624aed92dab6da8484280d3cb3e2f4130ec3f4ef3f8201c95144ae9e898bb6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","fd93cee2621ff42dabe57b7be402783fd1aa69ece755bcba1e0290547ae60513","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","223c37f62ce09a3d99e77498acdee7b2705a4ae14552fbdb4093600cd9164f3f",{"version":"970a90f76d4d219ad60819d61f5994514087ba94c985647a3474a5a3d12714ed","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","4c8525f256873c7ba3135338c647eaf0ca7115a1a2805ae2d0056629461186ce","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"f0900cd5d00fe1263ff41201fb8073dbeb984397e4af3b8002a5c207a30bdc33","affectsGlobalScope":true},{"version":"4c50342e1b65d3bee2ed4ab18f84842d5724ad11083bd666d8705dc7a6079d80","affectsGlobalScope":true},"06d7c42d256f0ce6afe1b2b6cfbc97ab391f29dadb00dd0ae8e8f23f5bc916c3","ec4bd1b200670fb567920db572d6701ed42a9641d09c4ff6869768c8f81b404c","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"da26af7362f53d122283bc69fed862b9a9fe27e01bc6a69d1d682e0e5a4df3e6","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"8dbe725f8d237e70310977afcfa011629804d101ebaa0266cafda6b61ad72236","01f7828047b5c6703d3c601473618b448f5506a88fcac852638b0715c3abf4eb","6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","d78e5898c8de5e0f934eee83f680262de005caa268d137101b833fd932f95e07","e91751abb2372a36a90869d36f6ad5d5e69a84c5513ca99d236554e4dd8b9aa1","5cbc27193321e6ba10f4e9f3c5519649d9e2716cf103efd7eaa7a89e0f8ed1d4","92edb6e257fa64d3baae647490e041912684f5dc1f243d0aedd60b4b383ff50b","cab425b5559edac18327eb2c3c0f47e7e9f71b667290b7689faafd28aac69eae","3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","f992cd6cc0bcbaa4e6c810468c90f2d8595f8c6c3cf050c806397d3de8585562","16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc",{"version":"a34eb69d404f1db719580115825bd7ba837023effe04d235bdbb2e0168df7451","affectsGlobalScope":true},"56cbe80e6c42d7e6e66b6f048add8b01c663797b843a074d9f19c4a3d63a269a","a70fd46ef73cf2d0b2d20578091d2ab7d41781866cd2ecc0ceca17a9c399c195",{"version":"64d4b35c5456adf258d2cf56c341e203a073253f229ef3208fc0d5020253b241","affectsGlobalScope":true},"946bd1737d9412395a8f24414c70f18660b84a75a12b0b448e6eb1a2161d06dd","f3e604694b624fa3f83f6684185452992088f5efb2cf136b62474aa106d6f1b6","e793f85164d47950e32731e98897e3e6b285339c5fa1b3a3ddd1711a54f371b1","e050a0afcdbb269720a900c85076d18e0c1ab73e580202a2bf6964978181222a","5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","f47887b61c6cf2f48746980390d6cb5b8013518951d912cfb37fe748071942be","15c88bfd1b8dc7231ff828ae8df5d955bae5ebca4cf2bcb417af5821e52299ae","963d59066dd6742da1918a6213a209bcc205b8ee53b1876ee2b4e6d80f97c85e","9c5c92b7fb8c38ff1b46df69701f2d1ea8e2d6468e3cd8f73d8af5e6f7864576","bf88ef4208a770ca39a844b182b3695df536326ea566893fdc5b8418702a331e","ee65fe452abe1309389c5f50710f24114e08a302d40708101c4aa950a2a7d044","54c9959f2d8ba97a5fcc4345ac2fca6f1bc20fe5764570b7fef37bea107bc70b","8b06ac3faeacb8484d84ddb44571d8f410697f98d7bfa86c0fda60373a9f5215","7eb06594824ada538b1d8b48c3925a83e7db792f47a081a62cf3e5c4e23cf0ee","f5638f7c2f12a9a1a57b5c41b3c1ea7db3876c003bab68e6a57afd6bcc169af0","763e521cf114b80e0dd0e21ca49b9f8ae62e8999555a5e7bade8ce36b33001c2","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","3054ef91b855e005b9c4681399e9d64d2a7b07a22d539314d794f09e53b876a7","ffcc5500e77223169833fc6eb59b3a507944a1f89574e0a1276b0ea7fc22c4a4","22f13de9e2fe5f0f4724797abd3d34a1cdd6e47ef81fc4933fea3b8bf4ad524b","e3ba509d3dce019b3190ceb2f3fc88e2610ab717122dabd91a9efaa37804040d","cda0cb09b995489b7f4c57f168cd31b83dcbaa7aad49612734fb3c9c73f6e4f2","f72f8428f3c1caa22e9c247d046603b85b442c0dae7b77a7a0bc092c18867cb7","22f13de9e2fe5f0f4724797abd3d34a1cdd6e47ef81fc4933fea3b8bf4ad524b",{"version":"195f63105abc03e72b6a176e3e34dfb5ac932b55db378fdc7874b1617e24b465","affectsGlobalScope":true},"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","bb4ed283cfb3db7ec1d4bb79c37f5e96d39b340f1f4de995c4b0b836c8d5fa05","fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","6503fb6addf62f9b10f8564d9869ad824565a914ec1ac3dd7d13da14a3f57036","675e702f2032766a91eeadee64f51014c64688525da99dccd8178f0c599f13a8","458111fc89d11d2151277c822dfdc1a28fa5b6b2493cf942e37d4cd0a6ee5f22","d70c026dd2eeaa974f430ea229230a1897fdb897dc74659deebe2afd4feeb08f","187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","febf0b2de54781102b00f61653b21377390a048fbf5262718c91860d11ff34a6","98f9d826db9cd99d27a01a59ee5f22863df00ccf1aaf43e1d7db80ebf716f7c3","0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","dcd91d3b697cb650b95db5471189b99815af5db2a1cd28760f91e0b12ede8ed5","3c92b6dfd43cc1c2485d9eba5ff0b74a19bb8725b692773ef1d66dac48cda4bd","3cf0d343c2276842a5b617f22ba82af6322c7cfe8bb52238ffc0c491a3c21019","df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9",{"version":"f2eff8704452659641164876c1ef0df4174659ce7311b0665798ea3f556fa9ad","affectsGlobalScope":true},"92333622cbd6efbbf54972a1bcdda706846bdc85d1ee60c97733729fca3e77a8","0e60e0cbf2283adfd5a15430ae548cd2f662d581b5da6ecd98220203e7067c70","f313731860257325f13351575f381fef333d4dfe30daf5a2e72f894208feea08","951b37f7d86f6012f09e6b35f1de57c69d75f16908cb0adaa56b93675ea0b853","3816fc03ffd9cbd1a7a3362a264756a4a1d547caabea50ca68303046be40e376","0c417b4ec46b88fb62a43ec00204700b560d01eb5677c7faa8ecd34610f096a8","13d29cdeb64e8496424edf42749bbb47de5e42d201cf958911a4638cbcffbd3f","0f9e381eecc5860f693c31fe463b3ca20a64ca9b8db0cf6208cd4a053f064809","95902d5561c6aac5dfc40568a12b0aca324037749dcd32a81f23423bfde69bab","5dfb2aca4136abdc5a2740f14be8134a6e6b66fd53470bb2e954e40f8abfaf3e","577463167dd69bd81f76697dfc3f7b22b77a6152f60a602a9218e52e3183ad67","b8396e9024d554b611cbe31a024b176ba7116063d19354b5a02dccd8f0118989","4b28e1c5bf88d891e07a1403358b81a51b3ba2eae1ffada51cca7476b5ac6407","7150ad575d28bf98fae321a1c0f10ad17b127927811f488ded6ff1d88d4244e5","8b155c4757d197969553de3762c8d23d5866710301de41e1b66b97c9ed867003","93733466609dd8bf72eace502a24ca7574bd073d934216e628f1b615c8d3cb3c","45e9228761aabcadb79c82fb3008523db334491525bdb8e74e0f26eaf7a4f7f4","aeacac2778c9821512b6b889da79ac31606a863610c8f28da1e483579627bf90","569fdb354062fc098a6a3ba93a029edf22d6fe480cf72b231b3c07832b2e7c97","bf9876e62fb7f4237deafab8c7444770ef6e82b4cad2d5dc768664ff340feeb2","6cf60e76d37faf0fbc2f80a873eab0fd545f6b1bf300e7f0823f956ddb3083e9","6adaa6103086f931e3eee20f0987e86e8879e9d13aa6bd6075ccfc58b9c5681c","ee0af0f2b8d3b4d0baf669f2ff6fcef4a8816a473c894cc7c905029f7505fed0","6fa0008bf91a4cc9c8963bace4bba0bd6865cbfa29c3e3ccc461155660fb113a","6fa3e5c1ec318544cb1331065d6a15c63960793dd6f8e9c0db8b0e28ab0b174d","2b8264b2fefd7367e0f20e2c04eed5d3038831fe00f5efbc110ff0131aab899b","a73a445c1e0a6d0f8b48e8eb22dc9d647896783a7f8991cbbc31c0d94bf1f5a2","bc88e4049153bc4dddb4503ed7e624eb141edfa9064b3659d6c86e900fe9e621","6a386ff939f180ae8ef064699d8b7b6e62bc2731a62d7fbf5e02589383838dea","62b931417104c7cb35d0725e1869f51d52d7b18462fd58f32f846a314a42ba10",{"version":"bbdf156fea2fabed31a569445835aeedcc33643d404fcbaa54541f06c109df3f","affectsGlobalScope":true},"1c29793071152b207c01ea1954e343be9a44d85234447b2b236acae9e709a383","f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5",{"version":"7fb6faf1006c3503d44e4922c8c65772ddc98e92bad7c2ae2d5db123f3e297b3","affectsGlobalScope":true},"d035565d969404edfb3dfce8a2e762fbed98f6dfd7388ac01af173aa1ef665bd","06c2fc0bf929858d3ee5fb8c14f0a39b48d91bb8161b6480d833f787df761672","963a77366bebd3537fc4c10980c9aba6776c3ac0f9ad5f8d6bd867c46bac2dc1","30688eab034d1aa3bbe4d8f2c7f462ddaec9f30f1a38a306a4728a9a06a58b11","e03334588c63840b7054accd0b90f29c5890db6a6555ac0869a78a23297f1396","c3052485f32a96bfde75a2976c1238995522584ba464f04ff16a8a40af5e50d1","c220410b8e956fa157ce4e5e6ac871f0f433aa120c334d906ff1f5e2c7369e95","960a68ced7820108787135bdae5265d2cc4b511b7dcfd5b8f213432a8483daf1","5e8db4872785292074b394d821ae2fc10e4f8edc597776368aebbe8aefb24422","8a19491eba2108d5c333c249699f40aff05ad312c04a17504573b27d91f0aede","199f9ead0daf25ae4c5632e3d1f42570af59685294a38123eef457407e13f365","f4cf5f0ad1cfb0ceebbe4fbe8aaf0aa728e899c99cc36ec6c0c4b8f6e8a84c83","74b0245c42990ed8a849df955db3f4362c81b13f799ebc981b7bec2d5b414a57","3dce33e7eb25594863b8e615f14a45ab98190d85953436750644212d8a18c066","2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","77c1d91a129ba60b8c405f9f539e42df834afb174fe0785f89d92a2c7c16b77a","7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","6aee496bf0ecfbf6731aa8cca32f4b6e92cdc0a444911a7d88410408a45ecc5d","acebfe99678cf7cddcddc3435222cf132052b1226e902daac9fbb495c321a9b5","82b1f9a6eefef7386aebe22ac49f23b806421e82dbf35c6e5b7132d79e4165da","b0d10e46cfe3f6c476b69af02eaa38e4ccc7430221ce3109ae84bb9fb8282298","49c972b1c491933723861f15cba6ae694466abfd0938ca4f366621127bb51962",{"version":"910199067bfd07a4605bf51001677680e1691f8d403e9d410c0fe33a6079cd58","affectsGlobalScope":true},"2fcd2d22b1f30555e785105597cd8f57ed50300e213c4f1bbca6ae149f782c38",{"version":"3c150a2e1758724811db3bdc5c773421819343b1627714e09f29b1f40a5dfb26","affectsGlobalScope":true},"bc81aff061c53a7140270555f4b22da4ecfe8601e8027cf5aa175fbdc7927c31","70e9a18da08294f75bf23e46c7d69e67634c0765d355887b9b41f0d959e1426e","ae84439d1ae42b30ced3df38c4285f35b805be40dfc95b0647d0e59c70b11f97"],"options":{"composite":true,"declaration":true,"esModuleInterop":true,"module":1,"noFallthroughCasesInSwitch":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":99},"fileIdsList":[[112],[55,112],[54,56,57,112],[60,112],[112,154],[60,61,62,63,64,112],[60,62,112],[112,119],[85,112,119,121],[76,112,119],[112,124],[82,85,111,112,119,126,127,128],[111,112,119,132],[85,112,119],[100,112,119],[112,136,138],[112,135,136,137],[82,85,112,119,130,131],[112,122,131,132,142],[82,83,112,119,144],[83,112,119],[82,85,87,90,100,111,112,119],[112,149],[112,150],[112,156,159],[112,155],[82,112,119],[112,178],[112,166,168,169,170,171,172,173,174,175,176,177,178],[112,166,167,169,170,171,172,173,174,175,176,177,178],[112,167,168,169,170,171,172,173,174,175,176,177,178],[112,166,167,168,170,171,172,173,174,175,176,177,178],[112,166,167,168,169,171,172,173,174,175,176,177,178],[112,166,167,168,169,170,172,173,174,175,176,177,178],[112,166,167,168,169,170,171,173,174,175,176,177,178],[112,166,167,168,169,170,171,172,174,175,176,177,178],[112,166,167,168,169,170,171,172,173,175,176,177,178],[112,166,167,168,169,170,171,172,173,174,176,177,178],[112,166,167,168,169,170,171,172,173,174,175,177,178],[112,166,167,168,169,170,171,172,173,174,175,176,178],[112,166,167,168,169,170,171,172,173,174,175,176,177],[112,200],[112,185],[112,189,190,191],[112,188],[112,190],[112,165,186,187,192,195,197,198,199],[112,187,193,194,200],[112,193,196],[112,187,188,193,200],[112,187,200],[112,181,182,183,184],[112,140],[112,141],[66,112],[69,112],[70,75,103,112],[71,82,83,90,100,111,112],[71,72,82,90,112],[73,112],[74,75,83,91,112],[75,100,108,112],[76,78,82,90,112],[77,112],[78,79,112],[82,112],[80,82,112],[82,83,84,100,111,112],[82,83,84,97,100,103,112],[112,116],[78,85,90,100,111,112],[82,83,85,86,90,100,108,111,112],[85,87,100,108,111,112],[66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118],[82,88,112],[89,111,112],[78,82,90,100,112],[91,112],[92,112],[69,93,112],[94,110,112,116],[95,112],[96,112],[82,97,98,112],[97,99,112,114],[70,82,100,101,102,103,112],[70,100,102,112],[100,101,112],[103,112],[104,112],[82,106,107,112],[106,107,112],[75,90,100,108,112],[109,112],[90,110,112],[70,85,96,111,112],[75,112],[100,112,113],[112,114],[112,115],[70,75,82,84,93,100,111,112,114,116],[100,112,117],[112,212],[112,212,216],[112,216,217,218,219,220],[112,207,209,210,211],[85,100,112,119],[83,112,119,145],[112,227,266],[112,227,251,266],[112,266],[112,227],[112,227,252,266],[112,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265],[112,252,266],[83,112,143],[85,112,119,141],[112,161,270],[112,272],[82,85,87,90,100,108,111,112,117,119],[112,275],[112,152,158],[112,156],[112,153,157],[55]],"referencedMap":[[54,1],[56,2],[58,3],[57,1],[62,4],[60,1],[55,1],[152,1],[155,5],[154,1],[59,1],[65,6],[61,4],[63,7],[64,4],[120,8],[122,9],[123,10],[125,11],[129,12],[133,13],[121,14],[134,15],[139,16],[135,1],[138,17],[136,1],[132,18],[143,19],[145,20],[146,21],[147,1],[127,1],[148,22],[149,1],[150,23],[151,24],[161,25],[160,26],[137,1],[162,1],[163,8],[164,27],[165,1],[179,28],[167,29],[168,30],[166,31],[169,32],[170,33],[171,34],[172,35],[173,36],[174,37],[175,38],[176,39],[177,40],[178,41],[180,1],[201,42],[186,43],[192,44],[190,1],[189,45],[191,46],[200,47],[195,48],[197,49],[198,50],[199,51],[193,1],[194,51],[196,51],[188,51],[187,1],[182,1],[181,1],[184,43],[185,52],[183,43],[141,53],[140,54],[144,1],[66,55],[67,55],[69,56],[70,57],[71,58],[72,59],[73,60],[74,61],[75,62],[76,63],[77,64],[78,65],[79,65],[81,66],[80,67],[82,66],[83,68],[84,69],[68,70],[118,1],[85,71],[86,72],[87,73],[119,74],[88,75],[89,76],[90,77],[91,78],[92,79],[93,80],[94,81],[95,82],[96,83],[97,84],[98,84],[99,85],[100,86],[102,87],[101,88],[103,89],[104,90],[105,1],[106,91],[107,92],[108,93],[109,94],[110,95],[111,96],[112,97],[113,98],[114,99],[115,100],[116,101],[117,102],[202,1],[203,1],[204,1],[205,8],[206,1],[207,1],[208,1],[131,1],[130,1],[213,103],[214,103],[215,103],[220,1],[217,104],[221,105],[219,103],[216,103],[218,104],[209,1],[212,106],[222,8],[128,107],[223,1],[224,108],[225,1],[211,1],[226,8],[251,109],[252,110],[227,111],[230,111],[249,109],[250,109],[240,109],[239,112],[237,109],[232,109],[245,109],[243,109],[247,109],[231,109],[244,109],[248,109],[233,109],[234,109],[246,109],[228,109],[235,109],[236,109],[238,109],[242,109],[253,113],[241,109],[229,109],[266,114],[265,1],[260,113],[262,115],[261,113],[254,113],[255,113],[257,113],[259,113],[263,115],[264,115],[256,115],[258,115],[267,116],[142,117],[268,14],[269,1],[271,118],[270,1],[273,119],[272,1],[274,120],[275,1],[276,121],[124,8],[210,1],[159,122],[157,123],[156,26],[158,124],[153,1],[126,66],[11,1],[10,1],[2,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[3,1],[4,1],[23,1],[20,1],[21,1],[22,1],[24,1],[25,1],[26,1],[5,1],[27,1],[28,1],[29,1],[30,1],[6,1],[34,1],[31,1],[32,1],[33,1],[35,1],[7,1],[36,1],[41,1],[42,1],[37,1],[38,1],[39,1],[40,1],[8,1],[46,1],[43,1],[44,1],[45,1],[47,1],[9,1],[48,1],[49,1],[50,1],[51,1],[52,1],[1,1],[53,1]],"exportedModulesMap":[[56,125],[58,3],[62,4],[60,1],[55,1],[152,1],[155,5],[154,1],[59,1],[65,6],[61,4],[63,7],[64,4],[120,8],[122,9],[123,10],[125,11],[129,12],[133,13],[121,14],[134,15],[139,16],[135,1],[138,17],[136,1],[132,18],[143,19],[145,20],[146,21],[147,1],[127,1],[148,22],[149,1],[150,23],[151,24],[161,25],[160,26],[137,1],[162,1],[163,8],[164,27],[165,1],[179,28],[167,29],[168,30],[166,31],[169,32],[170,33],[171,34],[172,35],[173,36],[174,37],[175,38],[176,39],[177,40],[178,41],[180,1],[201,42],[186,43],[192,44],[190,1],[189,45],[191,46],[200,47],[195,48],[197,49],[198,50],[199,51],[193,1],[194,51],[196,51],[188,51],[187,1],[182,1],[181,1],[184,43],[185,52],[183,43],[141,53],[140,54],[144,1],[66,55],[67,55],[69,56],[70,57],[71,58],[72,59],[73,60],[74,61],[75,62],[76,63],[77,64],[78,65],[79,65],[81,66],[80,67],[82,66],[83,68],[84,69],[68,70],[118,1],[85,71],[86,72],[87,73],[119,74],[88,75],[89,76],[90,77],[91,78],[92,79],[93,80],[94,81],[95,82],[96,83],[97,84],[98,84],[99,85],[100,86],[102,87],[101,88],[103,89],[104,90],[105,1],[106,91],[107,92],[108,93],[109,94],[110,95],[111,96],[112,97],[113,98],[114,99],[115,100],[116,101],[117,102],[202,1],[203,1],[204,1],[205,8],[206,1],[207,1],[208,1],[131,1],[130,1],[213,103],[214,103],[215,103],[220,1],[217,104],[221,105],[219,103],[216,103],[218,104],[209,1],[212,106],[222,8],[128,107],[223,1],[224,108],[225,1],[211,1],[226,8],[251,109],[252,110],[227,111],[230,111],[249,109],[250,109],[240,109],[239,112],[237,109],[232,109],[245,109],[243,109],[247,109],[231,109],[244,109],[248,109],[233,109],[234,109],[246,109],[228,109],[235,109],[236,109],[238,109],[242,109],[253,113],[241,109],[229,109],[266,114],[265,1],[260,113],[262,115],[261,113],[254,113],[255,113],[257,113],[259,113],[263,115],[264,115],[256,115],[258,115],[267,116],[142,117],[268,14],[269,1],[271,118],[270,1],[273,119],[272,1],[274,120],[275,1],[276,121],[124,8],[210,1],[159,122],[157,123],[156,26],[158,124],[153,1],[126,66],[11,1],[10,1],[2,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[3,1],[4,1],[23,1],[20,1],[21,1],[22,1],[24,1],[25,1],[26,1],[5,1],[27,1],[28,1],[29,1],[30,1],[6,1],[34,1],[31,1],[32,1],[33,1],[35,1],[7,1],[36,1],[41,1],[42,1],[37,1],[38,1],[39,1],[40,1],[8,1],[46,1],[43,1],[44,1],[45,1],[47,1],[9,1],[48,1],[49,1],[50,1],[51,1],[52,1],[1,1],[53,1]],"semanticDiagnosticsPerFile":[54,56,58,57,62,60,55,152,155,154,59,65,61,63,64,120,122,123,125,129,133,121,134,139,135,138,136,132,143,145,146,147,127,148,149,150,151,161,160,137,162,163,164,165,179,167,168,166,169,170,171,172,173,174,175,176,177,178,180,201,186,192,190,189,191,200,195,197,198,199,193,194,196,188,187,182,181,184,185,183,141,140,144,66,67,69,70,71,72,73,74,75,76,77,78,79,81,80,82,83,84,68,118,85,86,87,119,88,89,90,91,92,93,94,95,96,97,98,99,100,102,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,202,203,204,205,206,207,208,131,130,213,214,215,220,217,221,219,216,218,209,212,222,128,223,224,225,211,226,251,252,227,230,249,250,240,239,237,232,245,243,247,231,244,248,233,234,246,228,235,236,238,242,253,241,229,266,265,260,262,261,254,255,257,259,263,264,256,258,267,142,268,269,271,270,273,272,274,275,276,124,210,159,157,156,158,153,126,11,10,2,12,13,14,15,16,17,18,19,3,4,23,20,21,22,24,25,26,5,27,28,29,30,6,34,31,32,33,35,7,36,41,42,37,38,39,40,8,46,43,44,45,47,9,48,49,50,51,52,1,53],"latestChangedDtsFile":"./dist/index.d.ts"},"version":"4.9.4"} \ No newline at end of file diff --git a/event-watcher/src/common/utils.ts b/event-watcher/src/common/utils.ts new file mode 100644 index 00000000..d511de9e --- /dev/null +++ b/event-watcher/src/common/utils.ts @@ -0,0 +1,15 @@ +export async function sleep(timeout: number) { + return new Promise((resolve) => setTimeout(resolve, timeout)); +} +export const assertEnvironmentVariable = (varName: string) => { + if (varName in process.env) return process.env[varName]!; + throw new Error(`Missing required environment variable: ${varName}`); +}; +export const MAX_UINT_16 = '65535'; +export const padUint16 = (s: string): string => s.padStart(MAX_UINT_16.length, '0'); +export const MAX_UINT_64 = '18446744073709551615'; +export const padUint64 = (s: string): string => s.padStart(MAX_UINT_64.length, '0'); + +// make a bigtable row key for the `signedVAAs` table +export const makeSignedVAAsRowKey = (chain: number, emitter: string, sequence: string): string => + `${padUint16(chain.toString())}/${emitter}/${padUint64(sequence)}`; diff --git a/event-watcher/src/consts.ts b/event-watcher/src/consts.ts index dc1fc545..658547c9 100644 --- a/event-watcher/src/consts.ts +++ b/event-watcher/src/consts.ts @@ -26,7 +26,7 @@ export const TIMEOUT = 0.5 * 1000; export const RPCS_BY_CHAIN: { [key in ChainName]?: string } = { ethereum: process.env.ETH_RPC || 'https://svc.blockdaemon.com/ethereum/mainnet/native', - bsc: process.env.BSC_RPC || 'https://bsc-dataseed2.defibit.io', + bsc: 'https://bsc-dataseed2.defibit.io', polygon: 'https://rpc.ankr.com/polygon', avalanche: 'https://rpc.ankr.com/avalanche', oasis: 'https://emerald.oasis.dev', @@ -75,9 +75,10 @@ export const DB_LAST_BLOCK_FILE = process.env.DB_LAST_BLOCK_FILE || './lastBlock // without this, axios request will error `Z_BUF_ERROR`: https://github.com/axios/axios/issues/5346 export const AXIOS_CONFIG_JSON: AxiosRequestConfig = { - headers: { 'Accept-Encoding': 'application/json', - 'Authorization': 'Bearer zpka_213d294a9a5a44619cd6a02e55a20417_5f43e4d0' - }, + headers: { + 'Accept-Encoding': 'application/json', + Authorization: 'Bearer zpka_213d294a9a5a44619cd6a02e55a20417_5f43e4d0', + }, }; export const GUARDIAN_RPC_HOSTS = [ diff --git a/event-watcher/src/databases/BigtableDatabase.ts b/event-watcher/src/databases/BigtableDatabase.ts deleted file mode 100644 index 5b276590..00000000 --- a/event-watcher/src/databases/BigtableDatabase.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { ChainName, coalesceChainId } from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; -import { parseVaa } from '@certusone/wormhole-sdk/lib/cjs/vaa/wormhole'; -import { Bigtable } from '@google-cloud/bigtable'; -import { - assertEnvironmentVariable, - chunkArray, - sleep, -} from '../common'; -import { cert, initializeApp } from 'firebase-admin/app'; -import { getFirestore } from 'firebase-admin/firestore'; -import { Database } from './Database'; -import { - BigtableMessagesResultRow, - BigtableMessagesRow, - BigtableSignedVAAsResultRow, - BigtableSignedVAAsRow, - BigtableVAAsByTxHashRow, - VaasByBlock, -} from './types'; -import { - makeMessageId, - makeVAAsByTxHashRowKey, - makeSignedVAAsRowKey, - parseMessageId, -} from './utils'; -import { getSignedVAA } from '../utils/getSignedVAA'; -import { PubSub } from '@google-cloud/pubsub'; - -const WATCH_MISSING_TIMEOUT = 5 * 60 * 1000; - -export class BigtableDatabase extends Database { - msgTableId: string; - signedVAAsTableId: string; - vaasByTxHashTableId: string; - instanceId: string; - bigtable: Bigtable; - firestoreDb: FirebaseFirestore.Firestore; - latestCollectionName: string; - pubsubSignedVAATopic: string; - pubsub: PubSub; - constructor() { - super(); - this.msgTableId = assertEnvironmentVariable('BIGTABLE_TABLE_ID'); - this.signedVAAsTableId = assertEnvironmentVariable('BIGTABLE_SIGNED_VAAS_TABLE_ID'); - this.vaasByTxHashTableId = assertEnvironmentVariable('BIGTABLE_VAAS_BY_TX_HASH_TABLE_ID'); - this.instanceId = assertEnvironmentVariable('BIGTABLE_INSTANCE_ID'); - this.latestCollectionName = assertEnvironmentVariable('FIRESTORE_LATEST_COLLECTION'); - this.pubsubSignedVAATopic = assertEnvironmentVariable('PUBSUB_SIGNED_VAA_TOPIC'); - try { - this.bigtable = new Bigtable(); - const serviceAccount = require(assertEnvironmentVariable('FIRESTORE_ACCOUNT_KEY_PATH')); - initializeApp({ - credential: cert(serviceAccount), - }); - this.firestoreDb = getFirestore(); - this.pubsub = new PubSub(); - } catch (e) { - throw new Error('Could not load bigtable db'); - } - } - - async getLastBlockByChain(chain: ChainName): Promise { - const chainId = coalesceChainId(chain); - const lastObservedBlock = this.firestoreDb - .collection(this.latestCollectionName) - .doc(chainId.toString()); - const lastObservedBlockByChain = await lastObservedBlock.get(); - const blockKeyData = lastObservedBlockByChain.data(); - const lastBlockKey = blockKeyData?.lastBlockKey; - if (lastBlockKey) { - this.logger.info(`for chain=${chain}, found most recent firestore block=${lastBlockKey}`); - const tokens = lastBlockKey.split('/'); - return chain === 'aptos' ? tokens.at(-1) : tokens[0]; - } - return null; - } - - async storeLatestBlock(chain: ChainName, lastBlockKey: string): Promise { - if (this.firestoreDb === undefined) { - this.logger.error('no firestore db set'); - return; - } - const chainId = coalesceChainId(chain); - this.logger.info(`storing last block=${lastBlockKey} for chain=${chainId}`); - const lastObservedBlock = this.firestoreDb - .collection(this.latestCollectionName) - .doc(`${chainId.toString()}`); - await lastObservedBlock.set({ lastBlockKey }); - } - - async storeVaasByBlock( - chain: ChainName, - vaasByBlock: VaasByBlock, - updateLatestBlock: boolean = true - ): Promise { - if (this.bigtable === undefined) { - this.logger.warn('no bigtable instance set'); - return; - } - const chainId = coalesceChainId(chain); - const filteredBlocks = BigtableDatabase.filterEmptyBlocks(vaasByBlock); - const instance = this.bigtable.instance(this.instanceId); - const table = instance.table(this.msgTableId); - const vaasByTxHashTable = instance.table(this.vaasByTxHashTableId); - const rowsToInsert: BigtableMessagesRow[] = []; - const vaasByTxHash: { [key: string]: string[] } = {}; - Object.keys(filteredBlocks).forEach((blockKey) => { - const [block, timestamp] = blockKey.split('/'); - filteredBlocks[blockKey].forEach((msgKey) => { - const [txHash, vaaKey] = msgKey.split(':'); - const [, emitter, seq] = vaaKey.split('/'); - rowsToInsert.push({ - key: makeMessageId(chainId, block, emitter, seq), - data: { - info: { - timestamp: { - value: timestamp, - // write 0 timestamp to only keep 1 cell each - // https://cloud.google.com/bigtable/docs/gc-latest-value - timestamp: '0', - }, - txHash: { - value: txHash, - timestamp: '0', - }, - hasSignedVaa: { - value: 0, - timestamp: '0', - }, - }, - }, - }); - const txHashRowKey = makeVAAsByTxHashRowKey(txHash, chainId); - const vaaRowKey = makeSignedVAAsRowKey(chainId, emitter, seq); - vaasByTxHash[txHashRowKey] = [...(vaasByTxHash[txHashRowKey] || []), vaaRowKey]; - }); - }); - const txHashRowsToInsert = Object.entries(vaasByTxHash).map( - ([txHashRowKey, vaaRowKeys]) => ({ - key: txHashRowKey, - data: { - info: { - vaaKeys: { value: JSON.stringify(vaaRowKeys), timestamp: '0' }, - }, - }, - }) - ); - await Promise.all([table.insert(rowsToInsert), vaasByTxHashTable.insert(txHashRowsToInsert)]); - - if (updateLatestBlock) { - // store latest vaasByBlock to firestore - const blockKeys = Object.keys(vaasByBlock).sort( - (bk1, bk2) => Number(bk1.split('/')[0]) - Number(bk2.split('/')[0]) - ); - if (blockKeys.length) { - const lastBlockKey = blockKeys[blockKeys.length - 1]; - this.logger.info(`for chain=${chain}, storing last bigtable block=${lastBlockKey}`); - await this.storeLatestBlock(chain, lastBlockKey); - } - } - } - - async updateMessageStatuses(messageKeys: string[], value: number = 1): Promise { - const instance = this.bigtable.instance(this.instanceId); - const table = instance.table(this.msgTableId); - const chunkedMessageKeys = chunkArray(messageKeys, 1000); - for (const chunk of chunkedMessageKeys) { - const rowsToInsert: BigtableMessagesRow[] = chunk.map((id) => ({ - key: id, - data: { - info: { - hasSignedVaa: { - value: value, - timestamp: '0', - }, - }, - }, - })); - // console.log(rowsToInsert[0].data.info) - await table.insert(rowsToInsert); - } - } - - async fetchMissingVaaMessages(): Promise { - const instance = this.bigtable.instance(this.instanceId); - const messageTable = instance.table(this.msgTableId); - // TODO: how to filter to only messages with hasSignedVaa === 0 - const observedMessages = (await messageTable.getRows())[0] as BigtableMessagesResultRow[]; - const missingVaaMessages = observedMessages.filter( - (x) => x.data.info.hasSignedVaa?.[0].value === 0 - ); - return missingVaaMessages; - } - - async watchMissing(): Promise { - const instance = this.bigtable.instance(this.instanceId); - const signedVAAsTable = instance.table(this.signedVAAsTableId); - while (true) { - try { - // this array first stores all of the messages which are missing VAAs - // messages which we find VAAs for are then pruned from the array - // lastly we try to fetch VAAs for the messages in the pruned array from the guardians - const missingVaaMessages = await this.fetchMissingVaaMessages(); - const total = missingVaaMessages.length; - this.logger.info(`locating ${total} messages with hasSignedVAA === 0`); - let found = 0; - const chunkedVAAIds = chunkArray( - missingVaaMessages.map((observedMessage) => { - const { chain, emitter, sequence } = parseMessageId(observedMessage.id); - return makeSignedVAAsRowKey(chain, emitter, sequence.toString()); - }), - 1000 - ); - let chunkNum = 0; - const foundKeys: string[] = []; - for (const chunk of chunkedVAAIds) { - this.logger.info(`processing chunk ${++chunkNum} of ${chunkedVAAIds.length}`); - const vaaRows = ( - await signedVAAsTable.getRows({ - keys: chunk, - decode: false, - }) - )[0] as BigtableSignedVAAsResultRow[]; - for (const row of vaaRows) { - try { - const vaaBytes = row.data.info.bytes[0].value; - const parsed = parseVaa(vaaBytes); - const matchingIndex = missingVaaMessages.findIndex((observedMessage) => { - const { chain, emitter, sequence } = parseMessageId(observedMessage.id); - if ( - parsed.emitterChain === chain && - parsed.emitterAddress.toString('hex') === emitter && - parsed.sequence === sequence - ) { - return true; - } - }); - if (matchingIndex !== -1) { - found++; - // remove matches to keep array lean - // messages with missing VAAs will be kept in the array - const [matching] = missingVaaMessages.splice(matchingIndex, 1); - foundKeys.push(matching.id); - } - } catch (e) {} - } - } - this.logger.info(`processed ${total} messages, found ${found}, missing ${total - found}`); - this.updateMessageStatuses(foundKeys); - // attempt to fetch VAAs missing from messages from the guardians and store them - // this is useful for cases where the VAA doesn't exist in the `signedVAAsTable` (perhaps due to an outage) but is available - const missingSignedVAARows: BigtableSignedVAAsRow[] = []; - for (const msg of missingVaaMessages) { - const { chain, emitter, sequence } = parseMessageId(msg.id); - const seq = sequence.toString(); - const vaaBytes = await getSignedVAA(chain, emitter, seq); - if (vaaBytes) { - const key = makeSignedVAAsRowKey(chain, emitter, seq); - missingSignedVAARows.push({ - key, - data: { - info: { - bytes: { value: vaaBytes, timestamp: '0' }, - }, - }, - }); - } - } - this.storeSignedVAAs(missingSignedVAARows); - this.publishSignedVAAs(missingSignedVAARows.map((r) => r.key)); - // TODO: add slack message alerts - } catch (e) { - this.logger.error(e); - } - await sleep(WATCH_MISSING_TIMEOUT); - } - } - - async storeSignedVAAs(rows: BigtableSignedVAAsRow[]): Promise { - const instance = this.bigtable.instance(this.instanceId); - const table = instance.table(this.signedVAAsTableId); - const chunks = chunkArray(rows, 1000); - for (const chunk of chunks) { - await table.insert(chunk); - this.logger.info(`wrote ${chunk.length} signed VAAs to the ${this.signedVAAsTableId} table`); - } - } - - async publishSignedVAAs(keys: string[]): Promise { - if (keys.length === 0) { - return; - } - try { - const topic = this.pubsub.topic(this.pubsubSignedVAATopic); - if (!(await topic.exists())) { - this.logger.error(`pubsub topic doesn't exist: ${this.publishSignedVAAs}`); - return; - } - for (const key of keys) { - await topic.publishMessage({ data: Buffer.from(key) }); - } - this.logger.info( - `published ${keys.length} signed VAAs to pubsub topic: ${this.pubsubSignedVAATopic}` - ); - } catch (e) { - this.logger.error(`pubsub error - ${e}`); - } - } -} diff --git a/event-watcher/src/databases/Database.ts b/event-watcher/src/databases/Database.ts index f0401ff2..09e9ebfe 100644 --- a/event-watcher/src/databases/Database.ts +++ b/event-watcher/src/databases/Database.ts @@ -1,6 +1,6 @@ import { ChainName } from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; import { getLogger, WormholeLogger } from '../utils/logger'; -import { VaasByBlock } from './types'; +import { VaaLog, VaasByBlock } from './types'; export class Database { logger: WormholeLogger; @@ -14,10 +14,20 @@ export class Database { } return filteredVaasByBlock; } + async getLastBlockByChain(chain: ChainName): Promise { throw new Error('Not Implemented'); } + async storeVaasByBlock(chain: ChainName, vaasByBlock: VaasByBlock): Promise { throw new Error('Not Implemented'); } + + async storeVaaLogs(chain: ChainName, vaaLogs: VaaLog[]): Promise { + throw new Error('Not Implemented'); + } + + async storeLatestProcessBlock(chain: ChainName, lastBlock: number): Promise { + throw new Error('Not Implemented'); + } } diff --git a/event-watcher/src/databases/MongoDB.ts b/event-watcher/src/databases/MongoDB.ts index 3588e7e8..d2826189 100644 --- a/event-watcher/src/databases/MongoDB.ts +++ b/event-watcher/src/databases/MongoDB.ts @@ -1,80 +1,105 @@ import { ChainName, coalesceChainId } from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; -import { readFileSync, writeFileSync } from 'fs'; -import { DB_LAST_BLOCK_FILE, JSON_DB_FILE } from '../consts'; import { Database } from './Database'; -import { DB, LastBlockByChain, VaasByBlock } from './types'; -import * as mongoDB from "mongodb"; -import { SequenceNumber } from '@mysten/sui.js'; +import { LastBlockByChain, VaaLog, VaasByBlock } from './types'; +import * as mongoDB from 'mongodb'; -export const collections: { wormholeTx?: mongoDB.Collection } = {} - -const ENCODING = 'utf8'; +const WORMHOLE_TX_COLLECTION: string = 'wormholeTx'; +const WORMHOLE_LAST_BLOCK_COLLECTION: string = 'lastBlockByChain'; export class MongoDatabase extends Database { - lastBlockByChain: LastBlockByChain; - dbFile: string; - dbLastBlockFile: string; - client: mongoDB.MongoClient; - db: mongoDB.Db; - wormholeTx: mongoDB.Collection; + private client: mongoDB.MongoClient | null = null; + private db: mongoDB.Db | null = null; + private wormholeTx: mongoDB.Collection | null = null; + private lastTxBlockByChain: mongoDB.Collection | null = null; + private lastBlockByChain: LastBlockByChain | null = null; + constructor() { super(); - this.client = new mongoDB.MongoClient("mongodb://localhost:27017"); - this.client.connect(); - this.db = this.client.db("wormhole"); - this.wormholeTx = this.db.collection("wormholeTx"); - - // collections.games = gamesCollection; - - console.log(`Successfully connected to database: ${this.db.databaseName} `); - //this.db = client.db("wormhole"); - this.lastBlockByChain = {}; - if (!process.env.DB_LAST_BLOCK_FILE) { - this.logger.info(`no db file set, using default path=${DB_LAST_BLOCK_FILE}`); - } - this.dbFile = JSON_DB_FILE; - this.dbLastBlockFile = DB_LAST_BLOCK_FILE; + this.lastBlockByChain = null; try { - const rawLast = readFileSync(this.dbLastBlockFile, ENCODING); - this.lastBlockByChain = JSON.parse(rawLast); + this.client = new mongoDB.MongoClient(process.env.MONGODB_URI as string); + this.connectDB(); + this.db = this.client.db(process.env.MONGODB_DATABASE ?? 'wormhole'); + this.wormholeTx = this.db.collection(WORMHOLE_TX_COLLECTION); + this.lastTxBlockByChain = this.db.collection(WORMHOLE_LAST_BLOCK_COLLECTION); } catch (e) { - this.logger.warn('Failed to load DB, initiating a fresh one.'); + throw new Error(`(MongoDB) Error: ${e}`); } } + async connectDB() { + await this.client?.connect(); + console.log(`Successfully connected to database: ${this.db?.databaseName} `); + } + + async getLastBlockByChainFromDB() { + const latestBlocks = await this.lastTxBlockByChain?.findOne({}); + const json = JSON.parse(JSON.stringify(latestBlocks)); + this.lastBlockByChain = json; + } + async getLastBlockByChain(chain: ChainName): Promise { + if (!this.lastBlockByChain) await this.getLastBlockByChainFromDB(); + const chainId = coalesceChainId(chain); - const blockInfo = this.lastBlockByChain[chainId]; + const blockInfo: string | undefined = this.lastBlockByChain?.[chainId]; + if (blockInfo) { - const tokens = blockInfo.split('/'); + const tokens = String(blockInfo)?.split('/'); return chain === 'aptos' ? tokens.at(-1)! : tokens[0]; } + return null; } + async storeVaasByBlock(chain: ChainName, vaasByBlock: VaasByBlock): Promise { - const chainId = coalesceChainId(chain); - const filteredVaasByBlock = Database.filterEmptyBlocks(vaasByBlock); - if (Object.keys(filteredVaasByBlock).length) { - } - + // const chainId = coalesceChainId(chain); + // const filteredVaasByBlock = Database.filterEmptyBlocks(vaasByBlock); + // if (Object.keys(filteredVaasByBlock).length) { + // } // this will always overwrite the "last" block, so take caution if manually backfilling gaps - const blockKeys = Object.keys(vaasByBlock).sort( - (bk1, bk2) => Number(bk1.split('/')[0]) - Number(bk2.split('/')[0]) - ); - if (blockKeys.length) { - this.lastBlockByChain[chainId] = blockKeys[blockKeys.length - 1]; - this.wormholeTx.insertOne({chainId: chainId, block: this.lastBlockByChain[chainId], data: vaasByBlock}); - - //writeFileSync(this.dbLastBlockFile, JSON.stringify(this.lastBlockByChain), ENCODING); - } + // const blockKeys = Object.keys(vaasByBlock).sort( + // (bk1, bk2) => Number(bk1.split('/')[0]) - Number(bk2.split('/')[0]), + // ); + // if (blockKeys.length) { + // this.lastBlockByChain[chainId] = blockKeys[blockKeys.length - 1]; + // await this.wormholeTx.insertOne({ + // chainId: chainId, + // block: this.lastBlockByChain[chainId], + // data: vaasByBlock, + // }); + // } } - async storeVaa(chain: ChainName, txHash: string, vaa_id:string, payload: string): Promise { + async storeVaaLogs(chain: ChainName, vaaLogs: VaaLog[]): Promise { + await this.wormholeTx?.insertMany(vaaLogs); + } + + async storeLatestProcessBlock(chain: ChainName, lastBlock: number): Promise { const chainId = coalesceChainId(chain); - this.wormholeTx.insertOne({chainId: chainId, txHash: txHash, vaa_id: vaa_id, payload: payload}); + + await this.lastTxBlockByChain?.findOneAndUpdate( + {}, + { + $set: { + [chainId]: lastBlock, + updatedAt: new Date().getTime(), + }, + }, + { + upsert: true, + }, + ); } - + async storeVaa(chain: ChainName, txHash: string, vaa_id: string, payload: string): Promise { + const chainId = coalesceChainId(chain); + this.wormholeTx?.insertOne({ + chainId: chainId, + txHash: txHash, + vaa_id: vaa_id, + payload: payload, + }); + } } - diff --git a/event-watcher/src/databases/types.ts b/event-watcher/src/databases/types.ts index 1f02f7e9..da43a84e 100644 --- a/event-watcher/src/databases/types.ts +++ b/event-watcher/src/databases/types.ts @@ -1,5 +1,16 @@ import { ChainId } from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; import { Row } from '@google-cloud/bigtable'; +export type VaaLog = { + id: string; + chainId: number; + chainName: string; + emitter: string; + sequence: number; + txHash: string; + sender: string; + payload: any; + blockNumber: number; +}; export type VaasByBlock = { [blockInfo: string]: string[] }; export type DB = { [chain in ChainId]?: VaasByBlock }; export type LastBlockByChain = { [chain in ChainId]?: string }; diff --git a/event-watcher/src/databases/utils.ts b/event-watcher/src/databases/utils.ts index ab5ed992..089571a9 100644 --- a/event-watcher/src/databases/utils.ts +++ b/event-watcher/src/databases/utils.ts @@ -1,15 +1,9 @@ import { ChainId, ChainName, coalesceChainId } from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; -import { - INITIAL_DEPLOYMENT_BLOCK_BY_CHAIN, - MAX_UINT_64, - padUint16, - padUint64, -} from '../common'; +import { INITIAL_DEPLOYMENT_BLOCK_BY_CHAIN, MAX_UINT_64, padUint16, padUint64 } from '../common'; import { DB_SOURCE } from '../consts'; -import { BigtableDatabase } from './BigtableDatabase'; import { Database } from './Database'; import { JsonDatabase } from './JsonDatabase'; -import { VaasByBlock } from './types'; +import { VaaLog, VaasByBlock } from './types'; import { MongoDatabase } from './MongoDB'; // Bigtable Message ID format @@ -20,10 +14,10 @@ export function makeMessageId( chainId: number, block: string, emitter: string, - sequence: string + sequence: string, ): string { return `${padUint16(chainId.toString())}/${padUint64( - (BigInt(MAX_UINT_64) - BigInt(block)).toString() + (BigInt(MAX_UINT_64) - BigInt(block)).toString(), )}/${emitter}/${padUint64(sequence)}`; } @@ -49,7 +43,7 @@ export const makeVaaKey = ( transactionHash: string, chain: ChainId | ChainName, emitter: string, - seq: string + seq: string, ): string => `${transactionHash}:${coalesceChainId(chain)}/${emitter}/${seq}`; // make a bigtable row key for the `vaasByTxHash` table @@ -62,10 +56,7 @@ export const makeSignedVAAsRowKey = (chain: number, emitter: string, sequence: s let database: Database = new Database(); export const initDb = (): Database => { - if (DB_SOURCE === 'bigtable') { - database = new BigtableDatabase(); - (database as BigtableDatabase).watchMissing(); - } else if (DB_SOURCE === 'mongo') { + if (DB_SOURCE === 'mongo') { database = new MongoDatabase(); } else { database = new JsonDatabase(); @@ -76,6 +67,7 @@ export const initDb = (): Database => { export const getResumeBlockByChain = async (chain: ChainName): Promise => { const lastBlock = await database.getLastBlockByChain(chain); const initialBlock = INITIAL_DEPLOYMENT_BLOCK_BY_CHAIN[chain]; + return lastBlock !== null ? Number(lastBlock) + 1 : initialBlock !== undefined @@ -85,11 +77,19 @@ export const getResumeBlockByChain = async (chain: ChainName): Promise => { return database.storeVaasByBlock(chain, vaasByBlock); }; +export const storeVaaLogs = (chain: ChainName, vaaLogs: VaaLog[]): Promise => { + return database.storeVaaLogs(chain, vaaLogs); +}; + +export const storeLatestProcessBlock = (chain: ChainName, lastBlock: number): Promise => { + return database.storeLatestProcessBlock(chain, lastBlock); +}; + export function printRow(rowkey: string, rowData: { [x: string]: any }) { console.log(`Reading data for ${rowkey}:`); diff --git a/event-watcher/src/index.ts b/event-watcher/src/index.ts index 22ec637c..f1b014a0 100644 --- a/event-watcher/src/index.ts +++ b/event-watcher/src/index.ts @@ -1,60 +1,74 @@ import * as dotenv from 'dotenv'; dotenv.config(); -import { ChainName } from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; +import { ChainName, EVMChainName } from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; import { initDb } from './databases/utils'; import { makeFinalizedWatcher } from './watchers/utils'; -import { InfrastructureController } from "./infrastructure/infrastructure.controller"; -import { createServer } from "./builder/server"; +import { InfrastructureController } from './infrastructure/infrastructure.controller'; +import { createServer } from './builder/server'; +// EVM Chains not supported +// aurora, gnosis, neon, sepolia -initDb(); +const evmChains: EVMChainName[] = [ + 'acala', + 'arbitrum', + 'avalanche', + 'base', + 'bsc', + 'celo', + 'ethereum', + 'fantom', + 'karura', + 'klaytn', + 'moonbeam', + 'oasis', + 'optimism', + 'polygon', +]; +const supportedChains: ChainName[] = [ + ...evmChains, + 'algorand', + 'aptos', + 'injective', + 'near', + 'solana', + 'sui', + 'terra', + 'terra2', + 'xpla', +]; + +const db = initDb(); const infrastructureController = new InfrastructureController(); const startServer = async () => { const port = Number(process.env.PORT) || 3005; - const server = await createServer(port); + const server = await createServer(port); - server.get("/ready", { logLevel: "silent" }, infrastructureController.ready); - server.get("/health",{ logLevel: "silent" }, infrastructureController.health); + server.get('/ready', { logLevel: 'silent' }, infrastructureController.ready); + server.get('/health', { logLevel: 'silent' }, infrastructureController.health); - server.listen({ port, host: "0.0.0.0" }, (err: any, address: any) => { + server.listen({ port, host: '0.0.0.0' }, (err: any, address: any) => { if (err) { process.exit(1); } console.log(`Server listening at ${address}`); }); -} +}; startServer(); -const supportedChains: ChainName[] = [ - 'solana', - 'ethereum', - 'bsc', - 'polygon', - 'avalanche', - 'oasis', - 'algorand', - 'fantom', - 'karura', - 'acala', - 'klaytn', - 'celo', - 'moonbeam', - 'arbitrum', - 'optimism', - 'aptos', - 'near', - 'terra2', - 'terra', - 'xpla', - 'injective', - 'sui', - 'base', -]; +const start = async () => { + // We wait to the database to fetch the `latestBlocks` (avoid multi requests) + // Im trying not to change too much the codebase. + await db.getLastBlockByChain('unset'); -for (const chain of supportedChains) { - makeFinalizedWatcher(chain).watch(); -} + // for (const chain of supportedChains) { + for (const chain of evmChains) { + makeFinalizedWatcher(chain).watch(); + } +}; + +start(); diff --git a/event-watcher/src/services/SNS/AwsSNS/index.ts b/event-watcher/src/services/SNS/AwsSNS/index.ts new file mode 100644 index 00000000..178c2960 --- /dev/null +++ b/event-watcher/src/services/SNS/AwsSNS/index.ts @@ -0,0 +1,109 @@ +import crypto from 'node:crypto'; +import { + SNSClient, + PublishCommand, + PublishCommandInput, + PublishBatchCommand, + PublishBatchCommandInput, + PublishBatchRequestEntry, +} from '@aws-sdk/client-sns'; +import { SNSConfig, SNSImplementation, SNSInput, SNSPublishMessageOutput } from '../types'; + +class AwsSNS implements SNSImplementation { + private client: SNSClient | null = null; + private subject: string | null = null; + private topicArn: string | null = null; + + constructor(private config: SNSConfig) { + const { region, credentials, subject, topicArn } = this.config; + + this.subject = subject; + this.topicArn = topicArn; + this.client = new SNSClient({ + region, + credentials, + }); + } + + async publishMessage({ subject, message }: SNSInput): Promise { + const input: PublishCommandInput = { + TopicArn: this.topicArn!, + Subject: subject ?? this.subject!, + Message: message, + }; + + try { + const command = new PublishCommand(input); + await this.client?.send(command); + } catch (error) { + console.error(error); + + return { + status: 'error', + }; + } + + return { + status: 'success', + }; + } + + async publishMessages(messages: SNSInput[]): Promise { + const CHUNK_SIZE = 10; + const batches: PublishBatchCommandInput[] = []; + const inputs: PublishBatchRequestEntry[] = messages.map(({ subject, message }) => ({ + Id: crypto.randomUUID(), + Subject: subject ?? this.subject!, + Message: message, + })); + + // PublishBatchCommand: only supports max 10 items per batch + for (let i = 0; i <= inputs.length; i += CHUNK_SIZE) { + const batch: PublishBatchCommandInput = { + TopicArn: this.topicArn!, + PublishBatchRequestEntries: inputs.slice(i, i + CHUNK_SIZE), + }; + + batches.push(batch); + } + + try { + const promises = []; + const errors = []; + for (const batch of batches) { + const command = new PublishBatchCommand(batch); + promises.push(this.client?.send(command)); + } + + const results = await Promise.allSettled(promises); + + for (const result of results) { + if (result.status !== 'fulfilled') { + console.error(result.reason); + errors.push(result.reason); + } + } + + if (errors.length > 0) { + console.error(errors); + + return { + status: 'error', + reasons: errors, + }; + } + } catch (error) { + console.error(error); + + return { + status: 'error', + }; + } + + return { + status: 'success', + }; + } +} + +export default AwsSNS; diff --git a/event-watcher/src/services/SNS/types.ts b/event-watcher/src/services/SNS/types.ts new file mode 100644 index 00000000..7a090027 --- /dev/null +++ b/event-watcher/src/services/SNS/types.ts @@ -0,0 +1,25 @@ +export interface SNSImplementation { + publishMessage(message: SNSInput): Promise; + publishMessages(messages: SNSInput[]): Promise; +} + +export interface SNSConfig { + region: string; + topicArn: string; + subject: string; + credentials: { + accessKeyId: string; + secretAccessKey: string; + }; +} + +export interface SNSInput { + subject?: string; + message: string; +} + +export interface SNSPublishMessageOutput { + status: 'success' | 'error'; + reason?: string; + reasons?: string[]; +} diff --git a/event-watcher/src/watchers/EVMWatcher.ts b/event-watcher/src/watchers/EVMWatcher.ts index a78a5ed1..df8acd8a 100644 --- a/event-watcher/src/watchers/EVMWatcher.ts +++ b/event-watcher/src/watchers/EVMWatcher.ts @@ -1,10 +1,14 @@ import { Implementation__factory } from '@certusone/wormhole-sdk/lib/cjs/ethers-contracts/factories/Implementation__factory'; -import { CONTRACTS, EVMChainName } from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; +import { + CONTRACTS, + EVMChainName, + coalesceChainId, +} from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; import { Log } from '@ethersproject/abstract-provider'; import axios from 'axios'; import { BigNumber } from 'ethers'; import { AXIOS_CONFIG_JSON, RPCS_BY_CHAIN } from '../consts'; -import { VaasByBlock } from '../databases/types'; +import { VaaLog, VaasByBlock } from '../databases/types'; import { makeBlockKey, makeVaaKey } from '../databases/utils'; import { Watcher } from './Watcher'; @@ -60,14 +64,8 @@ export class EVMWatcher extends Watcher { false, ], }, - { - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer zpka_213d294a9a5a44619cd6a02e55a20417_5f43e4d0' - } - } ], - AXIOS_CONFIG_JSON + AXIOS_CONFIG_JSON, ) )?.data?.[0]; if (result && result.result === null) { @@ -100,7 +98,7 @@ export class EVMWatcher extends Watcher { }; } throw new Error( - `Unable to parse result of eth_getBlockByNumber for ${blockNumberOrTag} on ${rpc}` + `Unable to parse result of eth_getBlockByNumber for ${blockNumberOrTag} on ${rpc}`, ); } async getBlocks(fromBlock: number, toBlock: number): Promise { @@ -151,20 +149,20 @@ export class EVMWatcher extends Watcher { } console.error(reqs[idx], response, idx); throw new Error( - `Unable to parse result of eth_getBlockByNumber for ${fromBlock + idx} on ${rpc}` + `Unable to parse result of eth_getBlockByNumber for ${fromBlock + idx} on ${rpc}`, ); - } + }, ); } throw new Error( - `Unable to parse result of eth_getBlockByNumber for range ${fromBlock}-${toBlock} on ${rpc}` + `Unable to parse result of eth_getBlockByNumber for range ${fromBlock}-${toBlock} on ${rpc}`, ); } async getLogs( fromBlock: number, toBlock: number, address: string, - topics: string[] + topics: string[], ): Promise> { const rpc = RPCS_BY_CHAIN[this.chain]; if (!rpc) { @@ -188,7 +186,7 @@ export class EVMWatcher extends Watcher { ], }, ], - AXIOS_CONFIG_JSON + AXIOS_CONFIG_JSON, ) )?.data?.[0]?.result; if (result) { @@ -227,11 +225,12 @@ export class EVMWatcher extends Watcher { vaasByBlock[makeBlockKey(block.number.toString(), timestamp)] = []; } this.logger.info(`processing ${logs.length} logs`); + for (const log of logs) { const blockNumber = log.blockNumber; const emitter = log.topics[1].slice(2); const { - args: { sequence }, + args: { sequence, sender, payload }, } = wormholeInterface.parseLog(log); const vaaKey = makeVaaKey(log.transactionHash, this.chain, emitter, sequence.toString()); const blockKey = makeBlockKey(blockNumber.toString(), timestampsByBlock[blockNumber]); @@ -239,4 +238,46 @@ export class EVMWatcher extends Watcher { } return vaasByBlock; } + + async getVaaLogs(fromBlock: number, toBlock: number): Promise { + const vaaLogs: VaaLog[] = []; + const address = CONTRACTS.MAINNET[this.chain].core; + + if (!address) { + throw new Error(`Core contract not defined for ${this.chain}`); + } + + // this.logger.info(`fetching info for blocks ${fromBlock} to ${toBlock}`); + const logs = await this.getLogs(fromBlock, toBlock, address, [LOG_MESSAGE_PUBLISHED_TOPIC]); + this.logger.info(`processing ${logs.length} logs`); + + for (const log of logs) { + // console.log('log', log); + // console.log('parseLog', wormholeInterface.parseLog(log)); + + const { args } = wormholeInterface.parseLog(log); + const { sequence, sender, payload } = args || {}; + const chainName = this.chain; + const blockNumber = log.blockNumber; + const emitter = log.topics[1].slice(2); + const chainId = coalesceChainId(this.chain); + const vaaId = `${chainId}/${emitter}/${sequence.toString()}`; + + const vaaLog: VaaLog = { + id: vaaId, + chainName, + chainId, + emitter, + sequence: sequence.toString(), + txHash: log.transactionHash, + sender, + payload, + blockNumber, + }; + + vaaLogs.push(vaaLog); + } + + return vaaLogs; + } } diff --git a/event-watcher/src/watchers/Watcher.ts b/event-watcher/src/watchers/Watcher.ts index 9254fbf1..582c826c 100644 --- a/event-watcher/src/watchers/Watcher.ts +++ b/event-watcher/src/watchers/Watcher.ts @@ -1,22 +1,38 @@ import { ChainName } from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; -import { - INITIAL_DEPLOYMENT_BLOCK_BY_CHAIN, - sleep, -} from '../common'; +import { INITIAL_DEPLOYMENT_BLOCK_BY_CHAIN, sleep } from '../common'; import { z } from 'zod'; import { TIMEOUT } from '../consts'; -import { VaasByBlock } from '../databases/types'; -import { getResumeBlockByChain, storeVaasByBlock } from '../databases/utils'; +import { VaaLog, VaasByBlock } from '../databases/types'; +import { + getResumeBlockByChain, + storeVaaLogs, + storeVaasByBlock, + storeLatestProcessBlock, +} from '../databases/utils'; import { getLogger, WormholeLogger } from '../utils/logger'; +import AwsSNS from '../services/SNS/AwsSNS'; +import { SNSConfig, SNSInput } from '../services/SNS/types'; + +const config: SNSConfig = { + region: process.env.AWS_SNS_REGION as string, + subject: process.env.AWS_SNS_SUBJECT as string, + topicArn: process.env.AWS_TOPIC_ARN as string, + credentials: { + accessKeyId: process.env.AWS_ACCESS_KEY_ID as string, + secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY as string, + }, +}; export class Watcher { chain: ChainName; logger: WormholeLogger; maximumBatchSize: number = 100; + SNSClient: AwsSNS; constructor(chain: ChainName) { this.chain = chain; this.logger = getLogger(chain); + this.SNSClient = new AwsSNS(config); } async getFinalizedBlockNumber(): Promise { @@ -27,6 +43,10 @@ export class Watcher { throw new Error('Not Implemented'); } + async getVaaLogs(fromBlock: number, toBlock: number): Promise { + throw new Error('Not Implemented'); + } + isValidBlockKey(key: string) { try { const [block, timestamp] = key.split('/'); @@ -51,16 +71,36 @@ export class Watcher { let toBlock: number | null = null; let fromBlock: number | null = await getResumeBlockByChain(this.chain); let retry = 0; + while (true) { try { if (fromBlock !== null && toBlock !== null && fromBlock <= toBlock) { // fetch logs for the block range, inclusive of toBlock toBlock = Math.min(fromBlock + this.maximumBatchSize - 1, toBlock); this.logger.info(`fetching messages from ${fromBlock} to ${toBlock}`); - const vaasByBlock = await this.getMessagesForBlocks(fromBlock, toBlock); - await storeVaasByBlock(this.chain, vaasByBlock); + + // const vaasByBlock = await this.getMessagesForBlocks(fromBlock, toBlock); + // await storeVaasByBlock(this.chain, vaasByBlock); + + // Here we get all the vaa logs from LOG_MESSAGE_PUBLISHED_TOPIC + // Then store the latest processed block by Chain Id + try { + const vaaLogs = await this.getVaaLogs(fromBlock, toBlock); + if (vaaLogs?.length > 0) { + await storeVaaLogs(this.chain, vaaLogs); + const messages: SNSInput[] = vaaLogs.map((log) => ({ + message: JSON.stringify({ ...log }), + })); + this.SNSClient.publishMessages(messages); + } + await storeLatestProcessBlock(this.chain, toBlock); + } catch (e) { + this.logger.error(e); + } + fromBlock = toBlock + 1; } + try { this.logger.info('fetching finalized block'); toBlock = await this.getFinalizedBlockNumber(); diff --git a/event-watcher/src/watchers/utils.ts b/event-watcher/src/watchers/utils.ts index 575e6443..8dff53ac 100644 --- a/event-watcher/src/watchers/utils.ts +++ b/event-watcher/src/watchers/utils.ts @@ -1,4 +1,4 @@ -import { ChainName } from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; +import { ChainName, EVMChainName } from '@certusone/wormhole-sdk/lib/cjs/utils/consts'; import { AlgorandWatcher } from './AlgorandWatcher'; import { AptosWatcher } from './AptosWatcher'; import { ArbitrumWatcher } from './ArbitrumWatcher'; @@ -17,22 +17,16 @@ import { SuiWatcher } from './SuiWatcher'; export function makeFinalizedWatcher(chainName: ChainName): Watcher { if (chainName === 'solana') { return new SolanaWatcher(); - } else if (chainName === 'ethereum' || chainName === 'karura' || chainName === 'acala') { - return new EVMWatcher(chainName, 'finalized'); + } else if (['ethereum', 'karura', 'acala'].includes(chainName)) { + return new EVMWatcher(chainName as EVMChainName, 'finalized'); } else if (chainName === 'bsc') { return new BSCWatcher(); } else if (chainName === 'polygon') { return new PolygonWatcher(); } else if ( - chainName === 'avalanche' || - chainName === 'oasis' || - chainName === 'fantom' || - chainName === 'klaytn' || - chainName === 'celo' || - chainName === 'optimism' || - chainName === 'base' + ['avalanche', 'oasis', 'fantom', 'klaytn', 'celo', 'optimism', 'base'].includes(chainName) ) { - return new EVMWatcher(chainName); + return new EVMWatcher(chainName as EVMChainName); } else if (chainName === 'algorand') { return new AlgorandWatcher(); } else if (chainName === 'moonbeam') { diff --git a/event-watcher/tsconfig.json b/event-watcher/tsconfig.json index d809409e..cc5d7cd9 100644 --- a/event-watcher/tsconfig.json +++ b/event-watcher/tsconfig.json @@ -14,6 +14,7 @@ "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true, "resolveJsonModule": true, + "noEmit": true, "lib": ["es2022"] }, "include": ["scripts", "src", "src/abi/*.json"]