diff --git a/.codebuild/build.sh b/.codebuild/build.sh index 4675f4d1..c3fc85bc 100644 --- a/.codebuild/build.sh +++ b/.codebuild/build.sh @@ -9,94 +9,219 @@ send_slack_message() { -X POST https://slack.com/api/chat.postMessage; } -echo "Building git ref ${GIT_REF_TO_DEPLOY}..." - -exit=false; - -# Checks whether there is a file called "rollback_mainnet_production", which is used by our other CodeBuild to indicate that this is a mainnet-production rollback -if [ -f "rollback_mainnet_production" ]; then - # Gets all env vars with `mainnet_` prefix and re-exports them without the prefix - for var in "${!mainnet_@}"; do - export ${var#mainnet_}="${!var}" - done - make deploy-lambdas-mainnet; - send_slack_message "Rollback performed on mainnet-production to: ${GIT_REF_TO_DEPLOY}"; - exit=true; -fi; - -# Checks whether there is a file called "rollback_testnet_production", which is used by our other CodeBuild to indicate that this is a testnet-production rollback -if [ -f "rollback_testnet_production" ]; then - # Gets all env vars with `testnet_` prefix and re-exports them without the prefix - for var in "${!testnet_@}"; do - export ${var#testnet_}="${!var}" - done - make deploy-lambdas-testnet; - send_slack_message "Rollback performed on testnet-production to: ${GIT_REF_TO_DEPLOY}"; - exit=true; -fi; - -if [ "$exit" = true ]; then - echo "Rollbacks performed successfully. Exiting now."; - exit 0; -fi - -if expr "${GIT_REF_TO_DEPLOY}" : "master" >/dev/null; then - # Gets all env vars with `dev_` prefix and re-exports them without the prefix - for var in "${!dev_@}"; do - export ${var#dev_}="${!var}" - done - - make migrate; - make build-daemon; - make deploy-lambdas-dev-testnet; - # The idea here is that if the lambdas deploy fail, the built image won't be pushed: - make push-daemon; - -elif expr "${GIT_REF_TO_DEPLOY}" : "v[0-9]\+\.[0-9]\+\.[0-9]\+-rc\.[0-9]\+" >/dev/null; then - # Gets all env vars with `mainnet_staging_` prefix and re-exports them without the prefix - for var in "${!mainnet_staging_@}"; do - export ${var#mainnet_staging_}="${!var}" - done - - echo $GIT_REF_TO_DEPLOY > /tmp/docker_image_tag - make migrate; - make build-daemon; - make deploy-lambdas-mainnet-staging; - make push-daemon; - send_slack_message "New version deployed to mainnet-staging: ${GIT_REF_TO_DEPLOY}" -elif expr "${GIT_REF_TO_DEPLOY}" : "v.*" >/dev/null; then - # Gets all env vars with `testnet_` prefix and re-exports them without the prefix - for var in "${!testnet_@}"; do - export ${var#testnet_}="${!var}" - done - - echo $GIT_REF_TO_DEPLOY > /tmp/docker_image_tag - make migrate; - make build-daemon; - make deploy-lambdas-testnet; - make push-daemon; - - # Unsets all the testnet env vars so we make sure they don't leak to the mainnet deploy below - for var in "${!testnet_@}"; do - unset ${var#testnet_} - done - - # Gets all env vars with `mainnet_` prefix and re-exports them without the prefix - for var in "${!mainnet_@}"; do - export ${var#mainnet_}="${!var}" - done - make migrate; - make build-daemon; - make deploy-lambdas-mainnet; - make push-daemon; - send_slack_message "New version deployed to testnet-production and mainnet-production: ${GIT_REF_TO_DEPLOY}" -else - # Gets all env vars with `dev_` prefix and re-exports them without the prefix - for var in "${!dev_@}"; do - export ${var#dev_}="${!var}" - done - make migrate; - make build-daemon; - make deploy-lambdas-dev-testnet; - make push-daemon; -fi; +deploy_hathor_network_account() { + exit=false; + + # Checks whether there is a file called "rollback_mainnet_production", which is used by our other CodeBuild to indicate that this is a mainnet-production rollback + if [ -f "rollback_mainnet_production" ]; then + # Gets all env vars with `mainnet_` prefix and re-exports them without the prefix + for var in "${!mainnet_@}"; do + export ${var#mainnet_}="${!var}" + done + make deploy-lambdas-mainnet; + send_slack_message "Rollback performed on mainnet-production to: ${GIT_REF_TO_DEPLOY}"; + exit=true; + fi; + + # Checks whether there is a file called "rollback_testnet_production", which is used by our other CodeBuild to indicate that this is a testnet-production rollback + if [ -f "rollback_testnet_production" ]; then + # Gets all env vars with `testnet_` prefix and re-exports them without the prefix + for var in "${!testnet_@}"; do + export ${var#testnet_}="${!var}" + done + make deploy-lambdas-testnet; + send_slack_message "Rollback performed on testnet-production to: ${GIT_REF_TO_DEPLOY}"; + exit=true; + fi; + + if [ "$exit" = true ]; then + echo "Rollbacks performed successfully. Exiting now."; + exit 0; + fi + + if expr "${GIT_REF_TO_DEPLOY}" : "master" >/dev/null; then + # Gets all env vars with `dev_` prefix and re-exports them without the prefix + for var in "${!dev_@}"; do + export ${var#dev_}="${!var}" + done + + make migrate; + make build-daemon; + make deploy-lambdas-dev-testnet; + # The idea here is that if the lambdas deploy fail, the built image won't be pushed: + make push-daemon; + + elif expr "${GIT_REF_TO_DEPLOY}" : "v[0-9]\+\.[0-9]\+\.[0-9]\+-rc\.[0-9]\+" >/dev/null; then + # Gets all env vars with `mainnet_staging_` prefix and re-exports them without the prefix + for var in "${!mainnet_staging_@}"; do + export ${var#mainnet_staging_}="${!var}" + done + + echo $GIT_REF_TO_DEPLOY > /tmp/docker_image_tag + make migrate; + make build-daemon; + make deploy-lambdas-mainnet-staging; + # The idea here is that if the lambdas deploy fail, the built image won't be pushed: + make push-daemon; + send_slack_message "New version deployed to mainnet-staging: ${GIT_REF_TO_DEPLOY}" + elif expr "${GIT_REF_TO_DEPLOY}" : "v.*" >/dev/null; then + echo $GIT_REF_TO_DEPLOY > /tmp/docker_image_tag + make build-daemon; + + # --- Testnet --- + # Gets all env vars with `testnet_` prefix and re-exports them without the prefix + for var in "${!testnet_@}"; do + export ${var#testnet_}="${!var}" + done + + make migrate; + make deploy-lambdas-testnet; + + # Unsets all the testnet env vars so we make sure they don't leak to other deploys + for var in "${!testnet_@}"; do + unset ${var#testnet_} + done + + # --- Mainnet --- + # Gets all env vars with `mainnet_` prefix and re-exports them without the prefix + for var in "${!mainnet_@}"; do + export ${var#mainnet_}="${!var}" + done + make migrate; + make deploy-lambdas-mainnet; + + # Unsets all the mainnet env vars so we make sure they don't leak to other deploys + for var in "${!mainnet_@}"; do + unset ${var#mainnet_} + done + + # The idea here is that if the lambdas deploy fail, the built image won't be pushed: + make push-daemon; + send_slack_message "New version deployed to testnet-production and mainnet-production: ${GIT_REF_TO_DEPLOY}" + else + # Gets all env vars with `dev_` prefix and re-exports them without the prefix + for var in "${!dev_@}"; do + export ${var#dev_}="${!var}" + done + make migrate; + make build-daemon; + make deploy-lambdas-dev-testnet; + # The idea here is that if the lambdas deploy fail, the built image won't be pushed: + make push-daemon; + fi; +} + +deploy_nano_testnet() { + # Deploys the releases and release-candidates to our nano-testnet environment + + # We deploy only the Lambdas here, because the daemon used in nano-testnet is the same as + # the one built in the hathor-network account, since it runs there as well + + echo "Building git ref ${GIT_REF_TO_DEPLOY}..." + + # This will match both releases and release-candidates + if expr "${GIT_REF_TO_DEPLOY}" : "v.*" >/dev/null; then + make migrate; + make deploy-lambdas-nano-testnet; + + send_slack_message "New version deployed to nano-testnet: ${GIT_REF_TO_DEPLOY}" + elif expr "${MANUAL_DEPLOY}" : "true" >/dev/null; then + make migrate; + make deploy-lambdas-nano-testnet; + + send_slack_message "Branch manually deployed to nano-testnet: ${GIT_REF_TO_DEPLOY}" + elif expr "${ROLLBACK}" : "true" >/dev/null; then + make migrate; + make deploy-lambdas-nano-testnet; + + send_slack_message "Rollback performed on nano-tesnet to: ${GIT_REF_TO_DEPLOY}"; + else + echo "We don't deploy ${GIT_REF_TO_DEPLOY} to nano-testnet. Nothing to do."; + fi; +} + +deploy_ekvilibro_mainnet() { + # Deploys the releases to our ekvilibro-mainnet environment + + # We deploy only the Lambdas here, because the daemon used in ekvilibro-testnet is the same as + # the one built in the hathor-network account, since it runs there as well + + echo "Building git ref ${GIT_REF_TO_DEPLOY}..." + + # This will match release-candidates + if expr "${GIT_REF_TO_DEPLOY}" : "v[0-9]\+\.[0-9]\+\.[0-9]\+-rc\.[0-9]\+" >/dev/null; then + echo "We don't deploy ${GIT_REF_TO_DEPLOY} to ekvilibro-mainnet. Nothing to do."; + # This will match releases only (since release-candidates are already matched above) + elif expr "${GIT_REF_TO_DEPLOY}" : "v.*" >/dev/null; then + make migrate; + make deploy-lambdas-ekvilibro-mainnet; + + send_slack_message "New version deployed to ekvilibro-mainnet: ${GIT_REF_TO_DEPLOY}" + elif expr "${MANUAL_DEPLOY}" : "true" >/dev/null; then + make migrate; + make deploy-lambdas-ekvilibro-mainnet; + + send_slack_message "Branch manually deployed to ekvilibro-mainnet: ${GIT_REF_TO_DEPLOY}" + elif expr "${ROLLBACK}" : "true" >/dev/null; then + make migrate; + make deploy-lambdas-ekvilibro-mainnet; + + send_slack_message "Rollback performed on ekvilibro-mainnet to: ${GIT_REF_TO_DEPLOY}"; + else + echo "We don't deploy ${GIT_REF_TO_DEPLOY} to ekvilibro-mainnet. Nothing to do."; + fi; + +} + +deploy_ekvilibro_testnet() { + # Deploys the release-candidates and releases to our ekvilibro-testnet environment + + # We deploy only the Lambdas here, because the daemon used in ekvilibro-testnet is the same as + # the one built in the hathor-network account, since it runs there as well + + echo "Building git ref ${GIT_REF_TO_DEPLOY}..." + + # This will match release-candidates or releases + if expr "${GIT_REF_TO_DEPLOY}" : "v.*" >/dev/null; then + make migrate; + make deploy-lambdas-ekvilibro-testnet; + + send_slack_message "New version deployed to ekvilibro-testnet: ${GIT_REF_TO_DEPLOY}" + elif expr "${MANUAL_DEPLOY}" : "true" >/dev/null; then + make migrate; + make deploy-lambdas-ekvilibro-testnet; + + send_slack_message "Branch manually deployed to ekvilibro-testnet: ${GIT_REF_TO_DEPLOY}" + elif expr "${ROLLBACK}" : "true" >/dev/null; then + make migrate; + make deploy-lambdas-ekvilibro-testnet; + + send_slack_message "Rollback performed on ekvilibro-testnet to: ${GIT_REF_TO_DEPLOY}"; + else + echo "We don't deploy ${GIT_REF_TO_DEPLOY} to ekvilibro-testnet. Nothing to do."; + fi; +} + + +# Check the first argument for the desired deploy +option=$1 + +case $option in + # This will be triggered from /.codebuild/buildspec.yml in this repo + hathor-network) + deploy_hathor_network_account + ;; + nano-testnet) + deploy_nano_testnet + ;; + ekvilibro-testnet) + deploy_ekvilibro_testnet + ;; + ekvilibro-mainnet) + deploy_ekvilibro_mainnet + ;; + *) + echo "Invalid option: $option" + exit 1 + ;; +esac \ No newline at end of file diff --git a/.codebuild/buildspec.yml b/.codebuild/buildspec.yml index a5dbf8d7..1d167ee6 100644 --- a/.codebuild/buildspec.yml +++ b/.codebuild/buildspec.yml @@ -89,6 +89,7 @@ env: dev_FIREBASE_CLIENT_X509_CERT_URL: "WalletService/dev:FIREBASE_CLIENT_X509_CERT_URL" dev_ALERT_MANAGER_REGION: "WalletService/dev:ALERT_MANAGER_REGION" dev_ALERT_MANAGER_TOPIC: "WalletService/dev:ALERT_MANAGER_TOPIC" + dev_ALERT_MANAGER_ACCOUNT_ID: "WalletService/dev:ALERT_MANAGER_ACCOUNT_ID" # Testnet secrets testnet_ACCOUNT_ID: "WalletService/testnet:account_id" testnet_AUTH_SECRET: "WalletService/testnet:auth_secret" @@ -114,6 +115,7 @@ env: testnet_FIREBASE_CLIENT_X509_CERT_URL: "WalletService/testnet:FIREBASE_CLIENT_X509_CERT_URL" testnet_ALERT_MANAGER_REGION: "WalletService/testnet:ALERT_MANAGER_REGION" testnet_ALERT_MANAGER_TOPIC: "WalletService/testnet:ALERT_MANAGER_TOPIC" + testnet_ALERT_MANAGER_ACCOUNT_ID: "WalletService/testnet:ALERT_MANAGER_ACCOUNT_ID" # Mainnet Staging secrets mainnet_staging_ACCOUNT_ID: "WalletService/mainnet_staging:account_id" mainnet_staging_AUTH_SECRET: "WalletService/mainnet_staging:auth_secret" @@ -139,6 +141,7 @@ env: mainnet_staging_FIREBASE_CLIENT_X509_CERT_URL: "WalletService/mainnet_staging:FIREBASE_CLIENT_X509_CERT_URL" mainnet_staging_ALERT_MANAGER_REGION: "WalletService/mainnet_staging:ALERT_MANAGER_REGION" mainnet_staging_ALERT_MANAGER_TOPIC: "WalletService/mainnet_staging:ALERT_MANAGER_TOPIC" + mainnet_staging_ALERT_MANAGER_ACCOUNT_ID: "WalletService/mainnet_staging:ALERT_MANAGER_ACCOUNT_ID" # Mainnet secrets mainnet_ACCOUNT_ID: "WalletService/mainnet:account_id" mainnet_AUTH_SECRET: "WalletService/mainnet:auth_secret" @@ -164,6 +167,7 @@ env: mainnet_FIREBASE_CLIENT_X509_CERT_URL: "WalletService/mainnet:FIREBASE_CLIENT_X509_CERT_URL" mainnet_ALERT_MANAGER_REGION: "WalletService/mainnet:ALERT_MANAGER_REGION" mainnet_ALERT_MANAGER_TOPIC: "WalletService/mainnet:ALERT_MANAGER_TOPIC" + mainnet_ALERT_MANAGER_ACCOUNT_ID: "WalletService/mainnet:ALERT_MANAGER_ACCOUNT_ID" phases: install: #If you use the Ubuntu standard image 2.0 or later, you must specify runtime-versions. @@ -182,4 +186,4 @@ phases: - export GIT_REF_TO_DEPLOY=$(cat git_ref_to_deploy) build: commands: - - bash .codebuild/build.sh + - bash .codebuild/build.sh hathor-network diff --git a/Makefile b/Makefile index 1695bed3..c297758a 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,18 @@ build-daemon: push-daemon: bash scripts/push-daemon.sh +.PHONY: deploy-lambdas-nano-testnet +deploy-lambdas-nano-testnet: + AWS_SDK_LOAD_CONFIG=1 yarn workspace wallet-service run serverless deploy --stage nano --region eu-central-1 --aws-profile nano-testnet + +.PHONY: deploy-lambdas-ekvilibro-testnet +deploy-lambdas-ekvilibro-testnet: + AWS_SDK_LOAD_CONFIG=1 yarn workspace wallet-service run serverless deploy --stage ekvilibro --region eu-central-1 --aws-profile ekvilibro + +.PHONY: deploy-lambdas-ekvilibro-mainnet +deploy-lambdas-ekvilibro-mainnet: + AWS_SDK_LOAD_CONFIG=1 yarn workspace wallet-service run serverless deploy --stage ekvi-main --region eu-central-1 --aws-profile ekvilibro + .PHONY: deploy-lambdas-dev-testnet deploy-lambdas-dev-testnet: AWS_SDK_LOAD_CONFIG=1 yarn workspace wallet-service run serverless deploy --stage dev-testnet --region eu-central-1 diff --git a/db/migrations/20241203185227-add-address-wallet_id-index.js b/db/migrations/20241203185227-add-address-wallet_id-index.js new file mode 100644 index 00000000..b7d67a25 --- /dev/null +++ b/db/migrations/20241203185227-add-address-wallet_id-index.js @@ -0,0 +1,18 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface) { + await queryInterface.addIndex( + 'address', + ['wallet_id', 'index'], + { + name: 'idx_wallet_address_index', + } + ); + }, + + async down(queryInterface) { + await queryInterface.removeIndex('address', 'idx_wallet_address_index'); + } +}; diff --git a/flake.nix b/flake.nix index 7d012645..8dc4438b 100644 --- a/flake.nix +++ b/flake.nix @@ -36,6 +36,7 @@ nixpkgs-fmt nodejs_20 yarn + docker-compose ]; }; }); diff --git a/package.json b/package.json index 67e6312e..41ca141d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hathor-wallet-service", - "version": "1.6.2", + "version": "1.6.3", "workspaces": [ "packages/common", "packages/daemon", @@ -16,7 +16,7 @@ "author": "André Abadesso ", "private": true, "devDependencies": { - "@types/jest": "^29.5.12", + "@types/jest": "29.5.13", "@typescript-eslint/eslint-plugin": "^7.4.0", "@typescript-eslint/parser": "^7.4.0", "dotenv": "^16.4.5", diff --git a/packages/common/package.json b/packages/common/package.json index 45d08214..1edea33c 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -13,13 +13,13 @@ "dependencies": { "@aws-sdk/client-lambda": "3.540.0", "@aws-sdk/client-sqs": "3.540.0", - "winston": "^3.13.0" + "winston": "3.13.0" }, "devDependencies": { - "@types/aws-lambda": "^8.10.136", - "@types/node": "^20.11.30", - "jest": "^29.6.4", - "ts-jest": "^29.1.2", - "typescript": "^5.4.3" + "@types/aws-lambda": "8.10.136", + "@types/node": "20.11.30", + "jest": "29.6.4", + "ts-jest": "29.1.2", + "typescript": "5.4.3" } } diff --git a/packages/common/src/utils/alerting.utils.ts b/packages/common/src/utils/alerting.utils.ts index 9940fbde..213642de 100644 --- a/packages/common/src/utils/alerting.utils.ts +++ b/packages/common/src/utils/alerting.utils.ts @@ -36,11 +36,13 @@ export const addAlert = async ( const { ACCOUNT_ID, + ALERT_MANAGER_ACCOUNT_ID, ALERT_MANAGER_REGION, ALERT_MANAGER_TOPIC, } = process.env; - const QUEUE_URL = `https://sqs.${ALERT_MANAGER_REGION}.amazonaws.com/${ACCOUNT_ID}/${ALERT_MANAGER_TOPIC}`; + const account_id = ALERT_MANAGER_ACCOUNT_ID || ACCOUNT_ID; + const QUEUE_URL = `https://sqs.${ALERT_MANAGER_REGION}.amazonaws.com/${account_id}/${ALERT_MANAGER_TOPIC}`; const client = new SQSClient({ endpoint: QUEUE_URL, diff --git a/packages/daemon/__tests__/db/index.test.ts b/packages/daemon/__tests__/db/index.test.ts index a53d14d4..930ed492 100644 --- a/packages/daemon/__tests__/db/index.test.ts +++ b/packages/daemon/__tests__/db/index.test.ts @@ -12,13 +12,13 @@ import { addUtxos, fetchAddressBalance, fetchAddressTxHistorySum, - generateAddresses, getAddressWalletInfo, getBestBlockHeight, getDbConnection, getExpiredTimelocksUtxos, getLastSyncedEvent, getLockedUtxoFromInputs, + getMaxIndicesForWallets, getMinersList, getTokenInformation, getTokenSymbols, @@ -39,7 +39,8 @@ import { updateLastSyncedEvent, updateTxOutputSpentBy, updateWalletLockedBalance, - updateWalletTablesWithTx + updateWalletTablesWithTx, + voidTransaction } from '../../src/db'; import { Connection } from 'mysql2/promise'; import { @@ -48,6 +49,7 @@ import { addToAddressTable, addToAddressTxHistoryTable, addToTokenTable, + addToTransactionTable, addToUtxoTable, addToWalletBalanceTable, addToWalletTable, @@ -55,6 +57,7 @@ import { checkAddressTable, checkAddressTxHistoryTable, checkTokenTable, + checkTransactionTable, checkUtxoTable, checkWalletBalanceTable, checkWalletTxHistoryTable, @@ -68,6 +71,9 @@ import { import { isAuthority } from '@wallet-service/common'; import { DbTxOutput, StringMap, TokenInfo, WalletStatus } from '../../src/types'; import { Authorities, TokenBalanceMap } from '@wallet-service/common'; +// @ts-ignore +import { constants } from '@hathor/wallet-lib'; +import { generateAddresses } from '../../src/utils'; // Use a single mysql connection for all tests let mysql: Connection; @@ -284,6 +290,12 @@ describe('tx output methods', () => { expect(countAfterDelete).toStrictEqual(0); }); + test('markUtxosAsVoided should not throw when utxos list is empty', async () => { + expect.hasAssertions(); + + await expect(markUtxosAsVoided(mysql, [])).resolves.not.toThrow(); + }); + test('getTxOutputsFromTx, getTxOutputs, getTxOutput', async () => { expect.hasAssertions(); @@ -551,6 +563,9 @@ describe('address and wallet related tests', () => { }; await updateAddressTablesWithTx(mysql, txId5, timestamp5, addrMap5); await expect(checkAddressBalanceTable(mysql, 5, address1, 'token1', 5, 7, lockExpires - 1, 5)).resolves.toBe(true); + + // We shouldn't throw if the addressBalanceMap is empty: + await expect(updateAddressTablesWithTx(mysql, txId5, timestamp5, {})).resolves.not.toThrow(); }); test('updateAddressLockedBalance', async () => { @@ -704,6 +719,9 @@ describe('address and wallet related tests', () => { const addressWalletMap = await getAddressWalletInfo(mysql, Object.keys(finalMap)); expect(addressWalletMap).toStrictEqual(finalMap); + + // Should not throw on empty addresses list + await expect(getAddressWalletInfo(mysql, [])).resolves.not.toThrow(); }); test('updateWalletLockedBalance', async () => { @@ -765,84 +783,69 @@ describe('address and wallet related tests', () => { await expect(checkWalletBalanceTable(mysql, 3, wallet1, tokenId, 25, 5, now, 5, 0b11, 0b01)).resolves.toBe(true); }); - test('generateAddresses', async () => { + test('should generate addresses correctly', async () => { expect.hasAssertions(); + const maxGap = 5; const address0 = ADDRESSES[0]; + const address1 = ADDRESSES[1]; + const address4 = ADDRESSES[4]; // check first with no addresses on database, so it should return only maxGap addresses - let addressesInfo = await generateAddresses(mysql, XPUBKEY, maxGap); + let addresses = await generateAddresses('mainnet', XPUBKEY, 0, maxGap); - expect(addressesInfo.addresses).toHaveLength(maxGap); - expect(addressesInfo.existingAddresses).toStrictEqual({}); - expect(Object.keys(addressesInfo.newAddresses)).toHaveLength(maxGap); - expect(addressesInfo.addresses[0]).toBe(address0); + expect(Object.keys(addresses).length).toBe(maxGap); + expect(addresses[address0]).toBe(0); - // add first address with no transactions. As it's not used, we should still only generate maxGap addresses + // add address0 to the database with no transactions await addToAddressTable(mysql, [{ address: address0, index: 0, - walletId: null, + walletId: 'wallet1', transactions: 0, }]); - addressesInfo = await generateAddresses(mysql, XPUBKEY, maxGap); - expect(addressesInfo.addresses).toHaveLength(maxGap); - expect(addressesInfo.existingAddresses).toStrictEqual({ [address0]: 0 }); - expect(addressesInfo.lastUsedAddressIndex).toStrictEqual(-1); - let totalLength = Object.keys(addressesInfo.addresses).length; - let existingLength = Object.keys(addressesInfo.existingAddresses).length; - expect(Object.keys(addressesInfo.newAddresses)).toHaveLength(totalLength - existingLength); - expect(addressesInfo.addresses[0]).toBe(address0); + addresses = await generateAddresses('mainnet', XPUBKEY, 0, maxGap); + expect(Object.keys(addresses).length).toBe(maxGap); + expect(addresses[address0]).toBe(0); - // mark address as used and check again + // now mark address0 as used let usedIndex = 0; await mysql.query('UPDATE `address` SET `transactions` = ? WHERE `address` = ?', [1, address0]); - addressesInfo = await generateAddresses(mysql, XPUBKEY, maxGap); - expect(addressesInfo.addresses).toHaveLength(maxGap + usedIndex + 1); - expect(addressesInfo.existingAddresses).toStrictEqual({ [address0]: 0 }); - expect(addressesInfo.lastUsedAddressIndex).toStrictEqual(0); - - totalLength = Object.keys(addressesInfo.addresses).length; - existingLength = Object.keys(addressesInfo.existingAddresses).length; - expect(Object.keys(addressesInfo.newAddresses)).toHaveLength(totalLength - existingLength); + addresses = await generateAddresses('mainnet', XPUBKEY, 0, maxGap + usedIndex + 1); + expect(Object.keys(addresses).length).toBe(maxGap + usedIndex + 1); + expect(addresses[address0]).toBe(0); - // add address with index 1 as used + // add address1 to the database with transactions usedIndex = 1; - const address1 = ADDRESSES[1]; await addToAddressTable(mysql, [{ address: address1, - index: usedIndex, - walletId: null, + index: 1, + walletId: 'wallet1', transactions: 1, }]); - addressesInfo = await generateAddresses(mysql, XPUBKEY, maxGap); - expect(addressesInfo.addresses).toHaveLength(maxGap + usedIndex + 1); - expect(addressesInfo.existingAddresses).toStrictEqual({ [address0]: 0, [address1]: 1 }); - expect(addressesInfo.lastUsedAddressIndex).toStrictEqual(1); - totalLength = Object.keys(addressesInfo.addresses).length; - existingLength = Object.keys(addressesInfo.existingAddresses).length; - expect(Object.keys(addressesInfo.newAddresses)).toHaveLength(totalLength - existingLength); - - // add address with index 4 as used + + addresses = await generateAddresses('mainnet', XPUBKEY, 0, maxGap + usedIndex + 1); + expect(Object.keys(addresses).length).toBe(maxGap + usedIndex + 1); + expect(addresses[address0]).toBe(0); + expect(addresses[address1]).toBe(1); + + // add address4 to the database with transactions usedIndex = 4; - const address4 = ADDRESSES[4]; await addToAddressTable(mysql, [{ address: address4, - index: usedIndex, - walletId: null, + index: 4, + walletId: 'wallet1', transactions: 1, }]); - addressesInfo = await generateAddresses(mysql, XPUBKEY, maxGap); - expect(addressesInfo.addresses).toHaveLength(maxGap + usedIndex + 1); - expect(addressesInfo.existingAddresses).toStrictEqual({ [address0]: 0, [address1]: 1, [address4]: 4 }); - expect(addressesInfo.lastUsedAddressIndex).toStrictEqual(4); - totalLength = Object.keys(addressesInfo.addresses).length; - existingLength = Object.keys(addressesInfo.existingAddresses).length; - expect(Object.keys(addressesInfo.newAddresses)).toHaveLength(totalLength - existingLength); + + addresses = await generateAddresses('mainnet', XPUBKEY, 0, maxGap + usedIndex + 1); + expect(Object.keys(addresses).length).toBe(maxGap + usedIndex + 1); + expect(addresses[address0]).toBe(0); + expect(addresses[address4]).toBe(4); // make sure no address was skipped from being generated - for (const [index, address] of addressesInfo.addresses.entries()) { + for (const [address, index] of Object.entries(addresses)) { expect(ADDRESSES[index]).toBe(address); } }, 15000); @@ -1164,3 +1167,182 @@ describe('getTokenSymbols', () => { expect(tokenSymbolMap).toBeNull(); }); }); + +describe('voidTransaction', () => { + const txId = 'tx1'; + const addr1 = 'addr1'; + const token1 = 'token1'; + const token2 = 'other-token'; + + it('should re-calculate address balances properly', async () => { + expect.hasAssertions(); + + await addToTransactionTable(mysql, [{ + txId, + timestamp: 0, + version: constants.BLOCK_VERSION, + voided: false, + height: 1, + }]); + + await addToAddressTable(mysql, [{ + address: addr1, + index: 0, + walletId: null, + transactions: 2, + }]); + + await addToAddressBalanceTable(mysql, [ + [addr1, token1, 50, 5, null, 5, 0, 0, 100], + [addr1, token2, 25, 10, null, 4, 0, 0, 50], + ]); + + await addToAddressTxHistoryTable(mysql, [{ + address: addr1, + txId, + tokenId: token1, + balance: 50, + timestamp: 1, + }, { + address: addr1, + txId, + tokenId: token2, + balance: 25, + timestamp: 1, + }]); + + const addressBalance: StringMap = { + [addr1]: TokenBalanceMap.fromStringMap({ + [token1]: { + unlocked: 49, + locked: 5, + }, + [token2]: { + unlocked: 24, + locked: 10, + } + }), + }; + + await voidTransaction(mysql, txId, addressBalance); + + await expect(checkAddressBalanceTable(mysql, 2, addr1, token2, 1, 0, null, 3)).resolves.toBe(true); + await expect(checkAddressBalanceTable(mysql, 2, addr1, token1, 1, 0, null, 4)).resolves.toBe(true); + // Address tx history entry should have been deleted for both tokens: + await expect(checkAddressTxHistoryTable(mysql, 0, addr1, txId, token1, -1, 0)).resolves.toBe(true); + await expect(checkAddressTxHistoryTable(mysql, 0, addr1, txId, token2, -1, 0)).resolves.toBe(true); + + await expect(checkTransactionTable(mysql, 1, txId, 0, constants.BLOCK_VERSION, true, 1)).resolves.toBe(true); + }); + + it('should not fail when balances are empty (from a tx with no inputs and outputs)', async () => { + expect.hasAssertions(); + + await addToTransactionTable(mysql, [{ + txId, + timestamp: 0, + version: constants.BLOCK_VERSION, + voided: false, + height: 1, + }]); + + const addressBalance: StringMap = {}; + + await expect(voidTransaction(mysql, txId, addressBalance)).resolves.not.toThrow(); + // Tx should be voided + await expect(checkTransactionTable(mysql, 1, txId, 0, constants.BLOCK_VERSION, true, 1)).resolves.toBe(true); + }); + + it('should throw an error if the transaction is not found in the database', async () => { + expect.hasAssertions(); + + await expect(voidTransaction(mysql, 'mysterious-transaction', {})).rejects.toThrow('Tried to void a transaction that is not in the database.'); + }); +}); + +describe('address generation and index methods', () => { + test('generateAddresses should generate correct addresses', async () => { + expect.hasAssertions(); + + const startIndex = 0; + const count = 3; + const addresses = await generateAddresses('mainnet', XPUBKEY, startIndex, count); + + // Check if we got the expected number of addresses + expect(Object.keys(addresses).length).toBe(count); + + // Check if the addresses are mapped to correct indices + Object.entries(addresses).forEach(([address, index]) => { + expect(typeof address).toBe('string'); + expect(index).toBeGreaterThanOrEqual(startIndex); + expect(index).toBeLessThan(startIndex + count); + }); + }); + + test('getMaxIndicesForWallets should return correct indices for multiple wallets', async () => { + expect.hasAssertions(); + + const wallet1 = 'wallet1'; + const wallet2 = 'wallet2'; + const addresses1 = ['addr1', 'addr2', 'addr3']; + const addresses2 = ['addr4', 'addr5']; + const indices1 = [5, 10, 15]; + const indices2 = [7, 12]; + + // Add addresses for wallet1 + const entries1 = addresses1.map((address, i) => ({ + address, + index: indices1[i], + walletId: wallet1, + transactions: 0, + })); + await addToAddressTable(mysql, entries1); + + // Add addresses for wallet2 + const entries2 = addresses2.map((address, i) => ({ + address, + index: indices2[i], + walletId: wallet2, + transactions: 0, + })); + await addToAddressTable(mysql, entries2); + + // Test getting indices for both wallets + const walletData = [ + { walletId: wallet1, addresses: addresses1 }, + { walletId: wallet2, addresses: addresses2 }, + ]; + const indices = await getMaxIndicesForWallets(mysql, walletData); + + // Check wallet1 indices + const wallet1Indices = indices.get(wallet1); + expect(wallet1Indices).toBeDefined(); + expect(wallet1Indices?.maxAmongAddresses).toBe(15); + expect(wallet1Indices?.maxWalletIndex).toBe(15); + + // Check wallet2 indices + const wallet2Indices = indices.get(wallet2); + expect(wallet2Indices).toBeDefined(); + expect(wallet2Indices?.maxAmongAddresses).toBe(12); + expect(wallet2Indices?.maxWalletIndex).toBe(12); + + // Test with empty wallet data + const emptyIndices = await getMaxIndicesForWallets(mysql, []); + expect(emptyIndices.size).toBe(0); + + // Test with non-existent wallet + const nonExistentIndices = await getMaxIndicesForWallets(mysql, [ + { walletId: 'nonexistent', addresses: ['addr1'] } + ]); + expect(nonExistentIndices.size).toBe(0); + + // Test with subset of addresses + const subsetIndices = await getMaxIndicesForWallets(mysql, [ + { walletId: wallet1, addresses: addresses1.slice(0, 2) } + ]); + const subsetWallet1 = subsetIndices.get(wallet1); + expect(subsetWallet1).toBeDefined(); + expect(subsetWallet1?.maxAmongAddresses).toBe(10); + expect(subsetWallet1?.maxWalletIndex).toBe(15); + }); +}); diff --git a/packages/daemon/__tests__/integration/balances.test.ts b/packages/daemon/__tests__/integration/balances.test.ts index 55580f5e..b6e4d95d 100644 --- a/packages/daemon/__tests__/integration/balances.test.ts +++ b/packages/daemon/__tests__/integration/balances.test.ts @@ -4,27 +4,38 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ + import * as Services from '../../src/services'; import { SyncMachine } from '../../src/machines'; import { interpret } from 'xstate'; -import { getLastSyncedEvent, getDbConnection } from '../../src/db'; +import { getDbConnection } from '../../src/db'; import { Connection } from 'mysql2/promise'; -import { cleanDatabase, fetchAddressBalances, validateBalances } from './utils'; +import { cleanDatabase, fetchAddressBalances, transitionUntilEvent, validateBalances } from './utils'; import unvoidedScenarioBalances from './scenario_configs/unvoided_transactions.balances'; import reorgScenarioBalances from './scenario_configs/reorg.balances'; import singleChainBlocksAndTransactionsBalances from './scenario_configs/single_chain_blocks_and_transactions.balances'; +import invalidMempoolBalances from './scenario_configs/invalid_mempool_transaction.balances'; +import emptyScriptBalances from './scenario_configs/empty_script.balances'; +import customScriptBalances from './scenario_configs/custom_script.balances'; + import { DB_NAME, DB_USER, DB_PORT, DB_PASS, DB_ENDPOINT, + INVALID_MEMPOOL_TRANSACTION_PORT, UNVOIDED_SCENARIO_PORT, UNVOIDED_SCENARIO_LAST_EVENT, REORG_SCENARIO_PORT, REORG_SCENARIO_LAST_EVENT, SINGLE_CHAIN_BLOCKS_AND_TRANSACTIONS_PORT, SINGLE_CHAIN_BLOCKS_AND_TRANSACTIONS_LAST_EVENT, + INVALID_MEMPOOL_TRANSACTION_LAST_EVENT, + CUSTOM_SCRIPT_PORT, + CUSTOM_SCRIPT_LAST_EVENT, + EMPTY_SCRIPT_PORT, + EMPTY_SCRIPT_LAST_EVENT, } from './config'; jest.mock('../../src/config', () => { @@ -45,7 +56,7 @@ getConfig.mockReturnValue({ BLOCK_REWARD_LOCK: 300, FULLNODE_PEER_ID: 'simulator_peer_id', STREAM_ID: 'simulator_stream_id', - FULLNODE_NETWORK: 'simulator_network', + FULLNODE_NETWORK: 'unittests', FULLNODE_HOST: `127.0.0.1:${UNVOIDED_SCENARIO_PORT}`, USE_SSL: false, DB_ENDPOINT, @@ -89,7 +100,7 @@ describe('unvoided transaction scenario', () => { BLOCK_REWARD_LOCK: 300, FULLNODE_PEER_ID: 'simulator_peer_id', STREAM_ID: 'simulator_stream_id', - FULLNODE_NETWORK: 'simulator_network', + FULLNODE_NETWORK: 'unittests', FULLNODE_HOST: `127.0.0.1:${UNVOIDED_SCENARIO_PORT}`, USE_SSL: false, DB_ENDPOINT, @@ -101,25 +112,11 @@ describe('unvoided transaction scenario', () => { const machine = interpret(SyncMachine); - await new Promise((resolve) => { - machine.onTransition(async (state) => { - if (state.matches('CONNECTED.idle')) { - // @ts-ignore - const lastSyncedEvent = await getLastSyncedEvent(mysql); - if (lastSyncedEvent?.last_event_id === UNVOIDED_SCENARIO_LAST_EVENT) { - const addressBalances = await fetchAddressBalances(mysql); - // @ts-ignore - expect(validateBalances(addressBalances, unvoidedScenarioBalances)); - - machine.stop(); - - resolve(); - } - } - }); - - machine.start(); - }); + // @ts-ignore + await transitionUntilEvent(mysql, machine, UNVOIDED_SCENARIO_LAST_EVENT); + const addressBalances = await fetchAddressBalances(mysql); + // @ts-ignore + expect(validateBalances(addressBalances, unvoidedScenarioBalances)); }); }); @@ -138,7 +135,7 @@ describe('reorg scenario', () => { BLOCK_REWARD_LOCK: 300, FULLNODE_PEER_ID: 'simulator_peer_id', STREAM_ID: 'simulator_stream_id', - FULLNODE_NETWORK: 'simulator_network', + FULLNODE_NETWORK: 'unittests', FULLNODE_HOST: `127.0.0.1:${REORG_SCENARIO_PORT}`, USE_SSL: false, DB_ENDPOINT, @@ -150,29 +147,50 @@ describe('reorg scenario', () => { const machine = interpret(SyncMachine); - await new Promise((resolve) => { - machine.onTransition(async (state) => { - if (state.matches('CONNECTED.idle')) { - // @ts-ignore - const lastSyncedEvent = await getLastSyncedEvent(mysql); - if (lastSyncedEvent?.last_event_id === REORG_SCENARIO_LAST_EVENT) { - const addressBalances = await fetchAddressBalances(mysql); - // @ts-ignore - expect(validateBalances(addressBalances, reorgScenarioBalances)); - - machine.stop(); + // @ts-ignore + await transitionUntilEvent(mysql, machine, REORG_SCENARIO_LAST_EVENT); + const addressBalances = await fetchAddressBalances(mysql); + // @ts-ignore + expect(validateBalances(addressBalances, reorgScenarioBalances)); + }); +}); - resolve(); - } - } - }); +describe('single chain blocks and transactions scenario', () => { + beforeAll(() => { + jest.spyOn(Services, 'fetchMinRewardBlocks').mockImplementation(async () => 300); + }); - machine.start(); + it('should do a full sync and the balances should match', async () => { + // @ts-ignore + getConfig.mockReturnValue({ + NETWORK: 'testnet', + SERVICE_NAME: 'daemon-test', + CONSOLE_LEVEL: 'debug', + TX_CACHE_SIZE: 100, + BLOCK_REWARD_LOCK: 300, + FULLNODE_PEER_ID: 'simulator_peer_id', + STREAM_ID: 'simulator_stream_id', + FULLNODE_NETWORK: 'unittests', + FULLNODE_HOST: `127.0.0.1:${SINGLE_CHAIN_BLOCKS_AND_TRANSACTIONS_PORT}`, + USE_SSL: false, + DB_ENDPOINT, + DB_NAME, + DB_USER, + DB_PASS, + DB_PORT, }); + + const machine = interpret(SyncMachine); + + // @ts-ignore + await transitionUntilEvent(mysql, machine, SINGLE_CHAIN_BLOCKS_AND_TRANSACTIONS_LAST_EVENT); + const addressBalances = await fetchAddressBalances(mysql); + // @ts-ignore + expect(validateBalances(addressBalances, singleChainBlocksAndTransactionsBalances)); }); }); -describe('single chain blocks and transactions scenario', () => { +describe('invalid mempool transactions scenario', () => { beforeAll(() => { jest.spyOn(Services, 'fetchMinRewardBlocks').mockImplementation(async () => 300); }); @@ -187,8 +205,8 @@ describe('single chain blocks and transactions scenario', () => { BLOCK_REWARD_LOCK: 300, FULLNODE_PEER_ID: 'simulator_peer_id', STREAM_ID: 'simulator_stream_id', - FULLNODE_NETWORK: 'simulator_network', - FULLNODE_HOST: `127.0.0.1:${SINGLE_CHAIN_BLOCKS_AND_TRANSACTIONS_PORT}`, + FULLNODE_NETWORK: 'unittests', + FULLNODE_HOST: `127.0.0.1:${INVALID_MEMPOOL_TRANSACTION_PORT}`, USE_SSL: false, DB_ENDPOINT, DB_NAME, @@ -199,24 +217,80 @@ describe('single chain blocks and transactions scenario', () => { const machine = interpret(SyncMachine); - await new Promise((resolve) => { - machine.onTransition(async (state) => { - if (state.matches('CONNECTED.idle')) { - // @ts-ignore - const lastSyncedEvent = await getLastSyncedEvent(mysql); - if (lastSyncedEvent?.last_event_id === SINGLE_CHAIN_BLOCKS_AND_TRANSACTIONS_LAST_EVENT) { - const addressBalances = await fetchAddressBalances(mysql); - // @ts-ignore - expect(validateBalances(addressBalances, singleChainBlocksAndTransactionsBalances)); + // @ts-ignore + await transitionUntilEvent(mysql, machine, INVALID_MEMPOOL_TRANSACTION_LAST_EVENT); + const addressBalances = await fetchAddressBalances(mysql); + // @ts-ignore + expect(validateBalances(addressBalances, invalidMempoolBalances)); + }); +}); - machine.stop(); +describe('custom script scenario', () => { + beforeAll(() => { + jest.spyOn(Services, 'fetchMinRewardBlocks').mockImplementation(async () => 300); + }); - resolve(); - } - } - }); + it('should do a full sync and the balances should match', async () => { + // @ts-ignore + getConfig.mockReturnValue({ + NETWORK: 'testnet', + SERVICE_NAME: 'daemon-test', + CONSOLE_LEVEL: 'debug', + TX_CACHE_SIZE: 100, + BLOCK_REWARD_LOCK: 300, + FULLNODE_PEER_ID: 'simulator_peer_id', + STREAM_ID: 'simulator_stream_id', + FULLNODE_NETWORK: 'unittests', + FULLNODE_HOST: `127.0.0.1:${CUSTOM_SCRIPT_PORT}`, + USE_SSL: false, + DB_ENDPOINT, + DB_NAME, + DB_USER, + DB_PASS, + DB_PORT, + }); + + const machine = interpret(SyncMachine); + + // @ts-ignore + await transitionUntilEvent(mysql, machine, CUSTOM_SCRIPT_LAST_EVENT); + const addressBalances = await fetchAddressBalances(mysql); + // @ts-ignore + expect(validateBalances(addressBalances, customScriptBalances)); + }); +}); + +describe('empty script scenario', () => { + beforeAll(() => { + jest.spyOn(Services, 'fetchMinRewardBlocks').mockImplementation(async () => 300); + }); - machine.start(); + it('should do a full sync and the balances should match', async () => { + // @ts-ignore + getConfig.mockReturnValue({ + NETWORK: 'testnet', + SERVICE_NAME: 'daemon-test', + CONSOLE_LEVEL: 'debug', + TX_CACHE_SIZE: 100, + BLOCK_REWARD_LOCK: 300, + FULLNODE_PEER_ID: 'simulator_peer_id', + STREAM_ID: 'simulator_stream_id', + FULLNODE_NETWORK: 'unittests', + FULLNODE_HOST: `127.0.0.1:${EMPTY_SCRIPT_PORT}`, + USE_SSL: false, + DB_ENDPOINT, + DB_NAME, + DB_USER, + DB_PASS, + DB_PORT, }); + + const machine = interpret(SyncMachine); + + // @ts-ignore + await transitionUntilEvent(mysql, machine, EMPTY_SCRIPT_LAST_EVENT); + const addressBalances = await fetchAddressBalances(mysql); + // @ts-ignore + expect(validateBalances(addressBalances, emptyScriptBalances)); }); }); diff --git a/packages/daemon/__tests__/integration/config.ts b/packages/daemon/__tests__/integration/config.ts index 73f49b41..2ffa6812 100644 --- a/packages/daemon/__tests__/integration/config.ts +++ b/packages/daemon/__tests__/integration/config.ts @@ -18,9 +18,27 @@ export const REORG_SCENARIO_PORT = 8082; // Same as the comment on the unvoided scenario last event export const REORG_SCENARIO_LAST_EVENT = 19; + // single chain blocks and transactions port export const SINGLE_CHAIN_BLOCKS_AND_TRANSACTIONS_PORT = 8083; // Same as the comment on the unvoided scenario last event export const SINGLE_CHAIN_BLOCKS_AND_TRANSACTIONS_LAST_EVENT = 37; -export const SCENARIOS = ['UNVOIDED_SCENARIO', 'REORG_SCENARIO', 'SINGLE_CHAIN_BLOCKS_AND_TRANSACTIONS']; + +export const INVALID_MEMPOOL_TRANSACTION_PORT = 8085; +export const INVALID_MEMPOOL_TRANSACTION_LAST_EVENT = 40; + +export const CUSTOM_SCRIPT_PORT = 8086; +export const CUSTOM_SCRIPT_LAST_EVENT = 37; + +export const EMPTY_SCRIPT_PORT = 8087; +export const EMPTY_SCRIPT_LAST_EVENT = 37; + +export const SCENARIOS = [ + 'UNVOIDED_SCENARIO', + 'REORG_SCENARIO', + 'SINGLE_CHAIN_BLOCKS_AND_TRANSACTIONS', + 'INVALID_MEMPOOL_TRANSACTION', + 'EMPTY_SCRIPT', + 'CUSTOM_SCRIPT', +]; diff --git a/packages/daemon/__tests__/integration/scenario_configs/custom_script.balances.ts b/packages/daemon/__tests__/integration/scenario_configs/custom_script.balances.ts new file mode 100644 index 00000000..6cada8af --- /dev/null +++ b/packages/daemon/__tests__/integration/scenario_configs/custom_script.balances.ts @@ -0,0 +1,16 @@ +export default { + 'HRXVDmLVdq8pgok1BCUKpiFWdAVAy4a5AJ': 100000000000, + 'HJQbEERnD5Ak3f2dsi8zAmsZrCWTT8FZns': 6400, + 'HRSYchTEsFFpZAkgSTMsohNGQ6eLPyhXvJ': 6400, + 'HQfVqxyxQV4BHwnsMnRXpZGmwPYiNSVmMu': 6400, + 'HPnkpR2vnBuCoZCEnRZNHMBtf8ygeSidbW': 6400, + 'HPNvtPZaDF44i6CL91u4BvZPu6z2xPNt26': 6400, + 'HQijr325t63VJFdc4vYkaTyd87oeBLpSed': 6400, + 'H8fCNrYGkj4B6VzKgtRiHBgoSxM31d65JR': 6400, + 'HAqrADnn7GyyT68fSX8zmtsRNFyabPzoRQ': 6400, + 'HRTH6uGo7zn3LWrosBYn7eXkwAeHAHTRh8': 6400, + 'HJPSMHCFv2dRb78wZPMsAzwLQHSkBpfuLn': 6400, + 'HFtz2f59Lms4p3Jfgtsr73s97MbJHsRENh': 1000, + 'H9hHteu9QdAS5p6X743Mpfue6G19rV9GeY': 5400, + 'HSd6PqXesUmHHv6MoN24aUiMuw7Pdcxrwk': 6400 +} diff --git a/packages/daemon/__tests__/integration/scenario_configs/empty_script.balances.ts b/packages/daemon/__tests__/integration/scenario_configs/empty_script.balances.ts new file mode 100644 index 00000000..e59f3324 --- /dev/null +++ b/packages/daemon/__tests__/integration/scenario_configs/empty_script.balances.ts @@ -0,0 +1,16 @@ +export default { + 'HRXVDmLVdq8pgok1BCUKpiFWdAVAy4a5AJ': 100000000000, + 'HFtz2f59Lms4p3Jfgtsr73s97MbJHsRENh': 6400, + 'HJQbEERnD5Ak3f2dsi8zAmsZrCWTT8FZns': 6400, + 'HRSYchTEsFFpZAkgSTMsohNGQ6eLPyhXvJ': 6400, + 'HQfVqxyxQV4BHwnsMnRXpZGmwPYiNSVmMu': 6400, + 'HPnkpR2vnBuCoZCEnRZNHMBtf8ygeSidbW': 6400, + 'HPNvtPZaDF44i6CL91u4BvZPu6z2xPNt26': 6400, + 'HQijr325t63VJFdc4vYkaTyd87oeBLpSed': 6400, + 'H8fCNrYGkj4B6VzKgtRiHBgoSxM31d65JR': 6400, + 'HAqrADnn7GyyT68fSX8zmtsRNFyabPzoRQ': 6400, + 'HRTH6uGo7zn3LWrosBYn7eXkwAeHAHTRh8': 6400, + 'HRQe4CXj8AZXzSmuNztU8iQR74QTQMbnTs': 1000, + 'HNqTfEASfdx7H4vMUGzfD2HyD3GeKuxjTJ': 5400, + 'HRH8Wbmr1A3BrLswSBhvVE4hhsv4jUdyVA': 6400 +}; diff --git a/packages/daemon/__tests__/integration/scenario_configs/invalid_mempool_transaction.balances.ts b/packages/daemon/__tests__/integration/scenario_configs/invalid_mempool_transaction.balances.ts new file mode 100644 index 00000000..70c28ab3 --- /dev/null +++ b/packages/daemon/__tests__/integration/scenario_configs/invalid_mempool_transaction.balances.ts @@ -0,0 +1,15 @@ +export default { + 'HNqTfEASfdx7H4vMUGzfD2HyD3GeKuxjTJ': 0, + 'HRXVDmLVdq8pgok1BCUKpiFWdAVAy4a5AJ': 100000000000, + 'HFtz2f59Lms4p3Jfgtsr73s97MbJHsRENh': 6400, + 'HJQbEERnD5Ak3f2dsi8zAmsZrCWTT8FZns': 6400, + 'HRSYchTEsFFpZAkgSTMsohNGQ6eLPyhXvJ': 6400, + 'HQfVqxyxQV4BHwnsMnRXpZGmwPYiNSVmMu': 6400, + 'HPnkpR2vnBuCoZCEnRZNHMBtf8ygeSidbW': 6400, + 'HPNvtPZaDF44i6CL91u4BvZPu6z2xPNt26': 6400, + 'HQijr325t63VJFdc4vYkaTyd87oeBLpSed': 6400, + 'H8fCNrYGkj4B6VzKgtRiHBgoSxM31d65JR': 6400, + 'HRQe4CXj8AZXzSmuNztU8iQR74QTQMbnTs': 6400, + 'HAqrADnn7GyyT68fSX8zmtsRNFyabPzoRQ': 0, + 'HRTH6uGo7zn3LWrosBYn7eXkwAeHAHTRh8': 0 +} diff --git a/packages/daemon/__tests__/integration/scenario_configs/reorg.balances.ts b/packages/daemon/__tests__/integration/scenario_configs/reorg.balances.ts index 09be940b..3dffad2d 100644 --- a/packages/daemon/__tests__/integration/scenario_configs/reorg.balances.ts +++ b/packages/daemon/__tests__/integration/scenario_configs/reorg.balances.ts @@ -1,6 +1,6 @@ export default { - "HFyF1jYJP9FXfiC3LRqf3q4768TBL1rxbn": 6400, - "HMbS5P3NTLQ5oR5TfLNvAkeQ7L8MPn9VM3": 6400, - "HRQe4CXj8AZXzSmuNztU8iQR74QTQMbnTs": 0, - "HVayMofEDh4XGsaQJeRJKhutYxYodYNop6": 100000000000, + 'HRXVDmLVdq8pgok1BCUKpiFWdAVAy4a5AJ': 100000000000, + 'HFyF1jYJP9FXfiC3LRqf3q4768TBL1rxbn': 6400, + 'HMbS5P3NTLQ5oR5TfLNvAkeQ7L8MPn9VM3': 6400, + 'HRQe4CXj8AZXzSmuNztU8iQR74QTQMbnTs': 0, } diff --git a/packages/daemon/__tests__/integration/scenario_configs/single_chain_blocks_and_transactions.balances.ts b/packages/daemon/__tests__/integration/scenario_configs/single_chain_blocks_and_transactions.balances.ts index 74184a92..b0422a90 100644 --- a/packages/daemon/__tests__/integration/scenario_configs/single_chain_blocks_and_transactions.balances.ts +++ b/packages/daemon/__tests__/integration/scenario_configs/single_chain_blocks_and_transactions.balances.ts @@ -1,16 +1,16 @@ export default { - "HFtz2f59Lms4p3Jfgtsr73s97MbJHsRENh": 6400, - "HJQbEERnD5Ak3f2dsi8zAmsZrCWTT8FZns": 6400, - "HRSYchTEsFFpZAkgSTMsohNGQ6eLPyhXvJ": 6400, - "HQfVqxyxQV4BHwnsMnRXpZGmwPYiNSVmMu": 6400, - "HPnkpR2vnBuCoZCEnRZNHMBtf8ygeSidbW": 6400, - "HPNvtPZaDF44i6CL91u4BvZPu6z2xPNt26": 6400, - "HQijr325t63VJFdc4vYkaTyd87oeBLpSed": 6400, - "H8fCNrYGkj4B6VzKgtRiHBgoSxM31d65JR": 6400, - "HAqrADnn7GyyT68fSX8zmtsRNFyabPzoRQ": 6400, - "HRTH6uGo7zn3LWrosBYn7eXkwAeHAHTRh8": 6400, - "HRQe4CXj8AZXzSmuNztU8iQR74QTQMbnTs": 3000, - "HRH8Wbmr1A3BrLswSBhvVE4hhsv4jUdyVA": 3400, - "HSd6PqXesUmHHv6MoN24aUiMuw7Pdcxrwk": 6400, - "HNqTfEASfdx7H4vMUGzfD2HyD3GeKuxjTJ": 0, + 'HFtz2f59Lms4p3Jfgtsr73s97MbJHsRENh': 6400, + 'HJQbEERnD5Ak3f2dsi8zAmsZrCWTT8FZns': 6400, + 'HRSYchTEsFFpZAkgSTMsohNGQ6eLPyhXvJ': 6400, + 'HQfVqxyxQV4BHwnsMnRXpZGmwPYiNSVmMu': 6400, + 'HPnkpR2vnBuCoZCEnRZNHMBtf8ygeSidbW': 6400, + 'HPNvtPZaDF44i6CL91u4BvZPu6z2xPNt26': 6400, + 'HQijr325t63VJFdc4vYkaTyd87oeBLpSed': 6400, + 'H8fCNrYGkj4B6VzKgtRiHBgoSxM31d65JR': 6400, + 'HAqrADnn7GyyT68fSX8zmtsRNFyabPzoRQ': 6400, + 'HRTH6uGo7zn3LWrosBYn7eXkwAeHAHTRh8': 6400, + 'HRQe4CXj8AZXzSmuNztU8iQR74QTQMbnTs': 3000, + 'HRH8Wbmr1A3BrLswSBhvVE4hhsv4jUdyVA': 3400, + 'HSd6PqXesUmHHv6MoN24aUiMuw7Pdcxrwk': 6400, + 'HNqTfEASfdx7H4vMUGzfD2HyD3GeKuxjTJ': 0, } diff --git a/packages/daemon/__tests__/integration/scenario_configs/unvoided_transactions.balances.ts b/packages/daemon/__tests__/integration/scenario_configs/unvoided_transactions.balances.ts index 58e6059c..7fdce785 100644 --- a/packages/daemon/__tests__/integration/scenario_configs/unvoided_transactions.balances.ts +++ b/packages/daemon/__tests__/integration/scenario_configs/unvoided_transactions.balances.ts @@ -1,16 +1,16 @@ export default { - "HFtz2f59Lms4p3Jfgtsr73s97MbJHsRENh": 6400, - "HJQbEERnD5Ak3f2dsi8zAmsZrCWTT8FZns": 6400, - "HRSYchTEsFFpZAkgSTMsohNGQ6eLPyhXvJ": 6400, - "HQfVqxyxQV4BHwnsMnRXpZGmwPYiNSVmMu": 6400, - "HPnkpR2vnBuCoZCEnRZNHMBtf8ygeSidbW": 6400, - "HPNvtPZaDF44i6CL91u4BvZPu6z2xPNt26": 6400, - "HQijr325t63VJFdc4vYkaTyd87oeBLpSed": 6400, - "H8fCNrYGkj4B6VzKgtRiHBgoSxM31d65JR": 6400, - "HAqrADnn7GyyT68fSX8zmtsRNFyabPzoRQ": 6400, - "HRTH6uGo7zn3LWrosBYn7eXkwAeHAHTRh8": 6400, - "H9hHteu9QdAS5p6X743Mpfue6G19rV9GeY": 6400, - "HNqTfEASfdx7H4vMUGzfD2HyD3GeKuxjTJ": 5400, - "HRQe4CXj8AZXzSmuNztU8iQR74QTQMbnTs": 1000, - "HVayMofEDh4XGsaQJeRJKhutYxYodYNop6": 100000000000 -} + 'HFtz2f59Lms4p3Jfgtsr73s97MbJHsRENh': 6400, + 'HJQbEERnD5Ak3f2dsi8zAmsZrCWTT8FZns': 6400, + 'HRSYchTEsFFpZAkgSTMsohNGQ6eLPyhXvJ': 6400, + 'HQfVqxyxQV4BHwnsMnRXpZGmwPYiNSVmMu': 6400, + 'HPnkpR2vnBuCoZCEnRZNHMBtf8ygeSidbW': 6400, + 'HPNvtPZaDF44i6CL91u4BvZPu6z2xPNt26': 6400, + 'HQijr325t63VJFdc4vYkaTyd87oeBLpSed': 6400, + 'H8fCNrYGkj4B6VzKgtRiHBgoSxM31d65JR': 6400, + 'HAqrADnn7GyyT68fSX8zmtsRNFyabPzoRQ': 6400, + 'HRTH6uGo7zn3LWrosBYn7eXkwAeHAHTRh8': 6400, + 'H9hHteu9QdAS5p6X743Mpfue6G19rV9GeY': 6400, + 'HNqTfEASfdx7H4vMUGzfD2HyD3GeKuxjTJ': 5400, + 'HRQe4CXj8AZXzSmuNztU8iQR74QTQMbnTs': 1000, + 'HRXVDmLVdq8pgok1BCUKpiFWdAVAy4a5AJ': 100000000000 +}; diff --git a/packages/daemon/__tests__/integration/scripts/docker-compose.yml b/packages/daemon/__tests__/integration/scripts/docker-compose.yml index 9262e1bb..afa5b5d4 100644 --- a/packages/daemon/__tests__/integration/scripts/docker-compose.yml +++ b/packages/daemon/__tests__/integration/scripts/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: mysql: image: mysql @@ -9,6 +7,7 @@ services: MYSQL_ROOT_PASSWORD: hathor ports: - "3380:3306" + unvoided_transaction: image: hathornetwork/hathor-core:stable command: [ @@ -36,6 +35,35 @@ services: ] ports: - "8083:8080" + invalid_mempool_transaction: + image: hathornetwork/hathor-core:stable + command: [ + "events_simulator", + "--scenario", "INVALID_MEMPOOL_TRANSACTION", + "--seed", "1" + ] + ports: + - "8085:8080" + + custom_scripts: + image: hathornetwork/hathor-core:stable + command: [ + "events_simulator", + "--scenario", "CUSTOM_SCRIPT", + "--seed", "1" + ] + ports: + - "8086:8080" + + empty_script: + image: hathornetwork/hathor-core:stable + command: [ + "events_simulator", + "--scenario", "EMPTY_SCRIPT", + "--seed", "1" + ] + ports: + - "8087:8080" networks: database: diff --git a/packages/daemon/__tests__/integration/utils/index.ts b/packages/daemon/__tests__/integration/utils/index.ts index 836aa063..fd38b055 100644 --- a/packages/daemon/__tests__/integration/utils/index.ts +++ b/packages/daemon/__tests__/integration/utils/index.ts @@ -5,7 +5,9 @@ * LICENSE file in the root directory of this source tree. */ import { Connection } from 'mysql2/promise'; -import { AddressBalance, AddressBalanceRow } from '../../../src/types'; +import { Interpreter } from 'xstate'; +import { getLastSyncedEvent } from '../../../src/db'; +import { AddressBalance, AddressBalanceRow, Context, Event } from '../../../src/types'; export const cleanDatabase = async (mysql: Connection): Promise => { const TABLES = [ @@ -68,9 +70,25 @@ export const validateBalances = async ( const totalBalanceA = balanceA.lockedBalance + balanceA.unlockedBalance; if (totalBalanceA !== balanceB) { - console.log(totalBalanceA); - console.log(balanceB); - throw new Error(`Balances are not equal for address: ${address}`); + throw new Error(`Balances are not equal for address: ${address}, expected: ${balanceB}, received: ${totalBalanceA}`); } } }; + +export async function transitionUntilEvent(mysql: Connection, machine: Interpreter, eventId: number) { + return await new Promise((resolve) => { + machine.onTransition(async (state) => { + if (state.matches('CONNECTED.idle')) { + // @ts-ignore + const lastSyncedEvent = await getLastSyncedEvent(mysql); + if (lastSyncedEvent?.last_event_id === eventId) { + machine.stop(); + + resolve(); + } + } + }); + + machine.start(); + }); +} diff --git a/packages/daemon/__tests__/services/services.test.ts b/packages/daemon/__tests__/services/services.test.ts index 78b6a639..a57ea954 100644 --- a/packages/daemon/__tests__/services/services.test.ts +++ b/packages/daemon/__tests__/services/services.test.ts @@ -19,7 +19,8 @@ import { getUtxosLockedAtHeight, addOrUpdateTx, getAddressWalletInfo, - generateAddresses, + storeTokenInformation, + getMaxIndicesForWallets, } from '../../src/db'; import { fetchInitialState, @@ -36,7 +37,18 @@ import { prepareOutputs, hashTxData, getFullnodeHttpUrl, + invokeOnTxPushNotificationRequestedLambda, + getWalletBalancesForTx, + generateAddresses, } from '../../src/utils'; +import getConfig from '../../src/config'; + +jest.mock('../../src/config', () => { + return { + __esModule: true, // This property is needed for mocking a default export + default: jest.fn(() => ({})), + }; +}); jest.mock('@hathor/wallet-lib'); jest.mock('../../src/logger', () => ({ @@ -72,6 +84,9 @@ jest.mock('../../src/db', () => ({ generateAddresses: jest.fn(), addNewAddresses: jest.fn(), updateWalletTablesWithTx: jest.fn(), + getMaxIndicesForWallets: jest.fn(() => new Map([ + ['wallet1', { maxAmongAddresses: 10, maxWalletIndex: 15 }] + ])), })); jest.mock('../../src/utils', () => ({ @@ -88,6 +103,10 @@ jest.mock('../../src/utils', () => ({ getUnixTimestamp: jest.fn(), unlockUtxos: jest.fn(), getFullnodeHttpUrl: jest.fn(), + invokeOnTxPushNotificationRequestedLambda: jest.fn(), + sendMessageSQS: jest.fn(), + getWalletBalancesForTx: jest.fn(), + generateAddresses: jest.fn(), })); beforeEach(() => { @@ -99,7 +118,7 @@ afterEach(() => { }); describe('fetchInitialState', () => { - beforeAll(() => { + beforeEach(() => { const mockUrl = 'http://mock-host:8080/v1a/'; (getFullnodeHttpUrl as jest.Mock).mockReturnValue(mockUrl); @@ -166,6 +185,46 @@ describe('fetchInitialState', () => { expect(mockDb.destroy).toHaveBeenCalled(); }); + it('should not fail if reward spend min blocks is 0', async () => { + // Mock the return values of the dependencies + const mockDb = { destroy: jest.fn() }; + + // @ts-ignore + axios.get.mockResolvedValue({ + status: 200, + data: { + version: '0.58.0-rc.1', + network: 'mainnet', + min_weight: 14, + min_tx_weight: 14, + min_tx_weight_coefficient: 1.6, + min_tx_weight_k: 100, + token_deposit_percentage: 0.01, + reward_spend_min_blocks: 0, + max_number_inputs: 255, + max_number_outputs: 255 + } + }); + + // @ts-ignore + getDbConnection.mockReturnValue(mockDb); + // @ts-ignore + getLastSyncedEvent.mockResolvedValue({ + id: 0, + last_event_id: 123, + updated_at: Date.now(), + }); + + const result = await fetchInitialState(); + + expect(result).toEqual({ + lastEventId: expect.any(Number), + rewardMinBlocks: 0, + }); + + expect(mockDb.destroy).toHaveBeenCalled(); + }); + it('should return undefined if no last event is found', async () => { const mockDb = { destroy: jest.fn() }; // @ts-ignore @@ -400,11 +459,18 @@ describe('handleVertexAccepted', () => { jest.clearAllMocks(); (getDbConnection as jest.Mock).mockResolvedValue(mockDb); - (getAddressWalletInfo as jest.Mock).mockResolvedValue({}); + (getAddressWalletInfo as jest.Mock).mockResolvedValue({ + address1: { walletId: 'wallet1', xpubkey: 'xpubkey1', maxGap: 10 } + }); + (generateAddresses as jest.Mock).mockResolvedValue({ - newAddresses: ['mockAddress1', 'mockAddress2'], - lastUsedAddressIndex: 1 + 'new-address-1': 16, + 'new-address-2': 17, }); + + (getMaxIndicesForWallets as jest.Mock).mockResolvedValue(new Map([ + ['wallet1', { maxAmongAddresses: 10, maxWalletIndex: 15 }] + ])); }); it('should handle vertex accepted successfully', async () => { @@ -461,6 +527,142 @@ describe('handleVertexAccepted', () => { expect(mockDb.commit).toHaveBeenCalled(); expect(mockDb.destroy).toHaveBeenCalled(); }); + + it('should handle call the push notification lambda if PUSH_NOTIFICATION_ENABLED is true', async () => { + const context = { + event: { + event: { + data: { + hash: 'hashValue', + metadata: { + height: 123, + first_block: true, + voided_by: [], + }, + timestamp: new Date().getTime(), + version: 1, + weight: 17.17, + outputs: [], + inputs: [1], + tokens: [], + }, + id: 'idValue', + }, + }, + rewardMinBlocks: 300, + txCache: { + get: jest.fn(), + set: jest.fn(), + }, + }; + + (getConfig as jest.Mock).mockReturnValue({ + PUSH_NOTIFICATION_ENABLED: true, + NEW_TX_SQS: 'http://nowhere.com', + }); + + (addOrUpdateTx as jest.Mock).mockReturnValue(Promise.resolve()); + (getTransactionById as jest.Mock).mockResolvedValue(null); // Transaction is not in the database + (prepareOutputs as jest.Mock).mockReturnValue([]); + (prepareInputs as jest.Mock).mockReturnValue([]); + (getAddressBalanceMap as jest.Mock).mockReturnValue({}); + (getUtxosLockedAtHeight as jest.Mock).mockResolvedValue([]); + (hashTxData as jest.Mock).mockReturnValue('hashedData'); + (getAddressWalletInfo as jest.Mock).mockResolvedValue({ + 'address1': { + walletId: 'wallet1', + xpubkey: 'xpubkey1', + maxGap: 10 + }, + }); + (getWalletBalancesForTx as jest.Mock).mockResolvedValue({ 'mockWallet': {} }); + (invokeOnTxPushNotificationRequestedLambda as jest.Mock).mockResolvedValue(undefined); + + await handleVertexAccepted(context as any, {} as any); + + expect(invokeOnTxPushNotificationRequestedLambda).toHaveBeenCalled(); + expect(mockDb.commit).toHaveBeenCalled(); + expect(mockDb.destroy).toHaveBeenCalled(); + }); + + it('should handle add tokens to database on token creation tx', async () => { + const tokenName = 'TEST_TOKEN'; + const tokenSymbol = 'TST_TKN'; + const hash = '000013f562dc216890f247688028754a49d21dbb2b1f7731f840dc65585b1d57'; + const context = { + event: { + event: { + data: { + hash, + metadata: { + height: 123, + first_block: true, + voided_by: [], + }, + timestamp: 'timestampValue', + version: 2, + weight: 70, + outputs: [], + inputs: [], + tokens: [], + token_name: tokenName, + token_symbol: tokenSymbol, + }, + id: 5 + }, + }, + rewardMinBlocks: 300, + txCache: { + get: jest.fn(), + set: jest.fn(), + }, + }; + + (addOrUpdateTx as jest.Mock).mockReturnValue(Promise.resolve()); + (getTransactionById as jest.Mock).mockResolvedValue(null); // Transaction is not in the database + (prepareOutputs as jest.Mock).mockReturnValue([]); + (prepareInputs as jest.Mock).mockReturnValue([]); + (getAddressBalanceMap as jest.Mock).mockReturnValue({}); + (getUtxosLockedAtHeight as jest.Mock).mockResolvedValue([]); + (hashTxData as jest.Mock).mockReturnValue('hashedData'); + (getAddressWalletInfo as jest.Mock).mockResolvedValue({ + 'address1': { + walletId: 'wallet1', + xpubkey: 'xpubkey1', + maxGap: 10 + }, + }); + + await handleVertexAccepted(context as any, {} as any); + + expect(storeTokenInformation).toHaveBeenCalledWith(mockDb, hash, tokenName, tokenSymbol); + expect(mockDb.commit).toHaveBeenCalled(); + expect(mockDb.destroy).toHaveBeenCalled(); + }); + + it('should rollback on error and rethrow', async () => { + (getTransactionById as jest.Mock).mockRejectedValue(new Error('Test error')); + + const context = { + rewardMinBlocks: 5, + event: { + event: { + data: { + hash: 'hashValue', + outputs: 'outputsValue', + inputs: 'inputsValue', + tokens: 'tokensValue', + }, + id: 'idValue', + }, + }, + }; + + await expect(handleVertexAccepted(context as any, {} as any)).rejects.toThrow('Test error'); + expect(mockDb.beginTransaction).toHaveBeenCalled(); + expect(mockDb.rollback).toHaveBeenCalled(); + expect(mockDb.destroy).toHaveBeenCalled(); + }); }); describe('metadataDiff', () => { diff --git a/packages/daemon/__tests__/services/services_with_db.test.ts b/packages/daemon/__tests__/services/services_with_db.test.ts new file mode 100644 index 00000000..33b7809e --- /dev/null +++ b/packages/daemon/__tests__/services/services_with_db.test.ts @@ -0,0 +1,64 @@ +/** + * Copyright (c) Hathor Labs and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import * as db from '../../src/db'; +import { handleVoidedTx } from '../../src/services'; +import { LRU } from '../../src/utils'; + +/** + * @jest-environment node + */ + +describe('handleVoidedTx (db)', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should handle transactions with an empty list of inputs', async () => { + const voidTxSpy = jest.spyOn(db, 'voidTransaction'); + voidTxSpy.mockResolvedValue(); + + const context = { + socket: expect.any(Object), + healthcheck: expect.any(Object), + retryAttempt: expect.any(Number), + initialEventId: expect.any(Number), + txCache: expect.any(LRU), + event: { + stream_id: 'stream-id', + peer_id: 'peer_id', + network: 'testnet', + type: 'FULLNODE_EVENT', + latest_event_id: 4, + event: { + id: 5, + data: { + hash: 'random-hash', + outputs: [], + inputs: [], + tokens: [], + }, + }, + }, + }; + + const mysql = await db.getDbConnection(); + await expect(handleVoidedTx(context as any)).resolves.not.toThrow(); + + const lastEvent = await db.getLastSyncedEvent(mysql); + expect(db.voidTransaction).toHaveBeenCalledWith( + expect.any(Object), + 'random-hash', + expect.any(Object), + ); + expect(lastEvent).toStrictEqual({ + id: expect.any(Number), + last_event_id: 5, + updated_at: expect.any(String), + }); + }); +}); diff --git a/packages/daemon/__tests__/types.ts b/packages/daemon/__tests__/types.ts index b78c7e32..dfe806c2 100644 --- a/packages/daemon/__tests__/types.ts +++ b/packages/daemon/__tests__/types.ts @@ -5,6 +5,14 @@ export interface AddressTableEntry { transactions: number; } +export interface TransactionTableEntry { + txId: string; + timestamp: number; + version: number; + voided: boolean; + height: number; +} + export interface WalletBalanceEntry { walletId: string; tokenId: string; diff --git a/packages/daemon/__tests__/utils.ts b/packages/daemon/__tests__/utils.ts index a20f362b..a5a0f7ab 100644 --- a/packages/daemon/__tests__/utils.ts +++ b/packages/daemon/__tests__/utils.ts @@ -6,7 +6,7 @@ */ import { Connection as MysqlConnection, RowDataPacket } from 'mysql2/promise'; -import { DbTxOutput, EventTxInput } from '../src/types'; +import { DbTxOutput, EventTxInput, TransactionTableRow } from '../src/types'; import { TxInput, TxOutputWithIndex } from '@wallet-service/common/src/types'; import { AddressBalanceRow, @@ -23,7 +23,8 @@ import { TokenTableEntry, WalletBalanceEntry, WalletTableEntry, - AddressTxHistoryTableEntry + AddressTxHistoryTableEntry, + TransactionTableEntry } from './types'; import { isEqual } from 'lodash'; @@ -245,6 +246,26 @@ export const addToAddressTable = async ( [payload]); }; +export const addToTransactionTable = async ( + mysql: MysqlConnection, + transactions: TransactionTableEntry[], +): Promise => { + const payload = transactions.map((entry) => ([ + entry.txId, + entry.timestamp, + entry.version, + entry.voided, + entry.height, + ])); + + await mysql.query(` + INSERT INTO \`transaction\` (\`tx_id\`, \`timestamp\`, + \`version\`, \`voided\`, + \`height\`) + VALUES ?`, + [payload]); +}; + export const checkAddressTable = async ( mysql: MysqlConnection, totalResults: number, @@ -289,6 +310,53 @@ export const checkAddressTable = async ( return true; }; +export const checkTransactionTable = async ( + mysql: MysqlConnection, + totalResults: number, + txId: string, + timestamp: number, + version: number, + voided: boolean, + height: number, +): Promise> => { + // first check the total number of rows in the table + let [results] = await mysql.query('SELECT * FROM `transaction`'); + + if (results.length !== totalResults) { + return { + error: 'checkTransactionTable total results', + expected: totalResults, + received: results.length, + results, + }; + } + + if (totalResults === 0) return true; + + // now fetch the exact entry + + [results] = await mysql.query(` + SELECT * + FROM \`transaction\` + WHERE \`tx_id\` = ? + AND \`timestamp\` = ? + AND \`version\` = ? + AND \`voided\` = ? + AND \`height\` = ? + `, [txId, timestamp, version, voided, height], + ); + + if (results.length !== 1) { + return { + error: 'checkAddressTable query', + params: { txId, timestamp, version, voided, height }, + results, + }; + } + + return true; +}; + export const checkAddressBalanceTable = async ( mysql: MysqlConnection, totalResults: number, diff --git a/packages/daemon/__tests__/utils/wallet.test.ts b/packages/daemon/__tests__/utils/wallet.test.ts new file mode 100644 index 00000000..4d60c86e --- /dev/null +++ b/packages/daemon/__tests__/utils/wallet.test.ts @@ -0,0 +1,49 @@ +/** + * Copyright (c) Hathor Labs and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { EventTxOutput } from '../../src/types'; +import { prepareOutputs } from '../../src/utils'; + +/** + * @jest-environment node + */ + +describe('prepareOutputs', () => { + it('should ignore NFT outputs', () => { + const nftOutputs: EventTxOutput[] = [{ + value: 1, + token_data: 0, + script: 'OmlwZnM6Ly9pcGZzL1FtTlJtNmhRUDN2MlVMclVOZTJQTTY4V1dRb2EyUmVwY1IxejVUVVdWZmd0bzGs', + // @ts-expect-error: This type is wrong, we should allow null here in the type + decoded: null + }, { + value: 2116, + token_data: 0, + script: 'dqkUCU1EY3YLi8WURhDOEsspok4Y0XiIrA==', + decoded: { + type: 'P2PKH', + address: 'H7NK2gjt5oaHzBEPoiH7y3d1NcPQi3Tr2F', + timelock: null, + } + }, { + value: 1, + token_data: 1, + script: 'dqkUXO7BFkikXo2qwldGMeJlzyPSbtKIrA==', + decoded: { + type: 'P2PKH', + address: 'HEzWZvoxDkZFnbmnK6BkQ8yw9xTyPXefGn', + timelock: null, + } + }]; + + const tokens = ['000013f562dc216890f247688028754a49d21dbb2b1f7731f840dc65585b1d57']; + const preparedOutputs = prepareOutputs(nftOutputs, tokens); + + expect(preparedOutputs).toHaveLength(2); + expect(preparedOutputs.find((output) => output.script === nftOutputs[0].script)).toBeUndefined(); + }); +}); diff --git a/packages/daemon/package.json b/packages/daemon/package.json index 6876993e..d772c757 100644 --- a/packages/daemon/package.json +++ b/packages/daemon/package.json @@ -14,10 +14,10 @@ "build": "tsc -b", "start": "node dist/index.js", "watch": "tsc -w", - "test_images_up": "docker-compose -f ./__tests__/integration/scripts/docker-compose.yml up -d", - "test_images_down": "docker-compose -f ./__tests__/integration/scripts/docker-compose.yml down", + "test_images_up": "docker compose -f ./__tests__/integration/scripts/docker-compose.yml up -d", + "test_images_down": "docker compose -f ./__tests__/integration/scripts/docker-compose.yml down", "test_images_integration": "jest --config ./jest_integration.config.js --runInBand --forceExit", - "test_images_migrate": "DB_NAME=hathor DB_PORT=3380 DB_PASS=hathor DB_USER=hathor yarn run sequelize-cli --migrations-path ../../db/migrations --config ./__tests__/integration/scripts/sequelize-db-config.js db:migrate", + "test_images_migrate": "NODE_ENV=test DB_NAME=hathor DB_PORT=3380 DB_PASS=hathor DB_USER=hathor yarn run sequelize-cli --migrations-path ../../db/migrations --config ./__tests__/integration/scripts/sequelize-db-config.js db:migrate", "test_images_wait_for_db": "yarn dlx ts-node ./__tests__/integration/scripts/wait-for-db-up.ts", "test_images_wait_for_ws": "yarn dlx ts-node ./__tests__/integration/scripts/wait-for-ws-up.ts", "test_images_setup_database": "yarn dlx ts-node ./__tests__/integration/scripts/setup-database.ts", @@ -28,22 +28,22 @@ "author": "André Abadesso", "module": "dist/index.js", "devDependencies": { - "@types/jest": "^29.5.4", - "@types/lodash": "^4.14.199", - "@types/mysql": "^2.15.21", - "@types/node": "^17.0.45", - "@types/ws": "^8.5.5", - "@typescript-eslint/eslint-plugin": "^6.7.3", - "@typescript-eslint/parser": "^6.7.3", - "eslint": "^9.3.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^27.4.0", - "jest": "^29.6.4", - "sequelize-cli": "^6.6.1", - "ts-jest": "^29.1.1", - "tslib": "^2.1.0", - "typescript": "^4.9.5" + "@types/jest": "29.5.4", + "@types/lodash": "4.14.199", + "@types/mysql": "2.15.21", + "@types/node": "17.0.45", + "@types/ws": "8.5.5", + "@typescript-eslint/eslint-plugin": "6.7.3", + "@typescript-eslint/parser": "6.7.3", + "eslint": "9.3.0", + "eslint-config-airbnb-base": "15.0.0", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-jest": "27.4.0", + "jest": "29.6.4", + "sequelize-cli": "6.6.1", + "ts-jest": "29.1.1", + "tslib": "2.1.0", + "typescript": "4.9.5" }, "peerDependencies": { "@hathor/wallet-lib": "0.39.0", @@ -52,16 +52,16 @@ "dependencies": { "@aws-sdk/client-lambda": "3.540.0", "@aws-sdk/client-sqs": "3.540.0", - "assert": "^2.1.0", - "aws-sdk": "^2.1454.0", - "axios": "^1.6.2", - "dotenv": "^8.2.0", - "lodash": "^4.17.21", - "mysql2": "^3.5.2", - "sequelize": "^6.33.0", - "websocket": "^1.0.33", - "winston": "^3.13.0", - "ws": "^8.13.0", - "xstate": "^4.38.2" + "assert": "2.1.0", + "aws-sdk": "2.1454.0", + "axios": "1.6.2", + "dotenv": "8.2.0", + "lodash": "4.17.21", + "mysql2": "3.5.2", + "sequelize": "6.33.0", + "websocket": "1.0.33", + "winston": "3.13.0", + "ws": "8.13.0", + "xstate": "4.38.2" } } diff --git a/packages/daemon/src/config.ts b/packages/daemon/src/config.ts index e924f2d8..1abac86c 100644 --- a/packages/daemon/src/config.ts +++ b/packages/daemon/src/config.ts @@ -74,6 +74,7 @@ export const PUSH_NOTIFICATION_LAMBDA_REGION = process.env.PUSH_NOTIFICATION_LAM export const ACCOUNT_ID = process.env.ACCOUNT_ID; export const ALERT_MANAGER_REGION = process.env.ALERT_MANAGER_REGION; export const ALERT_MANAGER_TOPIC = process.env.ALERT_MANAGER_TOPIC; +export const ALERT_MANAGER_ACCOUNT_ID = process.env.ALERT_MANAGER_ACCOUNT_ID; export const AWS_REGION = process.env.AWS_REGION; // Healthcheck configuration diff --git a/packages/daemon/src/db/index.ts b/packages/daemon/src/db/index.ts index ed5d533a..7ea1ab56 100644 --- a/packages/daemon/src/db/index.ts +++ b/packages/daemon/src/db/index.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -import mysql, { Connection as MysqlConnection, Pool } from 'mysql2/promise'; +import mysql, { Connection as MysqlConnection, OkPacket, Pool, ResultSetHeader } from 'mysql2/promise'; import { DbTxOutput, StringMap, @@ -19,6 +19,7 @@ import { TokenInfo, Miner, TokenSymbolsRow, + MaxAddressIndexRow, } from '../types'; import { TxInput, @@ -36,8 +37,6 @@ import { TransactionRow, TxOutputRow, } from '../types'; -// @ts-ignore -import { walletUtils } from '@hathor/wallet-lib'; import getConfig from '../config'; let pool: Pool; @@ -362,20 +361,51 @@ export const getTxOutputsAtHeight = async ( return utxos; }; +/** + * Void a transaction by updating the related address and balance information in the database. + * + * @param mysql - The MySQL connection object + * @param txId - The ID of the transaction to be voided. + * @param addressBalanceMap - A map where the key is an address and the value is a map of token balances. + * The TokenBalanceMap contains information about the total amount sent, unlocked and locked amounts, and authorities. + * + * @returns {Promise} - A promise that resolves when the transaction has been voided and the database updated + * + * This function performs the following steps: + * 1. Inserts addresses with a transaction count of 0 into the `address` table or subtracts 1 from the transaction count if they already exist + * 2. Iterates over the addressBalanceMap to update the `address_balance` table with the received token balances. + * 3. Deletes the transaction entry from the `address_tx_history` table. + * 4. Updates the transaction entry in the `transaction` table to mark it as voided. + * + * The function ensures that the authorities are correctly updated and the smallest timelock expiration value is preserved. + */ export const voidTransaction = async ( mysql: any, txId: string, addressBalanceMap: StringMap, ): Promise => { - const addressEntries = Object.keys(addressBalanceMap).map((address) => [address, 0]); - await mysql.query( - `INSERT INTO \`address\`(\`address\`, \`transactions\`) - VALUES ? - ON DUPLICATE KEY UPDATE transactions = transactions - 1`, - [addressEntries], + const [result]: [ResultSetHeader] = await mysql.query( + `UPDATE \`transaction\` + SET \`voided\` = TRUE + WHERE \`tx_id\` = ?`, + [txId], ); - const entries = []; + if (result.affectedRows !== 1) { + throw new Error('Tried to void a transaction that is not in the database.'); + } + + const addressEntries = Object.keys(addressBalanceMap).map((address) => [address, 0]); + + if (addressEntries.length > 0) { + await mysql.query( + `INSERT INTO \`address\`(\`address\`, \`transactions\`) + VALUES ? + ON DUPLICATE KEY UPDATE transactions = transactions - 1`, + [addressEntries], + ); + } + for (const [address, tokenMap] of Object.entries(addressBalanceMap)) { for (const [token, tokenBalance] of tokenMap.iterator()) { // update address_balance table or update balance and transactions if there's an entry already @@ -438,25 +468,13 @@ export const voidTransaction = async ( // for locked authorities, it doesn't make sense to perform the same operation. The authority needs to be // unlocked before it can be spent. In case we're just adding new locked authorities, this will be taken // care by the first sql query. - - // update address_tx_history with one entry for each pair (address, token) - entries.push(txId); } } await mysql.query( `DELETE FROM \`address_tx_history\` - WHERE \`tx_id\` - IN (?)`, - [entries], - ); - - await mysql.query( - `UPDATE \`transaction\` - SET \`voided\` = TRUE - WHERE \`tx_id\` - IN (?)`, - [entries], + WHERE \`tx_id\` = ?`, + [txId], ); }; @@ -478,6 +496,10 @@ export const updateAddressTablesWithTx = async ( timestamp: number, addressBalanceMap: StringMap, ): Promise => { + if (Object.keys(addressBalanceMap).length === 0) { + // No need to do anything here + return; + } /* * update address table * @@ -487,12 +509,14 @@ export const updateAddressTablesWithTx = async ( * If address is already present, just increment the transactions counter. */ const addressEntries = Object.keys(addressBalanceMap).map((address) => [address, 1]); - await mysql.query( - `INSERT INTO \`address\`(\`address\`, \`transactions\`) - VALUES ? - ON DUPLICATE KEY UPDATE transactions = transactions + 1`, - [addressEntries], - ); + if (addressEntries.length > 0) { + await mysql.query( + `INSERT INTO \`address\`(\`address\`, \`transactions\`) + VALUES ? + ON DUPLICATE KEY UPDATE transactions = transactions + 1`, + [addressEntries], + ); + } const entries = []; for (const [address, tokenMap] of Object.entries(addressBalanceMap)) { @@ -750,6 +774,10 @@ export const updateAddressLockedBalance = async ( * @returns A map of address and corresponding wallet information */ export const getAddressWalletInfo = async (mysql: MysqlConnection, addresses: string[]): Promise> => { + if (addresses.length === 0) { + return {}; + } + const addressWalletMap: StringMap = {}; const [results] = await mysql.query( `SELECT DISTINCT a.\`address\`, @@ -1017,6 +1045,10 @@ export const incrementTokensTxCount = async ( mysql: MysqlConnection, tokenList: string[], ): Promise => { + if (tokenList.length === 0) { + return; + } + await mysql.query(` UPDATE \`token\` SET \`transactions\` = \`transactions\` + 1 @@ -1024,81 +1056,6 @@ export const incrementTokensTxCount = async ( `, [tokenList]); }; -/** - * Given an xpubkey, generate its addresses. - * - * @remarks - * Also, check which addresses are used, taking into account the maximum gap of unused addresses (maxGap). - * This function doesn't update anything on the database, just reads data from it. - * - * @param mysql - Database connection - * @param xpubkey - The xpubkey - * @param maxGap - Number of addresses that should have no transactions before we consider all addresses loaded - * @returns Object with all addresses for the given xpubkey and corresponding index - */ -export const generateAddresses = async (mysql: MysqlConnection, xpubkey: string, maxGap: number): Promise => { - const existingAddresses: AddressIndexMap = {}; - const newAddresses: AddressIndexMap = {}; - const allAddresses: string[] = []; - - // We currently generate only addresses in change derivation path 0 - // (more details in https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#Change) - // so we derive our xpub to this path and use it to get the addresses - const derivedXpub = walletUtils.xpubDeriveChild(xpubkey, 0); - - let highestCheckedIndex = -1; - let lastUsedAddressIndex = -1; - do { - const { NETWORK } = getConfig(); - const addrMap = walletUtils.getAddresses(derivedXpub, highestCheckedIndex + 1, maxGap, NETWORK); - allAddresses.push(...Object.keys(addrMap)); - - const [results] = await mysql.query( - `SELECT \`address\`, - \`index\`, - \`transactions\` - FROM \`address\` - WHERE \`address\` - IN (?)`, - [Object.keys(addrMap)], - ); - - for (const entry of results) { - const address = entry.address as string; - // get index from addrMap as the one from entry might be null - const index = addrMap[address]; - // add to existingAddresses - existingAddresses[address] = index; - - // if address is used, check if its index is higher than the current highest used index - if (entry.transactions > 0 && index > lastUsedAddressIndex) { - lastUsedAddressIndex = index; - } - - delete addrMap[address]; - } - - highestCheckedIndex += maxGap; - Object.assign(newAddresses, addrMap); - } while (lastUsedAddressIndex + maxGap > highestCheckedIndex); - - // we probably generated more addresses than needed, as we always generate - // addresses in maxGap blocks - const totalAddresses = lastUsedAddressIndex + maxGap + 1; - for (const [address, index] of Object.entries(newAddresses)) { - if (index > lastUsedAddressIndex + maxGap) { - delete newAddresses[address]; - } - } - - return { - addresses: allAddresses.slice(0, totalAddresses), - newAddresses, - existingAddresses, - lastUsedAddressIndex, - }; -}; - /** * Add addresses to address table. * @@ -1325,6 +1282,10 @@ export const markUtxosAsVoided = async ( ): Promise => { const txIds = utxos.map((tx) => tx.txId); + if (txIds.length === 0) { + return; + } + await mysql.query(` UPDATE \`tx_output\` SET \`voided\` = TRUE @@ -1390,6 +1351,10 @@ export const fetchAddressBalance = async ( mysql: MysqlConnection, addresses: string[], ): Promise => { + if (addresses.length === 0) { + return []; + } + const [results] = await mysql.query( `SELECT * FROM \`address_balance\` @@ -1420,6 +1385,10 @@ export const fetchAddressTxHistorySum = async ( mysql: MysqlConnection, addresses: string[], ): Promise => { + if (addresses.length === 0) { + return []; + } + const [results] = await mysql.query( `SELECT address, token_id, @@ -1564,3 +1533,58 @@ export const getTokenSymbols = async ( return prev; }, {}) as unknown as StringMap; }; + +/** + * Get maximum indices for multiple wallets in a single query. + * + * This function retrieves two key metrics for each wallet: + * + * 1. `max_among_addresses`: The highest `index` value for the wallet, but only considering the specified addresses provided in `walletData`. + * 2. `max_wallet_index`: The highest `index` value for the wallet across all its addresses in the database. + * + * How it works: + * - The SQL query operates on the `address` table. + * - It groups the rows by `wallet_id` using `GROUP BY wallet_id`. + * - For each wallet group: + * - The `MAX` function calculates the highest `index` value in two contexts: + * a. For addresses explicitly listed in the input (`CASE WHEN address IN (?) THEN index END`). + * b. For all addresses associated with the wallet (`MAX(index)`). + * - If no addresses for a wallet match the provided input, `max_among_addresses` will be `NULL`. + * - If a wallet has no addresses in the database, both `max_among_addresses` and `max_wallet_index` will be `NULL`. + * + * This allows the function to return a consolidated view of the maximum indices for each wallet + * + * @param mysql - Database connection + * @param walletData - Array of objects containing wallet IDs and their associated addresses + * @returns Map of wallet IDs to their maximum indices (both among specific addresses and overall) + */ +export const getMaxIndicesForWallets = async ( + mysql: MysqlConnection, + walletData: Array<{walletId: string, addresses: string[]}> +): Promise> => { + if (walletData.length === 0) { + return new Map(); + } + + const allAddresses = walletData.flatMap(d => d.addresses); + const walletIds = walletData.map(d => d.walletId); + + const [results] = await mysql.query( + `SELECT + wallet_id, + MAX(CASE WHEN address IN (?) THEN \`index\` END) as max_among_addresses, + MAX(\`index\`) as max_wallet_index + FROM address + WHERE wallet_id IN (?) + GROUP BY wallet_id`, + [allAddresses, walletIds] + ); + + return new Map(results.map(r => [ + r.wallet_id, + { + maxAmongAddresses: r.max_among_addresses, + maxWalletIndex: r.max_wallet_index + } + ])); +}; diff --git a/packages/daemon/src/guards/index.ts b/packages/daemon/src/guards/index.ts index 56bf8aaf..4a062741 100644 --- a/packages/daemon/src/guards/index.ts +++ b/packages/daemon/src/guards/index.ts @@ -171,6 +171,19 @@ export const websocketDisconnected = (_context: Context, event: Event) => { return false; }; +/* + * This guard is used in the `idle` state to detect if the transaction in the + * received event is a vertex removed event, indicating that we should remove + * the transaction from our database + */ +export const vertexRemoved = (_context: Context, event: Event) => { + if (event.type !== EventTypes.FULLNODE_EVENT) { + throw new Error(`Invalid event type on vertexRemvoed guard: ${event.type}`); + } + + return event.event.event.type === FullNodeEventTypes.VERTEX_REMOVED; +}; + /* * This guard is used in the `idle` state to detect if the transaction in the * received event is voided, this can serve many functions, one of them is to diff --git a/packages/daemon/src/machines/SyncMachine.ts b/packages/daemon/src/machines/SyncMachine.ts index 10c7982d..1a125d11 100644 --- a/packages/daemon/src/machines/SyncMachine.ts +++ b/packages/daemon/src/machines/SyncMachine.ts @@ -18,6 +18,7 @@ import { } from '../types'; import { handleVertexAccepted, + handleVertexRemoved, metadataDiff, handleVoidedTx, handleTxFirstBlock, @@ -39,6 +40,7 @@ import { websocketDisconnected, voided, unchanged, + vertexRemoved, } from '../guards'; import { storeInitialState, @@ -70,6 +72,7 @@ export const CONNECTED_STATES = { handlingUnhandledEvent: 'handlingUnhandledEvent', handlingMetadataChanged: 'handlingMetadataChanged', handlingVertexAccepted: 'handlingVertexAccepted', + handlingVertexRemoved: 'handlingVertexRemoved', handlingVoidedTx: 'handlingVoidedTx', handlingUnvoidedTx: 'handlingUnvoidedTx', handlingFirstBlock: 'handlingFirstBlock', @@ -155,6 +158,10 @@ const SyncMachine = Machine({ */ cond: 'voided', target: CONNECTED_STATES.idle, + }, { + actions: ['storeEvent'], + cond: 'vertexRemoved', + target: CONNECTED_STATES.handlingVertexRemoved, }, { actions: ['storeEvent'], cond: 'vertexAccepted', @@ -210,6 +217,18 @@ const SyncMachine = Machine({ onError: `#${SYNC_MACHINE_STATES.ERROR}`, }, }, + [CONNECTED_STATES.handlingVertexRemoved]: { + id: CONNECTED_STATES.handlingVertexRemoved, + invoke: { + src: 'handleVertexRemoved', + data: (_context: Context, event: Event) => event, + onDone: { + target: 'idle', + actions: ['sendAck', 'storeEvent'], + }, + onError: `#${SYNC_MACHINE_STATES.ERROR}`, + }, + }, [CONNECTED_STATES.handlingVoidedTx]: { id: CONNECTED_STATES.handlingVoidedTx, invoke: { @@ -278,6 +297,7 @@ const SyncMachine = Machine({ websocketDisconnected, voided, unchanged, + vertexRemoved, }, delays: { BACKOFF_DELAYED_RECONNECT }, actions: { @@ -298,6 +318,7 @@ const SyncMachine = Machine({ handleVoidedTx, handleUnvoidedTx, handleVertexAccepted, + handleVertexRemoved, handleTxFirstBlock, metadataDiff, updateLastSyncedEvent, diff --git a/packages/daemon/src/services/index.ts b/packages/daemon/src/services/index.ts index d9a3f09e..77e5fc69 100644 --- a/packages/daemon/src/services/index.ts +++ b/packages/daemon/src/services/index.ts @@ -7,6 +7,7 @@ // @ts-ignore import hathorLib from '@hathor/wallet-lib'; +import { Connection as MysqlConnection } from 'mysql2/promise'; import axios from 'axios'; import { get } from 'lodash'; import { NftUtils } from '@wallet-service/common'; @@ -19,6 +20,9 @@ import { Event, Context, FullNodeEvent, + EventTxInput, + EventTxOutput, + WalletStatus, } from '../types'; import { TxInput, @@ -39,6 +43,8 @@ import { validateAddressBalances, getWalletBalancesForTx, getFullnodeHttpUrl, + sendMessageSQS, + generateAddresses, } from '../utils'; import { getDbConnection, @@ -53,7 +59,6 @@ import { getLockedUtxoFromInputs, incrementTokensTxCount, getAddressWalletInfo, - generateAddresses, addNewAddresses, updateWalletTablesWithTx, voidTransaction, @@ -62,10 +67,11 @@ import { getTxOutputsFromTx, markUtxosAsVoided, cleanupVoidedTx, + getMaxIndicesForWallets, } from '../db'; import getConfig from '../config'; import logger from '../logger'; -import { invokeOnTxPushNotificationRequestedLambda, sendMessageSQS } from '../utils/aws'; +import { invokeOnTxPushNotificationRequestedLambda } from '../utils'; export const METADATA_DIFF_EVENT_TYPES = { IGNORE: 'IGNORE', @@ -159,11 +165,16 @@ export const isBlock = (version: number): boolean => version === hathorLib.const export const handleVertexAccepted = async (context: Context, _event: Event) => { const mysql = await getDbConnection(); await mysql.beginTransaction(); + const { + NETWORK, + STAGE, + PUSH_NOTIFICATION_ENABLED, + NEW_TX_SQS, + } = getConfig(); try { const fullNodeEvent = context.event as FullNodeEvent; const now = getUnixTimestamp(); - const { NEW_TX_SQS, PUSH_NOTIFICATION_ENABLED } = getConfig(); const blockRewardLock = context.rewardMinBlocks; if (!blockRewardLock) { @@ -225,7 +236,9 @@ export const handleVertexAccepted = async (context: Context, _event: Event) => { const blockRewardOutput = outputs[0]; // add miner to the miners table - await addMiner(mysql, blockRewardOutput.decoded.address, hash); + if (blockRewardOutput.decoded) { + await addMiner(mysql, blockRewardOutput.decoded.address, hash); + } // here we check if we have any utxos on our database that is locked but // has its timelock < now @@ -267,6 +280,8 @@ export const handleVertexAccepted = async (context: Context, _event: Event) => { // Add utxos await addUtxos(mysql, hash, txOutputs, heightlock); + + // Mark tx utxos as spent await updateTxOutputSpentBy(mysql, txInputs, hash); // Genesis tx has no inputs and outputs, so nothing to be updated, avoid it @@ -284,31 +299,78 @@ export const handleVertexAccepted = async (context: Context, _event: Event) => { // for the addresses present on the tx, check if there are any wallets associated const addressWalletMap: StringMap = await getAddressWalletInfo(mysql, Object.keys(addressBalanceMap)); - // for each already started wallet, update databases - const seenWallets = new Set(); - for (const wallet of Object.values(addressWalletMap)) { - const walletId = wallet.walletId; - - // this map might contain duplicate wallet values, as 2 different addresses might belong to the same wallet - if (seenWallets.has(walletId)) continue; - seenWallets.add(walletId); - const { newAddresses, lastUsedAddressIndex } = await generateAddresses(mysql, wallet.xpubkey, wallet.maxGap); - // might need to generate new addresses to keep maxGap - await addNewAddresses(mysql, walletId, newAddresses, lastUsedAddressIndex); - // update existing addresses' walletId and index + const addressesPerWallet = Object.entries(addressWalletMap).reduce( + (result: StringMap<{ addresses: string[], walletDetails: Wallet }>, [address, wallet]: [string, Wallet]) => { + const { walletId } = wallet; + + // Initialize the array if the walletId is not yet a key in result + if (!result[walletId]) { + result[walletId] = { + addresses: [], + walletDetails: wallet, + } + } + + // Add the current key to the array + result[walletId].addresses.push(address); + + return result; + }, {}); + + const seenWallets = Object.keys(addressesPerWallet); + + // Convert to array format expected by getMaxIndicesForWallets + const walletDataArray = Object.entries(addressesPerWallet).map(([walletId, data]) => ({ + walletId, + addresses: data.addresses + })); + + // Get all max indices in a single query + const walletIndices = await getMaxIndicesForWallets(mysql, walletDataArray); + + // Process each wallet + for (const [walletId, data] of Object.entries(addressesPerWallet)) { + const { walletDetails } = data; + const indices = walletIndices.get(walletId); + + if (!indices) { + // This is unexpected as we just queried for this wallet + logger.error('Failed to get indices for wallet', { walletId }); + continue; + } + + const { maxAmongAddresses, maxWalletIndex } = indices; + + if (!maxAmongAddresses || !maxWalletIndex) { + // Do nothing, wallet is most likely not loaded yet. + if (walletDetails.status === WalletStatus.READY) { + logger.error('[ERROR] A wallet marked as READY does not have a max wallet index or address index was not found in the database'); + } + continue; + } + + const diff = maxWalletIndex - maxAmongAddresses; + + if (diff < walletDetails.maxGap) { + // We need to generate addresses + const addresses = await generateAddresses(NETWORK as string, walletDetails.xpubkey, maxWalletIndex + 1, walletDetails.maxGap - diff); + await addNewAddresses(mysql, walletId, addresses, maxAmongAddresses); + } } + // update wallet_balance and wallet_tx_history tables const walletBalanceMap: StringMap = getWalletBalanceMap(addressWalletMap, addressBalanceMap); await updateWalletTablesWithTx(mysql, hash, timestamp, walletBalanceMap); - const tx: Transaction = { + // prepare the transaction data to be sent to the SQS queue + const txData: Transaction = { tx_id: hash, nonce, timestamp, + version, voided: metadata.voided_by.length > 0, weight, parents, - version, inputs: txInputs, outputs: txOutputs, height: metadata.height, @@ -318,7 +380,7 @@ export const handleVertexAccepted = async (context: Context, _event: Event) => { }; try { - if (seenWallets.size > 0) { + if (seenWallets.length > 0) { const queueUrl = NEW_TX_SQS; if (!queueUrl) { throw new Error('Queue URL is invalid'); @@ -326,7 +388,7 @@ export const handleVertexAccepted = async (context: Context, _event: Event) => { await sendMessageSQS(JSON.stringify({ wallets: Array.from(seenWallets), - tx, + txData, }), queueUrl); } } catch (e) { @@ -336,7 +398,7 @@ export const handleVertexAccepted = async (context: Context, _event: Event) => { try { if (PUSH_NOTIFICATION_ENABLED) { - const walletBalanceMap = await getWalletBalancesForTx(mysql, tx); + const walletBalanceMap = await getWalletBalancesForTx(mysql, txData); const { length: hasAffectWallets } = Object.keys(walletBalanceMap); if (hasAffectWallets) { invokeOnTxPushNotificationRequestedLambda(walletBalanceMap) @@ -348,18 +410,13 @@ export const handleVertexAccepted = async (context: Context, _event: Event) => { logger.error(e); } - const { - NETWORK, - STAGE, - } = getConfig(); - const network = new hathorLib.Network(NETWORK); // Validating for NFTs only after the tx is successfully added - if (NftUtils.shouldInvokeNftHandlerForTx(tx, network, logger)) { + if (NftUtils.shouldInvokeNftHandlerForTx(txData, network, logger)) { // This process is not critical, so we run it in a fire-and-forget manner, not waiting for the promise. // In case of errors, just log the asynchronous exception and take no action on it. - NftUtils.invokeNftHandlerLambda(tx.tx_id, STAGE, logger) + NftUtils.invokeNftHandlerLambda(txData.tx_id, STAGE, logger) .catch((err: unknown) => logger.error('[ALERT] Error on nftHandlerLambda invocation', err)); } } @@ -369,7 +426,10 @@ export const handleVertexAccepted = async (context: Context, _event: Event) => { await mysql.commit(); } catch (e) { await mysql.rollback(); - logger.error(e); + logger.error('Error handling vertex accepted', { + error: (e as Error).message, + stack: (e as Error).stack, + }); throw e; } finally { @@ -377,7 +437,7 @@ export const handleVertexAccepted = async (context: Context, _event: Event) => { } }; -export const handleVoidedTx = async (context: Context) => { +export const handleVertexRemoved = async (context: Context, _event: Event) => { const mysql = await getDbConnection(); await mysql.beginTransaction(); @@ -391,37 +451,93 @@ export const handleVoidedTx = async (context: Context) => { tokens, } = fullNodeEvent.event.data; - logger.debug(`Will handle voided tx for ${hash}`); + const dbTx: DbTransaction | null = await getTransactionById(mysql, hash); - const dbTxOutputs: DbTxOutput[] = await getTxOutputsFromTx(mysql, hash); - const txOutputs: TxOutputWithIndex[] = prepareOutputs(outputs, tokens); - const txInputs: TxInput[] = prepareInputs(inputs, tokens); + if (!dbTx) { + throw new Error(`VERTEX_REMOVED event received, but transaction ${hash} was not in the database.`); + } - const txOutputsWithLocked = txOutputs.map((output) => { - const dbTxOutput = dbTxOutputs.find((_output) => _output.index === output.index); + logger.info(`[VertexRemoved] Voiding tx: ${hash}`); + await voidTx( + mysql, + hash, + inputs, + outputs, + tokens, + ); - if (!dbTxOutput) { - throw new Error('Transaction output different from database output!'); - } + logger.info(`[VertexRemoved] Removing tx from database: ${hash}`); + await cleanupVoidedTx(mysql, hash); + await dbUpdateLastSyncedEvent(mysql, fullNodeEvent.event.id); + await mysql.commit(); + } catch (e) { + logger.debug(e); + await mysql.rollback(); - return { - ...output, - locked: dbTxOutput.locked, - }; - }); + throw e; + } finally { + mysql.destroy(); + } +}; + +export const voidTx = async ( + mysql: MysqlConnection, + hash: string, + inputs: EventTxInput[], + outputs: EventTxOutput[], + tokens: string[], +) => { + const dbTxOutputs: DbTxOutput[] = await getTxOutputsFromTx(mysql, hash); + const txOutputs: TxOutputWithIndex[] = prepareOutputs(outputs, tokens); + const txInputs: TxInput[] = prepareInputs(inputs, tokens); + + const txOutputsWithLocked = txOutputs.map((output) => { + const dbTxOutput = dbTxOutputs.find((_output) => _output.index === output.index); + + if (!dbTxOutput) { + throw new Error('Transaction output different from database output!'); + } - const addressBalanceMap: StringMap = getAddressBalanceMap(txInputs, txOutputsWithLocked); - await voidTransaction(mysql, hash, addressBalanceMap); - await markUtxosAsVoided(mysql, dbTxOutputs); + return { + ...output, + locked: dbTxOutput.locked, + }; + }); - const addresses = Object.keys(addressBalanceMap); - await validateAddressBalances(mysql, addresses); + const addressBalanceMap: StringMap = getAddressBalanceMap(txInputs, txOutputsWithLocked); + await voidTransaction(mysql, hash, addressBalanceMap); + await markUtxosAsVoided(mysql, dbTxOutputs); - await dbUpdateLastSyncedEvent(mysql, fullNodeEvent.event.id); + const addresses = Object.keys(addressBalanceMap); + await validateAddressBalances(mysql, addresses); +}; +export const handleVoidedTx = async (context: Context) => { + const mysql = await getDbConnection(); + await mysql.beginTransaction(); + + try { + const fullNodeEvent = context.event as FullNodeEvent; + + const { + hash, + outputs, + inputs, + tokens, + } = fullNodeEvent.event.data; + + logger.debug(`Will handle voided tx for ${hash}`); + await voidTx( + mysql, + hash, + inputs, + outputs, + tokens + ); logger.debug(`Voided tx ${hash}`); await mysql.commit(); + await dbUpdateLastSyncedEvent(mysql, fullNodeEvent.event.id); } catch (e) { logger.debug(e); await mysql.rollback(); @@ -528,7 +644,7 @@ export const fetchMinRewardBlocks = async () => { const rewardSpendMinBlocks = get(response, 'data.reward_spend_min_blocks'); - if (!rewardSpendMinBlocks) { + if (rewardSpendMinBlocks == null) { throw new Error('Failed to fetch reward spend min blocks'); } diff --git a/packages/daemon/src/types/db.ts b/packages/daemon/src/types/db.ts index 435ed076..b9685685 100644 --- a/packages/daemon/src/types/db.ts +++ b/packages/daemon/src/types/db.ts @@ -53,6 +53,14 @@ export interface AddressTableRow extends RowDataPacket { transactions: number; } +export interface TransactionTableRow extends RowDataPacket { + tx_id: string; + timestamp: number; + version: number; + voided: boolean; + height: number; +} + export interface AddressBalanceRow extends RowDataPacket { address: string; token_id: string; @@ -132,3 +140,8 @@ export interface TokenSymbolsRow extends RowDataPacket { id: string; symbol: string; } + +export interface MaxAddressIndexRow extends RowDataPacket { + max_among_addresses: number, + max_wallet_index: number +} diff --git a/packages/daemon/src/types/event.ts b/packages/daemon/src/types/event.ts index ca2685c6..83cdc958 100644 --- a/packages/daemon/src/types/event.ts +++ b/packages/daemon/src/types/event.ts @@ -9,11 +9,6 @@ export type WebSocketEvent = | { type: 'CONNECTED' } | { type: 'DISCONNECTED' }; -export type MetadataDecidedEvent = { - type: 'TX_VOIDED' | 'TX_UNVOIDED' | 'TX_NEW' | 'TX_FIRST_BLOCK' | 'IGNORE'; - originalEvent: FullNodeEvent; -} - export type WebSocketSendEvent = | { type: 'START_STREAM'; @@ -40,10 +35,17 @@ export enum EventTypes { export enum FullNodeEventTypes { VERTEX_METADATA_CHANGED = 'VERTEX_METADATA_CHANGED', + VERTEX_REMOVED = 'VERTEX_REMOVED', NEW_VERTEX_ACCEPTED = 'NEW_VERTEX_ACCEPTED', LOAD_STARTED = 'LOAD_STARTED', LOAD_FINISHED = 'LOAD_FINISHED', - REORG_STARTED = 'REORG_FINISHED', + REORG_STARTED = 'REORG_STARTED', + REORG_FINISHED= 'REORG_FINISHED', +} + +export type MetadataDecidedEvent = { + type: 'TX_VOIDED' | 'TX_UNVOIDED' | 'TX_NEW' | 'TX_FIRST_BLOCK' | 'IGNORE'; + originalEvent: FullNodeEvent; } export type Event = @@ -53,6 +55,11 @@ export type Event = | { type: EventTypes.WEBSOCKET_SEND_EVENT, event: WebSocketSendEvent } | { type: EventTypes.HEALTHCHECK_EVENT, event: HealthCheckEvent}; + +export interface VertexRemovedEventData { + vertex_id: string; +} + export type FullNodeEvent = { stream_id: string; peer_id: string; diff --git a/packages/daemon/src/utils/hash.ts b/packages/daemon/src/utils/hash.ts index 7e985308..8d041ef8 100644 --- a/packages/daemon/src/utils/hash.ts +++ b/packages/daemon/src/utils/hash.ts @@ -9,7 +9,7 @@ import * as crypto from 'crypto'; /** * Generates an MD5 hash of the provided string data. - * + * * @param data - The string data to hash. * @returns - The MD5 hash of the data in hexadecimal format. */ @@ -21,7 +21,7 @@ export const md5Hash = (data: string): string => { /** * Serializes select transaction metadata attributes into a string format. - * + * * @param meta - The transaction metadata to serialize. * @returns - A serialized string representing specific fields of the metadata. */ @@ -31,9 +31,9 @@ export const serializeTxData = (meta: unknown): string => /** * Hashes transaction metadata using MD5. - * + * * Serializes the relevant fields of transaction metadata and then computes its MD5 hash. - * + * * @param meta - The transaction metadata to hash. * @returns - The MD5 hash of the serialized metadata. */ diff --git a/packages/daemon/src/utils/index.ts b/packages/daemon/src/utils/index.ts index f037423a..c29b6e2d 100644 --- a/packages/daemon/src/utils/index.ts +++ b/packages/daemon/src/utils/index.ts @@ -10,3 +10,4 @@ export * from './cache'; export * from './wallet'; export * from './date'; export * from './helpers'; +export * from './aws'; diff --git a/packages/daemon/src/utils/wallet.ts b/packages/daemon/src/utils/wallet.ts index 1ff43b1a..11a2b0bc 100644 --- a/packages/daemon/src/utils/wallet.ts +++ b/packages/daemon/src/utils/wallet.ts @@ -40,6 +40,8 @@ import { updateWalletLockedBalance, } from '../db'; import logger from '../logger'; +// @ts-ignore +import { walletUtils } from '@hathor/wallet-lib'; import { stringMapIterator } from './helpers'; /** @@ -58,6 +60,10 @@ import { stringMapIterator } from './helpers'; * metadata. */ export const prepareOutputs = (outputs: EventTxOutput[], tokens: string[]): TxOutputWithIndex[] => { + if (outputs.length === 0) { + return []; + } + const preparedOutputs: [number, TxOutputWithIndex[]] = outputs.reduce( ([currIndex, newOutputs]: [number, TxOutputWithIndex[]], _output: EventTxOutput): [number, TxOutputWithIndex[]] => { const output = new Output(_output.value, Buffer.from(_output.script, 'base64'), { @@ -121,7 +127,9 @@ export const getAddressBalanceMap = ( for (const input of inputs) { if (!input.decoded) { - throw new Error('Input has no decoded script'); + // If we're unable to decode the script, we will also be unable to + // calculate the balance, so just skip this input. + continue; } const address = input.decoded?.address; @@ -290,11 +298,11 @@ export const prepareInputs = (inputs: EventTxInput[], tokens: string[]): TxInput // @ts-ignore script: utxo.script, token, - decoded: { + decoded: output.decoded ? { type: output.decoded.type, address: output.decoded.address, timelock: output.decoded.timelock, - }, + } : null, }; return [...newInputs, input]; @@ -501,3 +509,29 @@ export class WalletBalanceMapConverter { return walletBalanceValueMap; } } + +/** + * Generate a batch of addresses from a given xpubkey. + * + * @remarks + * This function generates addresses starting from a specific index. + * + * @param xpubkey - The extended public key to derive addresses from + * @param startIndex - The index to start generating addresses from + * @param count - How many addresses to generate + * @returns A map of addresses to their corresponding indices + */ +export const generateAddresses = async ( + network: string, + xpubkey: string, + startIndex: number, + count: number, +): Promise> => { + // We currently generate only addresses in change derivation path 0 + // (more details in https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#Change) + // so we derive our xpub to this path and use it to get the addresses + const derivedXpub = walletUtils.xpubDeriveChild(xpubkey, 0); + const addrMap = walletUtils.getAddresses(derivedXpub, startIndex, count, network); + + return addrMap; +}; diff --git a/packages/wallet-service/README.md b/packages/wallet-service/README.md index 1c4c59fa..a185cc40 100644 --- a/packages/wallet-service/README.md +++ b/packages/wallet-service/README.md @@ -69,6 +69,10 @@ PUSH_ALLOWED_PROVIDERS=android Do not modify the `STAGE` variable. The other variables should be updated accordingly. +The following variables are optional: + +- `ALERT_MANAGER_ACCOUNT_ID`: Account ID to send alerts to. If not set, `ACCOUNT_ID` will be used instead. If neither is set, alerting will not work. + ### AWS cli credentials You need to have `awscli` [configured with your credentials](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html). diff --git a/packages/wallet-service/package.json b/packages/wallet-service/package.json index 3699da5b..87e75d00 100644 --- a/packages/wallet-service/package.json +++ b/packages/wallet-service/package.json @@ -14,66 +14,67 @@ "@aws-sdk/client-apigatewaymanagementapi": "3.540.0", "@aws-sdk/client-lambda": "3.540.0", "@aws-sdk/client-sqs": "3.540.0", - "@hathor/healthcheck-lib": "^0.1.0", - "@middy/core": "^2.5.7", - "@middy/http-cors": "^2.5.7", - "@types/redis": "^2.8.28", - "aws-lambda": "^1.0.7", - "axios": "^0.21.1", - "bip32": "^3.0.1", - "bitcoinjs-lib": "^6.1.5", - "bitcoinjs-message": "^2.2.0", + "@hathor/healthcheck-lib": "0.1.0", + "@middy/core": "2.5.7", + "@middy/http-cors": "2.5.7", + "@types/redis": "2.8.28", + "aws-lambda": "1.0.7", + "axios": "0.21.1", + "bip32": "3.0.1", + "bitcoinjs-lib": "6.1.5", + "bitcoinjs-message": "2.2.0", "bitcore-lib": "8.25.10", "bitcore-mnemonic": "8.25.10", - "firebase-admin": "^11.3.0", - "joi": "^17.4.0", - "jsonwebtoken": "^8.5.1", - "lodash": "^4.17.21", - "mysql": "^2.18.1", - "mysql2": "^2.2.5", - "prom-client": "^13.2.0", - "redis": "^3.1.2", - "serverless-mysql": "^1.5.4", - "source-map-support": "^0.5.19", - "tiny-secp256k1": "^2.2.1", - "uuid": "^8.3.0", - "winston": "^3.13.0" + "firebase-admin": "13.0.0", + "joi": "17.4.0", + "jsonwebtoken": "8.5.1", + "lodash": "4.17.21", + "mysql": "2.18.1", + "mysql2": "2.2.5", + "prom-client": "13.2.0", + "redis": "3.1.2", + "serverless-mysql": "1.5.4", + "source-map-support": "0.5.19", + "tiny-secp256k1": "2.2.1", + "uuid": "8.3.0", + "winston": "3.13.0" }, "peerDependencies": { - "@hathor/wallet-lib": "^0.39.0", + "@hathor/wallet-lib": "0.39.0", "@wallet-service/common": "1.5.0" }, "devDependencies": { - "@types/aws-lambda": "^8.10.95", - "@types/jest": "^27.0.24", - "@types/node": "^18.0.4", - "@typescript-eslint/eslint-plugin": "^6.7.4", - "@typescript-eslint/parser": "^3.3.0", - "dotenv": "^10.0.0", - "eslint": "^8.50.0", - "eslint-config-airbnb-base": "^14.2.1", - "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.23.3", - "eslint-plugin-jest": "^23.13.2", - "eslint-plugin-module-resolver": "^0.16.0", - "fork-ts-checker-webpack-plugin": "^9.0.0", - "jest": "^29.7.0", - "npm-run-all": "^4.1.5", - "serverless": "^3.35.2", - "serverless-api-gateway-throttling": "^1.1.1", - "serverless-iam-roles-per-function": "^3.2.0", - "serverless-offline": "^13.1.2", - "serverless-plugin-aws-alerts": "^1.7.5", - "serverless-plugin-monorepo": "^0.11.0", - "serverless-plugin-warmup": "^8.2.1", - "serverless-prune-plugin": "^2.0.2", - "serverless-webpack": "^5.13.0", - "sqlite3": "^5.0.2", - "ts-jest": "^29.1.1", - "ts-loader": "^9.4.4", - "typescript": "^4.9.3", + "@types/aws-lambda": "8.10.95", + "@types/jest": "^29.5.13", + "@types/node": "18.0.4", + "@typescript-eslint/eslint-plugin": "6.7.4", + "@typescript-eslint/parser": "3.3.0", + "dotenv": "10.0.0", + "eslint": "8.50.0", + "eslint-config-airbnb-base": "14.2.1", + "eslint-import-resolver-alias": "1.1.2", + "eslint-plugin-import": "2.23.3", + "eslint-plugin-jest": "23.13.2", + "eslint-plugin-module-resolver": "0.16.0", + "fork-ts-checker-webpack-plugin": "9.0.0", + "jest": "29.7.0", + "npm-run-all": "4.1.5", + "serverless": "3.35.2", + "serverless-api-gateway-throttling": "2.0.3", + "serverless-better-credentials": "2.0.0", + "serverless-iam-roles-per-function": "3.2.0", + "serverless-offline": "13.1.2", + "serverless-plugin-aws-alerts": "1.7.5", + "serverless-plugin-monorepo": "0.11.0", + "serverless-plugin-warmup": "8.2.1", + "serverless-prune-plugin": "2.0.2", + "serverless-webpack": "5.13.0", + "sqlite3": "5.1.7", + "ts-jest": "29.1.1", + "ts-loader": "9.4.4", + "typescript": "4.9.3", "typescript-eslint": "0.0.1-alpha.0", - "webpack": "^5.88.2", - "webpack-node-externals": "^3.0.0" + "webpack": "5.88.2", + "webpack-node-externals": "3.0.0" } } diff --git a/packages/wallet-service/serverless.yml b/packages/wallet-service/serverless.yml index cbe6e594..d0ab53b9 100644 --- a/packages/wallet-service/serverless.yml +++ b/packages/wallet-service/serverless.yml @@ -37,10 +37,10 @@ custom: topics: # SNS Topics to send alerts to major: alarm: - topic: arn:aws:sns:${self:provider.region}:${self:provider.environment.ACCOUNT_ID}:opsgenie-cloudwatch-integration-production-major + topic: arn:aws:sns:${self:provider.region}:${self:provider.environment.ALERT_MANAGER_ACCOUNT_ID}:opsgenie-cloudwatch-integration-production-major minor: alarm: - topic: arn:aws:sns:${self:provider.region}:${self:provider.environment.ACCOUNT_ID}:opsgenie-cloudwatch-integration-production-minor + topic: arn:aws:sns:${self:provider.region}:${self:provider.environment.ALERT_MANAGER_ACCOUNT_ID}:opsgenie-cloudwatch-integration-production-minor definitions: # Definition of alarms majorFunctionErrors: description: "Too many errors in hathor-wallet-service. Runbook: https://github.com/HathorNetwork/ops-tools/blob/master/docs/runbooks/wallet-service/errors-in-logs.md" @@ -93,6 +93,9 @@ custom: - minorFunctionErrors plugins: + # TODO: Serverless v4 should render this plugin obsolete. Remove it when upgrading. + # It's currently in beta, so I preferred not to upgrade yet - 2024-06-03 - luislhl + - serverless-better-credentials - serverless-offline - serverless-plugin-monorepo - serverless-webpack @@ -146,7 +149,7 @@ provider: - sqs:* Resource: - Fn::GetAtt: [ WalletServiceNewTxQueue, Arn ] - - arn:aws:sqs:${self:provider.environment.ALERT_MANAGER_REGION}:${self:provider.environment.ACCOUNT_ID}:${self:provider.environment.ALERT_MANAGER_TOPIC} + - arn:aws:sqs:${self:provider.environment.ALERT_MANAGER_REGION}:${self:provider.environment.ALERT_MANAGER_ACCOUNT_ID}:${self:provider.environment.ALERT_MANAGER_TOPIC} vpc: securityGroupIds: - ${env:AWS_VPC_DEFAULT_SG_ID} @@ -193,18 +196,19 @@ provider: WALLET_SERVICE_LAMBDA_ENDPOINT: ${env:WALLET_SERVICE_LAMBDA_ENDPOINT} PUSH_NOTIFICATION_ENABLED: ${env:PUSH_NOTIFICATION_ENABLED} PUSH_ALLOWED_PROVIDERS: ${env:PUSH_ALLOWED_PROVIDERS} - FIREBASE_PROJECT_ID: ${env:FIREBASE_PROJECT_ID} - FIREBASE_PRIVATE_KEY_ID: ${env:FIREBASE_PRIVATE_KEY_ID} - FIREBASE_PRIVATE_KEY: ${env:FIREBASE_PRIVATE_KEY} - FIREBASE_CLIENT_EMAIL: ${env:FIREBASE_CLIENT_EMAIL} - FIREBASE_CLIENT_ID: ${env:FIREBASE_CLIENT_ID} - FIREBASE_AUTH_URI: ${env:FIREBASE_AUTH_URI} - FIREBASE_TOKEN_URI: ${env:FIREBASE_TOKEN_URI} - FIREBASE_AUTH_PROVIDER_X509_CERT_URL: ${env:FIREBASE_AUTH_PROVIDER_X509_CERT_URL} - FIREBASE_CLIENT_X509_CERT_URL: ${env:FIREBASE_CLIENT_X509_CERT_URL} + FIREBASE_PROJECT_ID: ${env:FIREBASE_PROJECT_ID, ''} + FIREBASE_PRIVATE_KEY_ID: ${env:FIREBASE_PRIVATE_KEY_ID, ''} + FIREBASE_PRIVATE_KEY: ${env:FIREBASE_PRIVATE_KEY, ''} + FIREBASE_CLIENT_EMAIL: ${env:FIREBASE_CLIENT_EMAIL, ''} + FIREBASE_CLIENT_ID: ${env:FIREBASE_CLIENT_ID, ''} + FIREBASE_AUTH_URI: ${env:FIREBASE_AUTH_URI, ''} + FIREBASE_TOKEN_URI: ${env:FIREBASE_TOKEN_URI, ''} + FIREBASE_AUTH_PROVIDER_X509_CERT_URL: ${env:FIREBASE_AUTH_PROVIDER_X509_CERT_URL, ''} + FIREBASE_CLIENT_X509_CERT_URL: ${env:FIREBASE_CLIENT_X509_CERT_URL, ''} LOG_LEVEL: ${env:LOG_LEVEL} ALERT_MANAGER_REGION: ${env:ALERT_MANAGER_REGION} ALERT_MANAGER_TOPIC: ${env:ALERT_MANAGER_TOPIC} + ALERT_MANAGER_ACCOUNT_ID: ${env:ALERT_MANAGER_ACCOUNT_ID} functions: getLatestBlock: diff --git a/packages/wallet-service/src/utils/pushnotification.utils.ts b/packages/wallet-service/src/utils/pushnotification.utils.ts index ea885630..9aa5362c 100644 --- a/packages/wallet-service/src/utils/pushnotification.utils.ts +++ b/packages/wallet-service/src/utils/pushnotification.utils.ts @@ -202,7 +202,8 @@ export class PushNotificationUtils { }, }, }; - const multicastResult = await messaging().sendMulticast(message); + + const multicastResult = await messaging().sendEachForMulticast(message); if (multicastResult.failureCount === 0) { return { success: true }; diff --git a/packages/wallet-service/tests/utils/firebase-admin.mock.ts b/packages/wallet-service/tests/utils/firebase-admin.mock.ts index 1e93f4da..a925e472 100644 --- a/packages/wallet-service/tests/utils/firebase-admin.mock.ts +++ b/packages/wallet-service/tests/utils/firebase-admin.mock.ts @@ -8,7 +8,7 @@ export default jest.mock('firebase-admin', () => ({ }, initializeApp: initFirebaseAdminMock, messaging: messaging.mockImplementation(() => ({ - sendMulticast: sendMulticastMock.mockReturnValue({ + sendEachForMulticast: sendMulticastMock.mockReturnValue({ failureCount: 0, }), })), diff --git a/packages/wallet-service/tests/utils/pushnotification.utils.test.ts b/packages/wallet-service/tests/utils/pushnotification.utils.test.ts index c48ab255..cdcfb8be 100644 --- a/packages/wallet-service/tests/utils/pushnotification.utils.test.ts +++ b/packages/wallet-service/tests/utils/pushnotification.utils.test.ts @@ -298,7 +298,7 @@ describe('PushNotificationUtils', () => { beforeEach(() => { sendMulticastMock.mockReset(); messaging.mockImplementation(() => ({ - sendMulticast: sendMulticastMock.mockReturnValue({ + sendEachForMulticast: sendMulticastMock.mockReturnValue({ failureCount: 0, }), })); @@ -343,7 +343,7 @@ describe('PushNotificationUtils', () => { isFirebaseInitializedMock.mockReturnValue(true); messaging.mockImplementation(() => ({ - sendMulticast: sendMulticastMock.mockReturnValue({ + sendEachForMulticast: sendMulticastMock.mockReturnValue({ responses: [ { error: { @@ -373,7 +373,7 @@ describe('PushNotificationUtils', () => { isFirebaseInitializedMock.mockReturnValue(true); messaging.mockImplementation(() => ({ - sendMulticast: sendMulticastMock.mockReturnValue({ + sendEachForMulticast: sendMulticastMock.mockReturnValue({ responses: [ { error: { diff --git a/yarn.lock b/yarn.lock index 5a2ee6c5..5dd283ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1314,7 +1314,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.15, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.0": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.0": version: 7.23.0 resolution: "@babel/parser@npm:7.23.0" bin: @@ -1576,7 +1576,7 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": +"@eslint/eslintrc@npm:^2.1.2, @eslint/eslintrc@npm:^2.1.4": version: 2.1.4 resolution: "@eslint/eslintrc@npm:2.1.4" dependencies: @@ -1610,6 +1610,13 @@ __metadata: languageName: node linkType: hard +"@eslint/js@npm:8.50.0": + version: 8.50.0 + resolution: "@eslint/js@npm:8.50.0" + checksum: 10/1600a84ea1635cb46ae9f9cbc7c4cb054e54b8032707531b3b812d6096e46c54c449e8ecec7eb99725c3aa6da1ebbd4a60ca4fda925200395d5839ded09a0da8 + languageName: node + linkType: hard + "@eslint/js@npm:8.57.0": version: 8.57.0 resolution: "@eslint/js@npm:8.57.0" @@ -1624,92 +1631,98 @@ __metadata: languageName: node linkType: hard -"@fastify/busboy@npm:^1.2.1": - version: 1.2.1 - resolution: "@fastify/busboy@npm:1.2.1" - dependencies: - text-decoding: "npm:^1.0.0" - checksum: 10/1d1963c64992c5f4cd26aceb399dbddfcf2824e5259a7b92c77d2137e67d55e6bc416efe430bf59e897e3a57dad66fec8e51297f4858b855c3b38c7c17818b43 +"@fastify/busboy@npm:^3.0.0": + version: 3.0.0 + resolution: "@fastify/busboy@npm:3.0.0" + checksum: 10/238ce60bffecdefc55524d2b0826fe7a225635a2e0f3af832fe48801d96f9f521cb11bbd0ed3391b017c1f2580501845ee42f153fa6204b4c758214128a67ee7 languageName: node linkType: hard -"@firebase/app-types@npm:0.9.0": - version: 0.9.0 - resolution: "@firebase/app-types@npm:0.9.0" - checksum: 10/e6fff0ea48bcd346d10279346fe24e1b7dd9dfbb15923bdebf22b207d916e60f704c3aa534cdf5ac136b0fb6b01669cdeaed71f02761b48b434a7ca9862e9bf9 +"@firebase/app-check-interop-types@npm:0.3.2": + version: 0.3.2 + resolution: "@firebase/app-check-interop-types@npm:0.3.2" + checksum: 10/3effe656a4762c541838f4bde91b4498e51d48389046b930dc3dbb012e54b6ab0727f7c68a3e94198f633d57833346fc337a0847b6b03d2407030e1489d466fe languageName: node linkType: hard -"@firebase/auth-interop-types@npm:0.2.1": - version: 0.2.1 - resolution: "@firebase/auth-interop-types@npm:0.2.1" - checksum: 10/ffb11ad045db50dfae57433c19cc2d6d9619c648c3f3153c1834d76704a80ca78e0ac41356548a10cd104452ab24d393703d13e66d7822581b8b025dd4dab6ea +"@firebase/app-types@npm:0.9.2": + version: 0.9.2 + resolution: "@firebase/app-types@npm:0.9.2" + checksum: 10/566b3714a4d7e8180514258e4b1549bf5b28ae0383b4ff53d3532a45e114048afdd27c1fef8688d871dd9e5ad5307e749776e23f094122655ac6b0fb550eb11a languageName: node linkType: hard -"@firebase/component@npm:0.6.4": - version: 0.6.4 - resolution: "@firebase/component@npm:0.6.4" +"@firebase/auth-interop-types@npm:0.2.3": + version: 0.2.3 + resolution: "@firebase/auth-interop-types@npm:0.2.3" + checksum: 10/e55b8ded6bd1a5e6a2845c9c7ed520bb9a8a76e4ddf90249bf685986ac7b1fb079be2fa4edcb6a3aa81d1d56870a470eadcd5a8f20b797dccd803d72ed4c80aa + languageName: node + linkType: hard + +"@firebase/component@npm:0.6.10": + version: 0.6.10 + resolution: "@firebase/component@npm:0.6.10" dependencies: - "@firebase/util": "npm:1.9.3" + "@firebase/util": "npm:1.10.1" tslib: "npm:^2.1.0" - checksum: 10/aee5f9d85463190f91f715b5ec8ca3153c3ac3c99f567bdff0f77df2c948eaede527a0fdee72d423241fb135278a713220eeddfd99f0de225b2b9dd85e77a263 + checksum: 10/26e11280f634928ebb897390a5d409d45b7cd9f68982f33d06e979e38e9589663031978fe23ae2f4127c1b8bd33ae73f472e6791c830f4fc0612666baee4b75a languageName: node linkType: hard -"@firebase/database-compat@npm:^0.3.4": - version: 0.3.4 - resolution: "@firebase/database-compat@npm:0.3.4" +"@firebase/database-compat@npm:^2.0.0": + version: 2.0.0 + resolution: "@firebase/database-compat@npm:2.0.0" dependencies: - "@firebase/component": "npm:0.6.4" - "@firebase/database": "npm:0.14.4" - "@firebase/database-types": "npm:0.10.4" - "@firebase/logger": "npm:0.4.0" - "@firebase/util": "npm:1.9.3" + "@firebase/component": "npm:0.6.10" + "@firebase/database": "npm:1.0.9" + "@firebase/database-types": "npm:1.0.6" + "@firebase/logger": "npm:0.4.3" + "@firebase/util": "npm:1.10.1" tslib: "npm:^2.1.0" - checksum: 10/c90d8d970c5dbfd7884cfbdb769c636a455556b5da8b11f95262ddd5c489520d3eb3e305c66e2cc74e5b0da141da024b545f2402c74f011d824d252d2f21c11b + checksum: 10/d42f970709c15c6c04f0117c4c23acaf38b45c53af0b8da2da6da2b0b6783bd749916c3bb6ee92f8245d32111bfede930b949f0e3d38a8ad70c05c641af0ac0d languageName: node linkType: hard -"@firebase/database-types@npm:0.10.4, @firebase/database-types@npm:^0.10.4": - version: 0.10.4 - resolution: "@firebase/database-types@npm:0.10.4" +"@firebase/database-types@npm:1.0.6, @firebase/database-types@npm:^1.0.6": + version: 1.0.6 + resolution: "@firebase/database-types@npm:1.0.6" dependencies: - "@firebase/app-types": "npm:0.9.0" - "@firebase/util": "npm:1.9.3" - checksum: 10/0fc46f8e2883e15ddac65860626cbdd3a3d98e698c7c8aba7a9478a070b102001052d7dd2bcd71fae4ccaa7f6e11fd34e53e5c72d4da1029be35d6aae956e339 + "@firebase/app-types": "npm:0.9.2" + "@firebase/util": "npm:1.10.1" + checksum: 10/fbab4a4c2bc40a3932621bd0f613e1e24e221556d3a7cfff63a37db626de983993bdf19f677aabf8643f21678428f832e7588ed4c3690de06696ff5f00fa5c4a languageName: node linkType: hard -"@firebase/database@npm:0.14.4": - version: 0.14.4 - resolution: "@firebase/database@npm:0.14.4" +"@firebase/database@npm:1.0.9": + version: 1.0.9 + resolution: "@firebase/database@npm:1.0.9" dependencies: - "@firebase/auth-interop-types": "npm:0.2.1" - "@firebase/component": "npm:0.6.4" - "@firebase/logger": "npm:0.4.0" - "@firebase/util": "npm:1.9.3" + "@firebase/app-check-interop-types": "npm:0.3.2" + "@firebase/auth-interop-types": "npm:0.2.3" + "@firebase/component": "npm:0.6.10" + "@firebase/logger": "npm:0.4.3" + "@firebase/util": "npm:1.10.1" faye-websocket: "npm:0.11.4" tslib: "npm:^2.1.0" - checksum: 10/3c34c3ae48fa87d23aad59ff045a1d2bddedc5594af1379e042007990133f0096589aa7b2dbe396047b1c0e5e33c5aeeaba92500325c2c93b4ada3ec04361fb6 + checksum: 10/54280ac13a5f4b1fa412099a55569174760055c28f9743e74e74c561fdf71625dfa073188e44a52eaf35c34e1b5e2733598cf4cb0ceaf50d497edbee628b5a60 languageName: node linkType: hard -"@firebase/logger@npm:0.4.0": - version: 0.4.0 - resolution: "@firebase/logger@npm:0.4.0" +"@firebase/logger@npm:0.4.3": + version: 0.4.3 + resolution: "@firebase/logger@npm:0.4.3" dependencies: tslib: "npm:^2.1.0" - checksum: 10/1ac02b142ad15c047573bdf52611c19a3548f4aa7c67264c18e0a857756137d2a45892505d3c916edf83f77dc32a0f1e34525fb6ab3dbd020f24643c43c18860 + checksum: 10/0f384117da23cca810fbc392a9980f018a6a767a519bee947c40e0586dabaa6ebe133dfe34e8bcbcc61ec8454f8a13d6756f776ce0cfffc010cc8f04e84273a5 languageName: node linkType: hard -"@firebase/util@npm:1.9.3": - version: 1.9.3 - resolution: "@firebase/util@npm:1.9.3" +"@firebase/util@npm:1.10.1": + version: 1.10.1 + resolution: "@firebase/util@npm:1.10.1" dependencies: tslib: "npm:^2.1.0" - checksum: 10/77f2cc342e6dd826dfd8c7fd705bb1f8b569493ea172a0c7f80603785b27d37cdf0b29035d3526de15bdf2d634007a4270e3e2c3254fa7f93332114b3e866c99 + checksum: 10/c440edf31ab2d5fc4aec019699acd148f18a91b7f747b2b3e70ada54a15b44a2e5af8d01d468bb199cbf9655725b086507c99426b6827efdda03f76a9303270d languageName: node linkType: hard @@ -1720,89 +1733,87 @@ __metadata: languageName: node linkType: hard -"@google-cloud/firestore@npm:^6.6.0": - version: 6.8.0 - resolution: "@google-cloud/firestore@npm:6.8.0" +"@google-cloud/firestore@npm:^7.10.0": + version: 7.10.0 + resolution: "@google-cloud/firestore@npm:7.10.0" dependencies: + "@opentelemetry/api": "npm:^1.3.0" fast-deep-equal: "npm:^3.1.1" functional-red-black-tree: "npm:^1.0.1" - google-gax: "npm:^3.5.7" - protobufjs: "npm:^7.2.5" - checksum: 10/7b01c1aa49a8428671a6c26ebb0d18071c53acbb6f9624748c765e078ad938fdfc2e1624fe6c54f0b78a287025b09a11a5cfe6de1f173f34c8ab7fc917551484 + google-gax: "npm:^4.3.3" + protobufjs: "npm:^7.2.6" + checksum: 10/32dcb08a0ae9f9c7fe2ce561319bb73030257459c1072f4918522093ae61e4113bcae1b3abce7e35a4835b2d16510be3fccab40007a81e414bcfcf4347f5206d languageName: node linkType: hard -"@google-cloud/paginator@npm:^3.0.7": - version: 3.0.7 - resolution: "@google-cloud/paginator@npm:3.0.7" +"@google-cloud/paginator@npm:^5.0.0": + version: 5.0.2 + resolution: "@google-cloud/paginator@npm:5.0.2" dependencies: arrify: "npm:^2.0.0" extend: "npm:^3.0.2" - checksum: 10/b4d61df447d1bb35515cb4335f35a42b7ded9157ccc814ebc5753366ab091c1baced8b1067d876a3e2eb336ca628b6c4f25effe62cd84c7130f24388d711e485 + checksum: 10/b64ba2029b77fdcf3c827aea0b6d128122fd1d2f4aa8c1ba70747cba0659d4216a283769fb3bbeb8f726176f5282624637f02c30f118a010e05838411da0cb76 languageName: node linkType: hard -"@google-cloud/projectify@npm:^3.0.0": - version: 3.0.0 - resolution: "@google-cloud/projectify@npm:3.0.0" - checksum: 10/84da9bec8d39b2293a3fc5764417b62338178438e4b3a27e158a3073e199c802fa38b80c25b46e26b8b04e9463cf2857fefcb36d2745ea90d4323602d0ca38d8 +"@google-cloud/projectify@npm:^4.0.0": + version: 4.0.0 + resolution: "@google-cloud/projectify@npm:4.0.0" + checksum: 10/fdccdda0b50855c35541d71c46a6603f3302ff1a00108d946272cb2167435da00e2a2da5963fe489f4f5a4a9eb6320abeb97d3269974a972ae89f5df8451922d languageName: node linkType: hard -"@google-cloud/promisify@npm:^3.0.0": - version: 3.0.1 - resolution: "@google-cloud/promisify@npm:3.0.1" - checksum: 10/36e732cf88b66292402f762ccb1bb13841c2c2680ddc21d80afc940c30b5f81469e1aa6eeb52ecdfa4ddcc1255d9020c9c2306b657ee0338c310086e4f79b832 +"@google-cloud/promisify@npm:^4.0.0": + version: 4.0.0 + resolution: "@google-cloud/promisify@npm:4.0.0" + checksum: 10/c5de81321b3a5c567edcbe0b941fb32644611147f3ba22f20575918c225a979988a99bc2ebda05ac914fa8714b0a54c69be72c3f46c7a64c3b19db7d7fba8d04 languageName: node linkType: hard -"@google-cloud/storage@npm:^6.9.5": - version: 6.12.0 - resolution: "@google-cloud/storage@npm:6.12.0" +"@google-cloud/storage@npm:^7.14.0": + version: 7.14.0 + resolution: "@google-cloud/storage@npm:7.14.0" dependencies: - "@google-cloud/paginator": "npm:^3.0.7" - "@google-cloud/projectify": "npm:^3.0.0" - "@google-cloud/promisify": "npm:^3.0.0" + "@google-cloud/paginator": "npm:^5.0.0" + "@google-cloud/projectify": "npm:^4.0.0" + "@google-cloud/promisify": "npm:^4.0.0" abort-controller: "npm:^3.0.0" async-retry: "npm:^1.3.3" - compressible: "npm:^2.0.12" - duplexify: "npm:^4.0.0" - ent: "npm:^2.2.0" - extend: "npm:^3.0.2" - fast-xml-parser: "npm:^4.2.2" - gaxios: "npm:^5.0.0" - google-auth-library: "npm:^8.0.1" + duplexify: "npm:^4.1.3" + fast-xml-parser: "npm:^4.4.1" + gaxios: "npm:^6.0.2" + google-auth-library: "npm:^9.6.3" + html-entities: "npm:^2.5.2" mime: "npm:^3.0.0" - mime-types: "npm:^2.0.8" p-limit: "npm:^3.0.1" - retry-request: "npm:^5.0.0" - teeny-request: "npm:^8.0.0" + retry-request: "npm:^7.0.0" + teeny-request: "npm:^9.0.0" uuid: "npm:^8.0.0" - checksum: 10/b19bebb1c1c51a6ad1d5d056bcc22d2f671ad28ce5d6faf35bc08b35eac800987ae39a1da70ccd20b8e3271dbbcf79df474ae3f9265f27e0f5ef6bc993b9f312 + checksum: 10/0726fde2697da696637fab91ebd756354a58c1331f6a0b9ecc5011de4aae72cd9e1fe3e9564aee15c6a2118e45ed0ae8c3ac9685c6581db6107080f906a949e9 languageName: node linkType: hard -"@grpc/grpc-js@npm:~1.8.0": - version: 1.8.21 - resolution: "@grpc/grpc-js@npm:1.8.21" +"@grpc/grpc-js@npm:^1.10.9": + version: 1.12.2 + resolution: "@grpc/grpc-js@npm:1.12.2" dependencies: - "@grpc/proto-loader": "npm:^0.7.0" - "@types/node": "npm:>=12.12.47" - checksum: 10/8c2674b435efd7d8cf54d63c3ef810efc5f7f2f479b77d7cb4baa0ba1ad21734ac7e0f8c068bfb004445d8c89b0b3773b7995dc0d43e163a3d45b7e1d0f55537 + "@grpc/proto-loader": "npm:^0.7.13" + "@js-sdsl/ordered-map": "npm:^4.4.2" + checksum: 10/0d0556da8515704b5e722b86097e04693d8c71ba286a076270a96e1ac3a4950e87559c718cc2875d3fcaa6cb8e07d0cc6b1db2673b8940829dfe8b75197844dd languageName: node linkType: hard -"@grpc/proto-loader@npm:^0.7.0": - version: 0.7.10 - resolution: "@grpc/proto-loader@npm:0.7.10" +"@grpc/proto-loader@npm:^0.7.13": + version: 0.7.13 + resolution: "@grpc/proto-loader@npm:0.7.13" dependencies: lodash.camelcase: "npm:^4.3.0" long: "npm:^5.0.0" - protobufjs: "npm:^7.2.4" + protobufjs: "npm:^7.2.5" yargs: "npm:^17.7.2" bin: proto-loader-gen-types: build/bin/proto-loader-gen-types.js - checksum: 10/1fdc0b10480614cecc4bf52578756cbf59ec75f1bea37452947125eff81cd3ceabba04606247ed8361f97bcd00d147ca4118abc22b046cc0541cb749671b97d9 + checksum: 10/7e2d842c2061cbaf6450c71da0077263be3bab165454d5c8a3e1ae4d3c6d2915f02fd27da63ff01f05e127b1221acd40705273f5d29303901e60514e852992f4 languageName: node linkType: hard @@ -2142,7 +2153,7 @@ __metadata: languageName: node linkType: hard -"@hathor/healthcheck-lib@npm:^0.1.0": +"@hathor/healthcheck-lib@npm:0.1.0": version: 0.1.0 resolution: "@hathor/healthcheck-lib@npm:0.1.0" checksum: 10/f2ffabff2948f009acb9b98787c4fbf6b2a4d00c178f3f843999c387084d4cd052ee51ba8b16c0a7d98a5b3d11d5a5d51eea9d36a723bc97d2c955a329a25574 @@ -2165,7 +2176,7 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": +"@humanwhocodes/config-array@npm:^0.11.11, @humanwhocodes/config-array@npm:^0.11.14": version: 0.11.14 resolution: "@humanwhocodes/config-array@npm:0.11.14" dependencies: @@ -2263,7 +2274,7 @@ __metadata: languageName: node linkType: hard -"@jest/core@npm:^29.7.0": +"@jest/core@npm:^29.6.4, @jest/core@npm:^29.7.0": version: 29.7.0 resolution: "@jest/core@npm:29.7.0" dependencies: @@ -2541,12 +2552,10 @@ __metadata: languageName: node linkType: hard -"@jsdoc/salty@npm:^0.2.1": - version: 0.2.5 - resolution: "@jsdoc/salty@npm:0.2.5" - dependencies: - lodash: "npm:^4.17.21" - checksum: 10/b3f868457af175852403bc668422d8e5e83794e750717ddf91a9470f591c48a1079a48796a0deaedad8eda7b448b6f3a02700c05aff4aba299d2d578ee58fdf5 +"@js-sdsl/ordered-map@npm:^4.4.2": + version: 4.4.2 + resolution: "@js-sdsl/ordered-map@npm:4.4.2" + checksum: 10/ac64e3f0615ecc015461c9f527f124d2edaa9e68de153c1e270c627e01e83d046522d7e872692fd57a8c514578b539afceff75831c0d8b2a9a7a347fbed35af4 languageName: node linkType: hard @@ -2566,33 +2575,14 @@ __metadata: languageName: node linkType: hard -"@mapbox/node-pre-gyp@npm:^1.0.0": - version: 1.0.11 - resolution: "@mapbox/node-pre-gyp@npm:1.0.11" - dependencies: - detect-libc: "npm:^2.0.0" - https-proxy-agent: "npm:^5.0.0" - make-dir: "npm:^3.1.0" - node-fetch: "npm:^2.6.7" - nopt: "npm:^5.0.0" - npmlog: "npm:^5.0.1" - rimraf: "npm:^3.0.2" - semver: "npm:^7.3.5" - tar: "npm:^6.1.11" - bin: - node-pre-gyp: bin/node-pre-gyp - checksum: 10/59529a2444e44fddb63057152452b00705aa58059079191126c79ac1388ae4565625afa84ed4dd1bf017d1111ab6e47907f7c5192e06d83c9496f2f3e708680a - languageName: node - linkType: hard - -"@middy/core@npm:^2.5.7": +"@middy/core@npm:2.5.7": version: 2.5.7 resolution: "@middy/core@npm:2.5.7" checksum: 10/1ab47fcf1e8e28fc31d666d10ee4a08f853bad743301622bf6046199340bbcd765cbdc929a1d6c49c529028aab770ba4415cc9c061b463aa641175674b901c71 languageName: node linkType: hard -"@middy/http-cors@npm:^2.5.7": +"@middy/http-cors@npm:2.5.7": version: 2.5.7 resolution: "@middy/http-cors@npm:2.5.7" dependencies: @@ -2678,6 +2668,13 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/api@npm:^1.3.0": + version: 1.9.0 + resolution: "@opentelemetry/api@npm:1.9.0" + checksum: 10/a607f0eef971893c4f2ee2a4c2069aade6ec3e84e2a1f5c2aac19f65c5d9eeea41aa72db917c1029faafdd71789a1a040bdc18f40d63690e22ccae5d7070f194 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -2870,16 +2867,16 @@ __metadata: languageName: node linkType: hard -"@sideway/address@npm:^4.1.3": - version: 4.1.4 - resolution: "@sideway/address@npm:4.1.4" +"@sideway/address@npm:^4.1.0": + version: 4.1.5 + resolution: "@sideway/address@npm:4.1.5" dependencies: "@hapi/hoek": "npm:^9.0.0" - checksum: 10/48c422bd2d1d1c7bff7e834f395b870a66862125e9f2302f50c781a33e9f4b2b004b4db0003b232899e71c5f649d39f34aa6702a55947145708d7689ae323cc5 + checksum: 10/c4c73ac0339504f34e016d3a687118e7ddf197c1c968579572123b67b230be84caa705f0f634efdfdde7f2e07a6e0224b3c70665dc420d8bc95bf400cfc4c998 languageName: node linkType: hard -"@sideway/formula@npm:^3.0.1": +"@sideway/formula@npm:^3.0.0": version: 3.0.1 resolution: "@sideway/formula@npm:3.0.1" checksum: 10/8d3ee7f80df4e5204b2cbe92a2a711ca89684965a5c9eb3b316b7051212d3522e332a65a0bb2a07cc708fcd1d0b27fcb30f43ff0bcd5089d7006c7160a89eefe @@ -3985,17 +3982,17 @@ __metadata: languageName: node linkType: hard -"@types/aws-lambda@npm:^8.10.136": +"@types/aws-lambda@npm:8.10.136": version: 8.10.136 resolution: "@types/aws-lambda@npm:8.10.136" checksum: 10/df7afa66d3ee9fb3697cd81156c7f71104437d81e0bce8a16e8c6c56f176ea93c1f3cb7ed0f219936f410849b413a739c485ca8572c22fb24b46b8ecd571949a languageName: node linkType: hard -"@types/aws-lambda@npm:^8.10.95": - version: 8.10.123 - resolution: "@types/aws-lambda@npm:8.10.123" - checksum: 10/de782a12ac1fcd1c758f36b4d894766c31eda4b2b74aee01fc850cb2e3fb301dd629abb7e34dbe5d345faaf18fb4924bb03153bb2787446c98c665a9932d76c5 +"@types/aws-lambda@npm:8.10.95": + version: 8.10.95 + resolution: "@types/aws-lambda@npm:8.10.95" + checksum: 10/f4502ed6318f050e1405744d0613946d4144105529b6d67e717bd1f6a7ae0e31c7f0309ae6984ac6118e968a9acf5f9ae27c4f147b81ae54516dacffa355b2d2 languageName: node linkType: hard @@ -4062,6 +4059,13 @@ __metadata: languageName: node linkType: hard +"@types/caseless@npm:*": + version: 0.12.5 + resolution: "@types/caseless@npm:0.12.5" + checksum: 10/f6a3628add76d27005495914c9c3873a93536957edaa5b69c63b46fe10b4649a6fecf16b676c1695f46aab851da47ec6047dcf3570fa8d9b6883492ff6d074e0 + languageName: node + linkType: hard + "@types/connect@npm:*": version: 3.4.36 resolution: "@types/connect@npm:3.4.36" @@ -4126,25 +4130,15 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:^4.17.14": - version: 4.17.18 - resolution: "@types/express@npm:4.17.18" +"@types/express@npm:^4.17.17": + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" dependencies: "@types/body-parser": "npm:*" "@types/express-serve-static-core": "npm:^4.17.33" "@types/qs": "npm:*" "@types/serve-static": "npm:*" - checksum: 10/b344988a35d3cae7b29e984f010ac9124de5e61fe2104c0fc541db6ba8fc4433c69d505537429d157400572c258b47afca4bd668b58de101ae879c868b81bcb1 - languageName: node - linkType: hard - -"@types/glob@npm:*": - version: 8.1.0 - resolution: "@types/glob@npm:8.1.0" - dependencies: - "@types/minimatch": "npm:^5.1.2" - "@types/node": "npm:*" - checksum: 10/9101f3a9061e40137190f70626aa0e202369b5ec4012c3fabe6f5d229cce04772db9a94fa5a0eb39655e2e4ad105c38afbb4af56a56c0996a8c7d4fc72350e3d + checksum: 10/7a6d26cf6f43d3151caf4fec66ea11c9d23166e4f3102edfe45a94170654a54ea08cf3103d26b3928d7ebcc24162c90488e33986b7e3a5f8941225edd5eb18c7 languageName: node linkType: hard @@ -4196,33 +4190,23 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:^27.0.24": - version: 27.5.2 - resolution: "@types/jest@npm:27.5.2" - dependencies: - jest-matcher-utils: "npm:^27.0.0" - pretty-format: "npm:^27.0.0" - checksum: 10/8608696fbdea81bc9a600d1c5aeb290063357eaa55c0174e7db15087c4f483113b35f8b4c4ae364d2632cfed15a4dd674786254826b946c896de5612c8cb1a26 - languageName: node - linkType: hard - -"@types/jest@npm:^29.5.12": - version: 29.5.12 - resolution: "@types/jest@npm:29.5.12" +"@types/jest@npm:29.5.13, @types/jest@npm:^29.5.13": + version: 29.5.13 + resolution: "@types/jest@npm:29.5.13" dependencies: expect: "npm:^29.0.0" pretty-format: "npm:^29.0.0" - checksum: 10/312e8dcf92cdd5a5847d6426f0940829bca6fe6b5a917248f3d7f7ef5d85c9ce78ef05e47d2bbabc40d41a930e0e36db2d443d2610a9e3db9062da2d5c904211 + checksum: 10/7d6e3e4ef4b1cab0f61270d55764709512fdfbcb1bd47c0ef44117d48490529c1f264dacf3440b9188363e99e290b80b79c529eadc3af2184116a90f6856b192 languageName: node linkType: hard -"@types/jest@npm:^29.5.4": - version: 29.5.5 - resolution: "@types/jest@npm:29.5.5" +"@types/jest@npm:29.5.4": + version: 29.5.4 + resolution: "@types/jest@npm:29.5.4" dependencies: expect: "npm:^29.0.0" pretty-format: "npm:^29.0.0" - checksum: 10/85bf86fd31ed9b76c26abc6bf771d09a9a8ff9362c81be353b8cf8ba102e09741b7f6951dca09aaa56d5fb410291e1eb5650b508da2fb3d36a0f035a91552a0d + checksum: 10/c56081b958c06f4f3a30f7beabf4e94e70db96a4b41b8a73549fea7f9bf0a8c124ab3998ea4e6d040d1b8c95cfbe0b8d4a607da4bdea03c9e116f92c147df193 languageName: node linkType: hard @@ -4247,12 +4231,12 @@ __metadata: languageName: node linkType: hard -"@types/jsonwebtoken@npm:^9.0.0": - version: 9.0.3 - resolution: "@types/jsonwebtoken@npm:9.0.3" +"@types/jsonwebtoken@npm:^9.0.2": + version: 9.0.7 + resolution: "@types/jsonwebtoken@npm:9.0.7" dependencies: "@types/node": "npm:*" - checksum: 10/62599dea2c16e3043135620780e88785e81f9cebe5e4fd155ab30030eaefba4b04b0ea5e49ab08feab6838021b2e9a289f7e733966ce288e2d70813631c228bb + checksum: 10/4c0cffc488ba200765b50004de5e046c55360121a91ad9520d904e303cdd217b3f77b51b6ba8b9cbdd03d73876d546cbd0d9992d6e205d97decba918aee5b395 languageName: node linkType: hard @@ -4265,27 +4249,13 @@ __metadata: languageName: node linkType: hard -"@types/linkify-it@npm:*": - version: 3.0.3 - resolution: "@types/linkify-it@npm:3.0.3" - checksum: 10/a734becc4e7476833b0e6951ec133c006a34809639c722d3e28b7cf88f5f6ccbb433f195788be5e56209b1e9e6e0778879291dd2db401acee3bb585c44dcc329 - languageName: node - linkType: hard - -"@types/lodash@npm:^4.14.123": +"@types/lodash@npm:4.14.199, @types/lodash@npm:^4.14.123": version: 4.14.199 resolution: "@types/lodash@npm:4.14.199" checksum: 10/340aabe9b023553d64e47f2af7f2010814c1178ce3a2b256e8dd54c444578d5e6e937d70c7117ee1fac5c0fc429b592ab9f6d69a966f0a1222ebcbbe6d516c4a languageName: node linkType: hard -"@types/lodash@npm:^4.14.199": - version: 4.14.202 - resolution: "@types/lodash@npm:4.14.202" - checksum: 10/1bb9760a5b1dda120132c4b987330d67979c95dbc22612678682cd61b00302e190f4207228f3728580059cdab5582362262e3819aea59960c1017bd2b9fb26f6 - languageName: node - linkType: hard - "@types/long@npm:^4.0.0": version: 4.0.2 resolution: "@types/long@npm:4.0.2" @@ -4293,23 +4263,6 @@ __metadata: languageName: node linkType: hard -"@types/markdown-it@npm:^12.2.3": - version: 12.2.3 - resolution: "@types/markdown-it@npm:12.2.3" - dependencies: - "@types/linkify-it": "npm:*" - "@types/mdurl": "npm:*" - checksum: 10/8838017dd0a0a9bd596114b959d287135393a18e3ddc6a46e9770bdd35c824b88d8ba4b60540ee75ae6c79dc0ccc72ff5d7745083c27900c98925c9b5ae058e6 - languageName: node - linkType: hard - -"@types/mdurl@npm:*": - version: 1.0.3 - resolution: "@types/mdurl@npm:1.0.3" - checksum: 10/5bbed4f0eb9f60040fa26be77aa2158ca468b6423876cec0d2043e7f8298e83b8e5b95fb66056327b02d747c4d376aed16c11ff3fdc4cb3dca327a6931a71f18 - languageName: node - linkType: hard - "@types/mime@npm:*": version: 3.0.2 resolution: "@types/mime@npm:3.0.2" @@ -4324,13 +4277,6 @@ __metadata: languageName: node linkType: hard -"@types/minimatch@npm:^5.1.2": - version: 5.1.2 - resolution: "@types/minimatch@npm:5.1.2" - checksum: 10/94db5060d20df2b80d77b74dd384df3115f01889b5b6c40fa2dfa27cfc03a68fb0ff7c1f2a0366070263eb2e9d6bfd8c87111d4bc3ae93c3f291297c1bf56c85 - languageName: node - linkType: hard - "@types/ms@npm:*": version: 0.7.32 resolution: "@types/ms@npm:0.7.32" @@ -4338,7 +4284,16 @@ __metadata: languageName: node linkType: hard -"@types/mysql@npm:^2.15.21, @types/mysql@npm:^2.15.6": +"@types/mysql@npm:2.15.21": + version: 2.15.21 + resolution: "@types/mysql@npm:2.15.21" + dependencies: + "@types/node": "npm:*" + checksum: 10/79fe91e1242d78b8aae15d883347f5a4f330452855c112fe465aef570e696def33dd8fea163e00416629eddc20b3a075e6146826881f813a0e1b52e47f39159a + languageName: node + linkType: hard + +"@types/mysql@npm:^2.15.6": version: 2.15.22 resolution: "@types/mysql@npm:2.15.22" dependencies: @@ -4347,28 +4302,35 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": +"@types/node@npm:*, @types/node@npm:>=13.7.0": version: 20.8.2 resolution: "@types/node@npm:20.8.2" checksum: 10/61bd39870625d8afcbb4f21d6a0c3a9681f6d508dc6b06f2497e9ad3ec942092a120bcfdbc1757a8e4017308449bc2a9b9865b2b9840b158878a4e8cc0804a3c languageName: node linkType: hard -"@types/node@npm:^17.0.45": +"@types/node@npm:10.12.18": + version: 10.12.18 + resolution: "@types/node@npm:10.12.18" + checksum: 10/cfa39e797eed0f9eb2070315c66a5be3839ba91c57ace4eff63203f2e8c871127dd45fa5a3bd2ee6d7760608ea13f30b4fbd9a7b0b6a71b478162b2eb23d07b6 + languageName: node + linkType: hard + +"@types/node@npm:17.0.45": version: 17.0.45 resolution: "@types/node@npm:17.0.45" checksum: 10/b45fff7270b5e81be19ef91a66b764a8b21473a97a8d211218a52e3426b79ad48f371819ab9153370756b33ba284e5c875463de4d2cf48a472e9098d7f09e8a2 languageName: node linkType: hard -"@types/node@npm:^18.0.4": - version: 18.18.3 - resolution: "@types/node@npm:18.18.3" - checksum: 10/b76d157967ee0dd72686983b4e49f1745646ee6c10f96bfabcf42a174746b976ca9bc921dd81f69e7f3b839d6ded6cc153b14efeca69af23511b2df796e9bac1 +"@types/node@npm:18.0.4": + version: 18.0.4 + resolution: "@types/node@npm:18.0.4" + checksum: 10/5020caeba62c506d9e786390106f085266d42b1f4d63e718b7795a1a933206f6e763eac8f51e9ee9d800b8f7a04466657acfb690af7d5660667c37fd43598bc7 languageName: node linkType: hard -"@types/node@npm:^20.11.30": +"@types/node@npm:20.11.30": version: 20.11.30 resolution: "@types/node@npm:20.11.30" dependencies: @@ -4377,6 +4339,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.8.7": + version: 22.9.0 + resolution: "@types/node@npm:22.9.0" + dependencies: + undici-types: "npm:~6.19.8" + checksum: 10/a7df3426891868b0f5fb03e46aeddd8446178233521c624a44531c92a040cf08a82d8235f7e1e02af731fd16984665d4d71f3418caf9c2788313b10f040d615d + languageName: node + linkType: hard + "@types/parse-json@npm:^4.0.0": version: 4.0.0 resolution: "@types/parse-json@npm:4.0.0" @@ -4398,12 +4369,24 @@ __metadata: languageName: node linkType: hard -"@types/redis@npm:^2.8.28": - version: 2.8.32 - resolution: "@types/redis@npm:2.8.32" +"@types/redis@npm:2.8.28": + version: 2.8.28 + resolution: "@types/redis@npm:2.8.28" + dependencies: + "@types/node": "npm:*" + checksum: 10/8e13b7741f1eccce51f38a84fc43471bd18d2cbeebf3567ab1f35d1524b0130ac5c68e3ecc304022d8a59c07e3df49720d726d531831fe707f8faafa2f637ad6 + languageName: node + linkType: hard + +"@types/request@npm:^2.48.8": + version: 2.48.12 + resolution: "@types/request@npm:2.48.12" dependencies: + "@types/caseless": "npm:*" "@types/node": "npm:*" - checksum: 10/3e384297625ff410a51ae1e74531022f37e812ef5a9d17b593b4c964ec974c9af1d572f26932ae5ace032808134caece73d056edb57bff1d2538698e3f4d028e + "@types/tough-cookie": "npm:*" + form-data: "npm:^2.5.0" + checksum: 10/a7b3f9f14cacc18fe235bb8e57eff1232a04bd3fa3dad29371f24a5d96db2cd295a0c8b6b34ed7efa3efbbcff845febb02c9635cd68c54811c947ea66ae22090 languageName: node linkType: hard @@ -4423,16 +4406,6 @@ __metadata: languageName: node linkType: hard -"@types/rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "@types/rimraf@npm:3.0.2" - dependencies: - "@types/glob": "npm:*" - "@types/node": "npm:*" - checksum: 10/b47fa302f46434cba704d20465861ad250df79467d3d289f9d6490d3aeeb41e8cb32dd80bd1a8fd833d1e185ac719fbf9be12e05ad9ce9be094d8ee8f1405347 - languageName: node - linkType: hard - "@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": version: 7.5.3 resolution: "@types/semver@npm:7.5.3" @@ -4468,6 +4441,13 @@ __metadata: languageName: node linkType: hard +"@types/tough-cookie@npm:*": + version: 4.0.5 + resolution: "@types/tough-cookie@npm:4.0.5" + checksum: 10/01fd82efc8202670865928629697b62fe9bf0c0dcbc5b1c115831caeb073a2c0abb871ff393d7df1ae94ea41e256cb87d2a5a91fd03cdb1b0b4384e08d4ee482 + languageName: node + linkType: hard + "@types/triple-beam@npm:^1.3.2": version: 1.3.3 resolution: "@types/triple-beam@npm:1.3.3" @@ -4482,12 +4462,12 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.5.5": - version: 8.5.6 - resolution: "@types/ws@npm:8.5.6" +"@types/ws@npm:8.5.5": + version: 8.5.5 + resolution: "@types/ws@npm:8.5.5" dependencies: "@types/node": "npm:*" - checksum: 10/1c3ce7fe65569dc85314981622bdbccd8bab671cff74367f9bfba8390ddd0f241f29cdcf67b14163a2c832a0a08bfc0e8f60912b9c143648e25a5a05e016b892 + checksum: 10/b2d7da5bd469c2ff1ddcfba1da33a556dc02c539e727001e7dc7b4182935154143e96a101cc091686acefb4e115c8ee38111c6634934748b8dd2db0c851c50ab languageName: node linkType: hard @@ -4507,15 +4487,40 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^6.7.3, @typescript-eslint/eslint-plugin@npm:^6.7.4": - version: 6.21.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" +"@typescript-eslint/eslint-plugin@npm:6.7.3": + version: 6.7.3 + resolution: "@typescript-eslint/eslint-plugin@npm:6.7.3" + dependencies: + "@eslint-community/regexpp": "npm:^4.5.1" + "@typescript-eslint/scope-manager": "npm:6.7.3" + "@typescript-eslint/type-utils": "npm:6.7.3" + "@typescript-eslint/utils": "npm:6.7.3" + "@typescript-eslint/visitor-keys": "npm:6.7.3" + debug: "npm:^4.3.4" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.4" + natural-compare: "npm:^1.4.0" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/173e950f505aa848b9e6b828ed4e7eb4c4c8b93224d9a9e295c52e9d4680ff4fa99fcb82ae28a9e850e11f5fb6c80bf56ad54b078c843a96142d919b340d113e + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:6.7.4": + version: 6.7.4 + resolution: "@typescript-eslint/eslint-plugin@npm:6.7.4" dependencies: "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:6.21.0" - "@typescript-eslint/type-utils": "npm:6.21.0" - "@typescript-eslint/utils": "npm:6.21.0" - "@typescript-eslint/visitor-keys": "npm:6.21.0" + "@typescript-eslint/scope-manager": "npm:6.7.4" + "@typescript-eslint/type-utils": "npm:6.7.4" + "@typescript-eslint/utils": "npm:6.7.4" + "@typescript-eslint/visitor-keys": "npm:6.7.4" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.4" @@ -4528,7 +4533,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/a57de0f630789330204cc1531f86cfc68b391cafb1ba67c8992133f1baa2a09d629df66e71260b040de4c9a3ff1252952037093c4128b0d56c4dbb37720b4c1d + checksum: 10/d888cef041d0d4f804c6f37831afd5cfc93579894313de34bda1197a688f007580c6f48aa791243af59fec476d9f605e9f21e87452ade7b50df9b5d53a0160a3 languageName: node linkType: hard @@ -4557,18 +4562,17 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/experimental-utils@npm:3.10.1": - version: 3.10.1 - resolution: "@typescript-eslint/experimental-utils@npm:3.10.1" +"@typescript-eslint/experimental-utils@npm:3.3.0": + version: 3.3.0 + resolution: "@typescript-eslint/experimental-utils@npm:3.3.0" dependencies: "@types/json-schema": "npm:^7.0.3" - "@typescript-eslint/types": "npm:3.10.1" - "@typescript-eslint/typescript-estree": "npm:3.10.1" + "@typescript-eslint/typescript-estree": "npm:3.3.0" eslint-scope: "npm:^5.0.0" eslint-utils: "npm:^2.0.0" peerDependencies: eslint: "*" - checksum: 10/3055eb8588d2ced3972341f5746ca5d1c27b56e5f1cf93c2e32dfb5ecfaaa7616e68050c7d16be2293e7b688be398c00cbe0b78ee0e40bb17aec47f8614d121a + checksum: 10/07525de2122cc5572f4f528966b6bca81cac85bd002de0eb9f9504c3511932068bcf51d6a12c95d0aff31792a765aa64070eac5156607f95bab9067b86acaa7b languageName: node linkType: hard @@ -4586,39 +4590,38 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^3.3.0": - version: 3.10.1 - resolution: "@typescript-eslint/parser@npm:3.10.1" +"@typescript-eslint/parser@npm:3.3.0": + version: 3.3.0 + resolution: "@typescript-eslint/parser@npm:3.3.0" dependencies: "@types/eslint-visitor-keys": "npm:^1.0.0" - "@typescript-eslint/experimental-utils": "npm:3.10.1" - "@typescript-eslint/types": "npm:3.10.1" - "@typescript-eslint/typescript-estree": "npm:3.10.1" + "@typescript-eslint/experimental-utils": "npm:3.3.0" + "@typescript-eslint/typescript-estree": "npm:3.3.0" eslint-visitor-keys: "npm:^1.1.0" peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/3488d0a7c06c38893e6fc13d8eaaa408598302b1506f7cca9a4c9ebf1fdb1f30a3dbe8c9f0a8b81a7d5423a45681ddb4eee8a9686b3f811d371fddcc7da136f9 + checksum: 10/b430e1463f7737331f6a8acf8fb1a922c8b8902ecfe294438c46abbf95199ae2e8903227ee6963f9a2688348af576d1cb0cd3ccbc9af84ec0a8febb1d77ea801 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.7.3": - version: 6.21.0 - resolution: "@typescript-eslint/parser@npm:6.21.0" +"@typescript-eslint/parser@npm:6.7.3": + version: 6.7.3 + resolution: "@typescript-eslint/parser@npm:6.7.3" dependencies: - "@typescript-eslint/scope-manager": "npm:6.21.0" - "@typescript-eslint/types": "npm:6.21.0" - "@typescript-eslint/typescript-estree": "npm:6.21.0" - "@typescript-eslint/visitor-keys": "npm:6.21.0" + "@typescript-eslint/scope-manager": "npm:6.7.3" + "@typescript-eslint/types": "npm:6.7.3" + "@typescript-eslint/typescript-estree": "npm:6.7.3" + "@typescript-eslint/visitor-keys": "npm:6.7.3" debug: "npm:^4.3.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/4d51cdbc170e72275efc5ef5fce48a81ec431e4edde8374f4d0213d8d370a06823e1a61ae31d502a5f1b0d1f48fc4d29a1b1b5c2dcf809d66d3872ccf6e46ac7 + checksum: 10/29c5d9f6bed712a5d3dbc861efd584987cded3cd19e165ff7a5be7c84cb960e276bed1cc992217ee4fcc04d6ab744cc27463f4abc30cc0473f573b47632578c9 languageName: node linkType: hard @@ -4650,13 +4653,23 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/scope-manager@npm:6.21.0" +"@typescript-eslint/scope-manager@npm:6.7.3": + version: 6.7.3 + resolution: "@typescript-eslint/scope-manager@npm:6.7.3" + dependencies: + "@typescript-eslint/types": "npm:6.7.3" + "@typescript-eslint/visitor-keys": "npm:6.7.3" + checksum: 10/60f40be68d49d990fbd00065a0d431e422a21810e33f18b63e2064eabc7bd90410e322514eacb759e40e348cb553b7aa8aa735ca560bed4b1f2c98f3b3631df8 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:6.7.4": + version: 6.7.4 + resolution: "@typescript-eslint/scope-manager@npm:6.7.4" dependencies: - "@typescript-eslint/types": "npm:6.21.0" - "@typescript-eslint/visitor-keys": "npm:6.21.0" - checksum: 10/fe91ac52ca8e09356a71dc1a2f2c326480f3cccfec6b2b6d9154c1a90651ab8ea270b07c67df5678956c3bbf0bbe7113ab68f68f21b20912ea528b1214197395 + "@typescript-eslint/types": "npm:6.7.4" + "@typescript-eslint/visitor-keys": "npm:6.7.4" + checksum: 10/eabf3f0d18389c9c799c9f9648c9fcd1b098468979459d86267f51403ab2bb005d16b6d1278c6d54794956b4c699d41e7d8bb84e73db2b448f73797701907e9d languageName: node linkType: hard @@ -4670,12 +4683,29 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/type-utils@npm:6.21.0" +"@typescript-eslint/type-utils@npm:6.7.3": + version: 6.7.3 + resolution: "@typescript-eslint/type-utils@npm:6.7.3" + dependencies: + "@typescript-eslint/typescript-estree": "npm:6.7.3" + "@typescript-eslint/utils": "npm:6.7.3" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^1.0.1" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/38b2bd308bbeb275e7a3bf28c231a9ee19394328b3f9c0a03abe1d722169c4cfa2c66df23d204628d92f78901ea3ac6fd10429ac7f8183401cc881f0908878b2 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:6.7.4": + version: 6.7.4 + resolution: "@typescript-eslint/type-utils@npm:6.7.4" dependencies: - "@typescript-eslint/typescript-estree": "npm:6.21.0" - "@typescript-eslint/utils": "npm:6.21.0" + "@typescript-eslint/typescript-estree": "npm:6.7.4" + "@typescript-eslint/utils": "npm:6.7.4" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.0.1" peerDependencies: @@ -4683,7 +4713,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/d03fb3ee1caa71f3ce053505f1866268d7ed79ffb7fed18623f4a1253f5b8f2ffc92636d6fd08fcbaf5bd265a6de77bf192c53105131e4724643dfc910d705fc + checksum: 10/88778c47d912c4846645ed817e33a7c05433353954b670f6d257748361f5cf88ec6dd089e109298ec9c58a8a2cb96509ca9187b7d46bf810c1b0d61e3f475746 languageName: node linkType: hard @@ -4704,13 +4734,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:3.10.1": - version: 3.10.1 - resolution: "@typescript-eslint/types@npm:3.10.1" - checksum: 10/c5c696a0c3b9dbc32b0b9f7ec8d06ab4ccb3422c4147032f001726997faef587d42d7d5c06cc3e4db52c05210b51e8052061630f56258f01523382488e9282ed - languageName: node - linkType: hard - "@typescript-eslint/types@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/types@npm:5.62.0" @@ -4718,10 +4741,17 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/types@npm:6.21.0" - checksum: 10/e26da86d6f36ca5b6ef6322619f8ec55aabcd7d43c840c977ae13ae2c964c3091fc92eb33730d8be08927c9de38466c5323e78bfb270a9ff1d3611fe821046c5 +"@typescript-eslint/types@npm:6.7.3": + version: 6.7.3 + resolution: "@typescript-eslint/types@npm:6.7.3" + checksum: 10/61a1396e78998ffa79a1c8fc58efdacbc482927c080684eea2777f08e9aed61d8c62262550fe8aae030e673987e7537a8b15244637814ac1f733ac6200c497e1 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:6.7.4": + version: 6.7.4 + resolution: "@typescript-eslint/types@npm:6.7.4" + checksum: 10/14aa41aefee32efe8ad469d301c2acc522e411663b912d143c327e1161242e568b8d446a72faec491b86ae44517af3ecb988823aed7b1b1bc6693ff950be4809 languageName: node linkType: hard @@ -4750,13 +4780,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:3.10.1": - version: 3.10.1 - resolution: "@typescript-eslint/typescript-estree@npm:3.10.1" +"@typescript-eslint/typescript-estree@npm:3.3.0": + version: 3.3.0 + resolution: "@typescript-eslint/typescript-estree@npm:3.3.0" dependencies: - "@typescript-eslint/types": "npm:3.10.1" - "@typescript-eslint/visitor-keys": "npm:3.10.1" debug: "npm:^4.1.1" + eslint-visitor-keys: "npm:^1.1.0" glob: "npm:^7.1.6" is-glob: "npm:^4.0.1" lodash: "npm:^4.17.15" @@ -4765,7 +4794,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/ed4eedd04d1bcc651fe03925570b6199e76dd27878cde74dd3f06cf4a5b8911244746475ac9b2496d8cb9e20c70027f9f91ef688604167105a40164e4d408258 + checksum: 10/c351825dd0160d1e6559c6a82eb44f05fe50cdd4157d166d15ba9ac956ad739e86927a6b03c0ae35d231bf270f91c0a3f0420b849a33b76dddff0e1365aadc6a languageName: node linkType: hard @@ -4787,22 +4816,39 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" +"@typescript-eslint/typescript-estree@npm:6.7.3": + version: 6.7.3 + resolution: "@typescript-eslint/typescript-estree@npm:6.7.3" dependencies: - "@typescript-eslint/types": "npm:6.21.0" - "@typescript-eslint/visitor-keys": "npm:6.21.0" + "@typescript-eslint/types": "npm:6.7.3" + "@typescript-eslint/visitor-keys": "npm:6.7.3" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/1dd6f554e9b8ef8e46e33dc6534a2f1c86830bf899c87d0252cffa08f4fce1b13155fde37ded5eb561246cf8a61bcf1d8e7cc9948e717ee3901f9a92b0c0f4e0 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.7.4": + version: 6.7.4 + resolution: "@typescript-eslint/typescript-estree@npm:6.7.4" + dependencies: + "@typescript-eslint/types": "npm:6.7.4" + "@typescript-eslint/visitor-keys": "npm:6.7.4" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" - minimatch: "npm:9.0.3" semver: "npm:^7.5.4" ts-api-utils: "npm:^1.0.1" peerDependenciesMeta: typescript: optional: true - checksum: 10/b32fa35fca2a229e0f5f06793e5359ff9269f63e9705e858df95d55ca2cd7fdb5b3e75b284095a992c48c5fc46a1431a1a4b6747ede2dd08929dc1cbacc589b8 + checksum: 10/3336fc8bcd141c124ab50e26a707c1ca928fa6bcb93cef4754167acbeec7022f0660e7772fc4ffa79cff139711275422449ffc9fd03c6472cf8f77e92405f82c languageName: node linkType: hard @@ -4825,20 +4871,37 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/utils@npm:6.21.0" +"@typescript-eslint/utils@npm:6.7.3": + version: 6.7.3 + resolution: "@typescript-eslint/utils@npm:6.7.3" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@types/json-schema": "npm:^7.0.12" + "@types/semver": "npm:^7.5.0" + "@typescript-eslint/scope-manager": "npm:6.7.3" + "@typescript-eslint/types": "npm:6.7.3" + "@typescript-eslint/typescript-estree": "npm:6.7.3" + semver: "npm:^7.5.4" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: 10/47c908940e4dbc2546265eba923b4ad10d14a3712cd1ed403c654c43764e87619b3d46244402b19fd47fdc76c897c9f43048eb0e57d4d1ac7953d41c8330d07a + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:6.7.4": + version: 6.7.4 + resolution: "@typescript-eslint/utils@npm:6.7.4" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" "@types/json-schema": "npm:^7.0.12" "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.21.0" - "@typescript-eslint/types": "npm:6.21.0" - "@typescript-eslint/typescript-estree": "npm:6.21.0" + "@typescript-eslint/scope-manager": "npm:6.7.4" + "@typescript-eslint/types": "npm:6.7.4" + "@typescript-eslint/typescript-estree": "npm:6.7.4" semver: "npm:^7.5.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 10/b404a2c55a425a79d054346ae123087d30c7ecf7ed7abcf680c47bf70c1de4fabadc63434f3f460b2fa63df76bc9e4a0b9fa2383bb8a9fcd62733fb5c4e4f3e3 + checksum: 10/a2b9b4307385599c1b8d073e319a49a79d9b9315d642d56380385524f333dbe98325128ff6f113566ff10f3447be98b79450567060c37b013fae0b5a83c6b9cc languageName: node linkType: hard @@ -4877,15 +4940,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:3.10.1": - version: 3.10.1 - resolution: "@typescript-eslint/visitor-keys@npm:3.10.1" - dependencies: - eslint-visitor-keys: "npm:^1.1.0" - checksum: 10/13e8059db306e626de3c55c6d3094af57c189b3f6d08ffda14eb13f6b6b9711b20625beeda6d234aed6c9d8aa9092c465aab62759dc09a03aa10dee28214a3fd - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" @@ -4896,13 +4950,23 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" +"@typescript-eslint/visitor-keys@npm:6.7.3": + version: 6.7.3 + resolution: "@typescript-eslint/visitor-keys@npm:6.7.3" + dependencies: + "@typescript-eslint/types": "npm:6.7.3" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10/cfe8a5fe5db7e57f5df3771189c0c4e2cd91e6f1924d1f12521541c9817d75e8c4e93382052ada592cb70fb50c524bd9aa0c05c5240ecfd19757408f38588386 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.7.4": + version: 6.7.4 + resolution: "@typescript-eslint/visitor-keys@npm:6.7.4" dependencies: - "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/types": "npm:6.7.4" eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/30422cdc1e2ffad203df40351a031254b272f9c6f2b7e02e9bfa39e3fc2c7b1c6130333b0057412968deda17a3a68a578a78929a8139c6acef44d9d841dc72e1 + checksum: 10/b9e086c04689ea2180f7cacf63fcea7e6a25bb699ae7ac78b9ed4b23633711d93e08341275e38cda8eba09697d5dcb36da493dfe0e8d4cd6aadc629dc6d4b113 languageName: node linkType: hard @@ -4929,12 +4993,12 @@ __metadata: dependencies: "@aws-sdk/client-lambda": "npm:3.540.0" "@aws-sdk/client-sqs": "npm:3.540.0" - "@types/aws-lambda": "npm:^8.10.136" - "@types/node": "npm:^20.11.30" - jest: "npm:^29.6.4" - ts-jest: "npm:^29.1.2" - typescript: "npm:^5.4.3" - winston: "npm:^3.13.0" + "@types/aws-lambda": "npm:8.10.136" + "@types/node": "npm:20.11.30" + jest: "npm:29.6.4" + ts-jest: "npm:29.1.2" + typescript: "npm:5.4.3" + winston: "npm:3.13.0" peerDependencies: "@hathor/wallet-lib": 0.39.0 languageName: unknown @@ -5180,6 +5244,15 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:^7.0.2": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" + dependencies: + debug: "npm:^4.3.4" + checksum: 10/c478fec8f79953f118704d007a38f2a185458853f5c45579b9669372bd0e12602e88dc2ad0233077831504f7cd6fcc8251c383375bba5eaaf563b102938bda26 + languageName: node + linkType: hard + "agentkeepalive@npm:^4.1.3, agentkeepalive@npm:^4.2.1": version: 4.5.0 resolution: "agentkeepalive@npm:4.5.0" @@ -5387,16 +5460,6 @@ __metadata: languageName: node linkType: hard -"are-we-there-yet@npm:^2.0.0": - version: 2.0.0 - resolution: "are-we-there-yet@npm:2.0.0" - dependencies: - delegates: "npm:^1.0.0" - readable-stream: "npm:^3.6.0" - checksum: 10/ea6f47d14fc33ae9cbea3e686eeca021d9d7b9db83a306010dd04ad5f2c8b7675291b127d3fcbfcbd8fec26e47b3324ad5b469a6cc3733a582f2fe4e12fc6756 - languageName: node - linkType: hard - "are-we-there-yet@npm:^3.0.0": version: 3.0.1 resolution: "are-we-there-yet@npm:3.0.1" @@ -5450,20 +5513,7 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6": - version: 3.1.7 - resolution: "array-includes@npm:3.1.7" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" - is-string: "npm:^1.0.7" - checksum: 10/856a8be5d118967665936ad33ff3b07adfc50b06753e596e91fb80c3da9b8c022e92e3cc6781156d6ad95db7109b9f603682c7df2d6a529ed01f7f6b39a4a360 - languageName: node - linkType: hard - -"array-includes@npm:^3.1.7": +"array-includes@npm:^3.1.3, array-includes@npm:^3.1.7": version: 3.1.8 resolution: "array-includes@npm:3.1.8" dependencies: @@ -5491,19 +5541,6 @@ __metadata: languageName: node linkType: hard -"array.prototype.findlastindex@npm:^1.2.2": - version: 1.2.3 - resolution: "array.prototype.findlastindex@npm:1.2.3" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.1" - checksum: 10/063cbab8eeac3aa01f3e980eecb9a8c5d87723032b49f7f814ecc6d75c33c03c17e3f43a458127a62e16303cab412f95d6ad9dc7e0ae6d9dc27a9bb76c24df7a - languageName: node - linkType: hard - "array.prototype.findlastindex@npm:^1.2.3": version: 1.2.5 resolution: "array.prototype.findlastindex@npm:1.2.5" @@ -5518,7 +5555,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": +"array.prototype.flat@npm:^1.2.4, array.prototype.flat@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flat@npm:1.3.2" dependencies: @@ -5530,7 +5567,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": +"array.prototype.flatmap@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flatmap@npm:1.3.2" dependencies: @@ -5587,7 +5624,7 @@ __metadata: languageName: node linkType: hard -"assert@npm:^2.1.0": +"assert@npm:2.1.0": version: 2.1.0 resolution: "assert@npm:2.1.0" dependencies: @@ -5646,7 +5683,7 @@ __metadata: languageName: node linkType: hard -"aws-lambda@npm:^1.0.7": +"aws-lambda@npm:1.0.7": version: 1.0.7 resolution: "aws-lambda@npm:1.0.7" dependencies: @@ -5660,7 +5697,25 @@ __metadata: languageName: node linkType: hard -"aws-sdk@npm:^2.1404.0, aws-sdk@npm:^2.1454.0, aws-sdk@npm:^2.814.0": +"aws-sdk@npm:2.1454.0": + version: 2.1454.0 + resolution: "aws-sdk@npm:2.1454.0" + dependencies: + buffer: "npm:4.9.2" + events: "npm:1.1.1" + ieee754: "npm:1.1.13" + jmespath: "npm:0.16.0" + querystring: "npm:0.2.0" + sax: "npm:1.2.1" + url: "npm:0.10.3" + util: "npm:^0.12.4" + uuid: "npm:8.0.0" + xml2js: "npm:0.5.0" + checksum: 10/796ba19038900558d0ef43b200cbab336242d41af9b66f1a925e7a51096ba1e24f1fbb4e2c392517197a9db94eea2491109f4c655b8ba219a8e47698566a1ec1 + languageName: node + linkType: hard + +"aws-sdk@npm:^2.1404.0, aws-sdk@npm:^2.814.0": version: 2.1469.0 resolution: "aws-sdk@npm:2.1469.0" dependencies: @@ -5678,6 +5733,26 @@ __metadata: languageName: node linkType: hard +"axios@npm:0.21.1": + version: 0.21.1 + resolution: "axios@npm:0.21.1" + dependencies: + follow-redirects: "npm:^1.10.0" + checksum: 10/271afc61381d285c688f0579eec170b66dc4177219a3f31e67d1fe485be7a2dae4af2c366fdee703a8ec887c52778fdc7f5fec30650a97f61f68c1a7696648b0 + languageName: node + linkType: hard + +"axios@npm:1.6.2": + version: 1.6.2 + resolution: "axios@npm:1.6.2" + dependencies: + follow-redirects: "npm:^1.15.0" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 10/612bc93f8f738a518e7c5f9de9cc782bcd36aac6bae279160ef6a10260378e21c1786520eab3336898e3d66e0839ebdf739f327fb6d0431baa4d3235703a7652 + languageName: node + linkType: hard + "axios@npm:^0.18.0": version: 0.18.1 resolution: "axios@npm:0.18.1" @@ -5697,17 +5772,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.6.2": - version: 1.6.2 - resolution: "axios@npm:1.6.2" - dependencies: - follow-redirects: "npm:^1.15.0" - form-data: "npm:^4.0.0" - proxy-from-env: "npm:^1.1.0" - checksum: 10/612bc93f8f738a518e7c5f9de9cc782bcd36aac6bae279160ef6a10260378e21c1786520eab3336898e3d66e0839ebdf739f327fb6d0431baa4d3235703a7652 - languageName: node - linkType: hard - "babel-jest@npm:^29.7.0": version: 29.7.0 resolution: "babel-jest@npm:29.7.0" @@ -5899,17 +5963,17 @@ __metadata: languageName: node linkType: hard -"bip32@npm:^3.0.1": - version: 3.1.0 - resolution: "bip32@npm:3.1.0" +"bip32@npm:3.0.1": + version: 3.0.1 + resolution: "bip32@npm:3.0.1" dependencies: + "@types/node": "npm:10.12.18" bs58check: "npm:^2.1.1" create-hash: "npm:^1.2.0" create-hmac: "npm:^1.1.7" - ripemd160: "npm:^2.0.2" typeforce: "npm:^1.11.5" wif: "npm:^2.0.6" - checksum: 10/6cdad901d25959e21835fe7b43066fc2498548962aa07ce438860b7420a7a93ceec3a9b34ddee68bbc568a68b9d96029338dbea1eadb548651b06d800a14fc3d + checksum: 10/803fc1954eeb17db507fdfbc2a2c5351d11bb788511065aab46d1a94a6089428cc2a1be46f70eb7f5b6835a5d5a50f1527add8c6d2d5bc8494f1ea573a95917d languageName: node linkType: hard @@ -5934,7 +5998,7 @@ __metadata: languageName: node linkType: hard -"bitcoinjs-lib@npm:^6.1.5": +"bitcoinjs-lib@npm:6.1.5, bitcoinjs-lib@npm:^6.1.5": version: 6.1.5 resolution: "bitcoinjs-lib@npm:6.1.5" dependencies: @@ -5948,7 +6012,7 @@ __metadata: languageName: node linkType: hard -"bitcoinjs-message@npm:^2.2.0": +"bitcoinjs-message@npm:2.2.0, bitcoinjs-message@npm:^2.2.0": version: 2.2.0 resolution: "bitcoinjs-message@npm:2.2.0" dependencies: @@ -6446,15 +6510,6 @@ __metadata: languageName: node linkType: hard -"catharsis@npm:^0.9.0": - version: 0.9.0 - resolution: "catharsis@npm:0.9.0" - dependencies: - lodash: "npm:^4.17.15" - checksum: 10/a4f54d5982c0bc4342b1b27b89aa7fb359994ecd1d41431d8bd30432171188179fce1d11a0240863adb05edd157d5af1ded4c72b4972b0098f266e28f9c67164 - languageName: node - linkType: hard - "chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -6542,6 +6597,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10/115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -6751,7 +6813,7 @@ __metadata: languageName: node linkType: hard -"color-support@npm:^1.1.2, color-support@npm:^1.1.3": +"color-support@npm:^1.1.3": version: 1.1.3 resolution: "color-support@npm:1.1.3" bin: @@ -6780,7 +6842,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.8": +"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -6836,15 +6898,6 @@ __metadata: languageName: node linkType: hard -"compressible@npm:^2.0.12": - version: 2.0.18 - resolution: "compressible@npm:2.0.18" - dependencies: - mime-db: "npm:>= 1.43.0 < 2" - checksum: 10/58321a85b375d39230405654721353f709d0c1442129e9a17081771b816302a012471a9b8f4864c7dbe02eef7f2aaac3c614795197092262e94b409c9be108f0 - languageName: node - linkType: hard - "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -6869,7 +6922,7 @@ __metadata: languageName: node linkType: hard -"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0": +"console-control-strings@npm:^1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" checksum: 10/27b5fa302bc8e9ae9e98c03c66d76ca289ad0c61ce2fe20ab288d288bee875d217512d2edb2363fc83165e88f1c405180cf3f5413a46e51b4fe1a004840c6cdb @@ -7100,7 +7153,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^2.2.0": +"debug@npm:^2.2.0, debug@npm:^2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -7202,7 +7255,14 @@ __metadata: languageName: node linkType: hard -"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10/7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" checksum: 10/ec12d074aef5ae5e81fa470b9317c313142c9e8e2afe3f8efa124db309720db96d1d222b82b84c834e5f87e7a614b44a4684b6683583118b87c833b3be40d4d8 @@ -7299,14 +7359,14 @@ __metadata: languageName: node linkType: hard -"denque@npm:^1.5.0": +"denque@npm:^1.4.1, denque@npm:^1.5.0": version: 1.5.1 resolution: "denque@npm:1.5.1" checksum: 10/dbde01a987d95205f7563c67411e0964073a6b38e4cf2ff190cf91f71e2ce3f51c40bacd31f2a5497e0ff82366bcfd8231d3659cb03f987279130058d512aa29 languageName: node linkType: hard -"denque@npm:^2.0.1, denque@npm:^2.1.0": +"denque@npm:^2.1.0": version: 2.1.0 resolution: "denque@npm:2.1.0" checksum: 10/8ea05321576624b90acfc1ee9208b8d1d04b425cf7573b9b4fa40a2c3ed4d4b0af5190567858f532f677ed2003d4d2b73c8130b34e3c7b8d5e88cdcfbfaa1fe7 @@ -7321,9 +7381,9 @@ __metadata: linkType: hard "detect-libc@npm:^2.0.0": - version: 2.0.2 - resolution: "detect-libc@npm:2.0.2" - checksum: 10/6118f30c0c425b1e56b9d2609f29bec50d35a6af0b762b6ad127271478f3bbfda7319ce869230cf1a351f2b219f39332cde290858553336d652c77b970f15de8 + version: 2.0.3 + resolution: "detect-libc@npm:2.0.3" + checksum: 10/b4ea018d623e077bd395f168a9e81db77370dde36a5b01d067f2ad7989924a81d31cb547ff764acb2aa25d50bb7fdde0b0a93bec02212b0cb430621623246d39 languageName: node linkType: hard @@ -7344,13 +7404,6 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^27.5.1": - version: 27.5.1 - resolution: "diff-sequences@npm:27.5.1" - checksum: 10/34d852a13eb82735c39944a050613f952038614ce324256e1c3544948fa090f1ca7f329a4f1f57c31fe7ac982c17068d8915b633e300f040b97708c81ceb26cd - languageName: node - linkType: hard - "diff-sequences@npm:^29.6.3": version: 29.6.3 resolution: "diff-sequences@npm:29.6.3" @@ -7399,13 +7452,20 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:^10.0.0": +"dotenv@npm:10.0.0": version: 10.0.0 resolution: "dotenv@npm:10.0.0" checksum: 10/55f701ae213e3afe3f4232fae5edfb6e0c49f061a363ff9f1c5a0c2bf3fb990a6e49aeada11b2a116efb5fdc3bc3f1ef55ab330be43033410b267f7c0809a9dc languageName: node linkType: hard +"dotenv@npm:8.2.0": + version: 8.2.0 + resolution: "dotenv@npm:8.2.0" + checksum: 10/994ca227e18b550c52e59cf16bdeb73f31c3c0e80b34f16d4d7bc5d6a7cba23d745335034c4aa7388f9ae13a7f6a9e15f4d65b28ab6cb73b8ac68487e5f5b25e + languageName: node + linkType: hard + "dotenv@npm:^16.3.1": version: 16.3.1 resolution: "dotenv@npm:16.3.1" @@ -7420,13 +7480,6 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:^8.2.0": - version: 8.6.0 - resolution: "dotenv@npm:8.6.0" - checksum: 10/31d7b5c010cebb80046ba6853d703f9573369b00b15129536494f04b0af4ea0060ce8646e3af58b455af2f6f1237879dd261a5831656410ec92561ae1ea44508 - languageName: node - linkType: hard - "dottie@npm:^2.0.6": version: 2.0.6 resolution: "dottie@npm:2.0.6" @@ -7457,6 +7510,18 @@ __metadata: languageName: node linkType: hard +"duplexify@npm:^4.1.3": + version: 4.1.3 + resolution: "duplexify@npm:4.1.3" + dependencies: + end-of-stream: "npm:^1.4.1" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + stream-shift: "npm:^1.0.2" + checksum: 10/b44b98ba0ffac3a658b4b1bf877219e996db288c5ae6f3dc55ca9b2cbef7df60c10eabfdd947f3d73a623eb9975a74a66d6d61e6f26bff90155315adb362aa77 + languageName: node + linkType: hard + "duration@npm:^0.2.2": version: 0.2.2 resolution: "duration@npm:0.2.2" @@ -7585,20 +7650,6 @@ __metadata: languageName: node linkType: hard -"ent@npm:^2.2.0": - version: 2.2.0 - resolution: "ent@npm:2.2.0" - checksum: 10/818a2b5f5039ea02c9e232ba4c7496ced8512341b2524ae7c6c808d2e2b357d8087e715e0e3950cec9895c20c9b3443e0b56a2e26879984d97bb511c5fbb5299 - languageName: node - linkType: hard - -"entities@npm:~2.1.0": - version: 2.1.0 - resolution: "entities@npm:2.1.0" - checksum: 10/fe71642e42e108540b0324dea03e00f3dbad93617c601bfcf292c3f852c236af3e58469219c4653f6f05df781a446f3b82105b8d26b936d0fa246b0103f2f951 - languageName: node - linkType: hard - "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -7892,26 +7943,7 @@ __metadata: languageName: node linkType: hard -"escodegen@npm:^1.13.0": - version: 1.14.3 - resolution: "escodegen@npm:1.14.3" - dependencies: - esprima: "npm:^4.0.1" - estraverse: "npm:^4.2.0" - esutils: "npm:^2.0.2" - optionator: "npm:^0.8.1" - source-map: "npm:~0.6.1" - dependenciesMeta: - source-map: - optional: true - bin: - escodegen: bin/escodegen.js - esgenerate: bin/esgenerate.js - checksum: 10/70f095ca9393535f9f1c145ef99dc0b3ff14cca6bc4a79d90ff3352f90c3f2e07f75af6d6c05174ea67c45271f75e80dd440dd7d04ed2cf44c9452c3042fa84a - languageName: node - linkType: hard - -"eslint-config-airbnb-base@npm:^14.2.1": +"eslint-config-airbnb-base@npm:14.2.1": version: 14.2.1 resolution: "eslint-config-airbnb-base@npm:14.2.1" dependencies: @@ -7925,7 +7957,7 @@ __metadata: languageName: node linkType: hard -"eslint-config-airbnb-base@npm:^15.0.0": +"eslint-config-airbnb-base@npm:15.0.0, eslint-config-airbnb-base@npm:^15.0.0": version: 15.0.0 resolution: "eslint-config-airbnb-base@npm:15.0.0" dependencies: @@ -7940,7 +7972,7 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-alias@npm:^1.1.2": +"eslint-import-resolver-alias@npm:1.1.2": version: 1.1.2 resolution: "eslint-import-resolver-alias@npm:1.1.2" peerDependencies: @@ -7949,7 +7981,7 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.7, eslint-import-resolver-node@npm:^0.3.9": +"eslint-import-resolver-node@npm:^0.3.4, eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" dependencies: @@ -7960,6 +7992,18 @@ __metadata: languageName: node linkType: hard +"eslint-module-utils@npm:^2.6.1": + version: 2.12.0 + resolution: "eslint-module-utils@npm:2.12.0" + dependencies: + debug: "npm:^3.2.7" + peerDependenciesMeta: + eslint: + optional: true + checksum: 10/dd27791147eca17366afcb83f47d6825b6ce164abb256681e5de4ec1d7e87d8605641eb869298a0dbc70665e2446dbcc2f40d3e1631a9475dd64dd23d4ca5dee + languageName: node + linkType: hard + "eslint-module-utils@npm:^2.8.0": version: 2.8.0 resolution: "eslint-module-utils@npm:2.8.0" @@ -7972,34 +8016,32 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:^2.23.3": - version: 2.28.1 - resolution: "eslint-plugin-import@npm:2.28.1" +"eslint-plugin-import@npm:2.23.3": + version: 2.23.3 + resolution: "eslint-plugin-import@npm:2.23.3" dependencies: - array-includes: "npm:^3.1.6" - array.prototype.findlastindex: "npm:^1.2.2" - array.prototype.flat: "npm:^1.3.1" - array.prototype.flatmap: "npm:^1.3.1" - debug: "npm:^3.2.7" + array-includes: "npm:^3.1.3" + array.prototype.flat: "npm:^1.2.4" + debug: "npm:^2.6.9" doctrine: "npm:^2.1.0" - eslint-import-resolver-node: "npm:^0.3.7" - eslint-module-utils: "npm:^2.8.0" + eslint-import-resolver-node: "npm:^0.3.4" + eslint-module-utils: "npm:^2.6.1" + find-up: "npm:^2.0.0" has: "npm:^1.0.3" - is-core-module: "npm:^2.13.0" - is-glob: "npm:^4.0.3" - minimatch: "npm:^3.1.2" - object.fromentries: "npm:^2.0.6" - object.groupby: "npm:^1.0.0" - object.values: "npm:^1.1.6" - semver: "npm:^6.3.1" - tsconfig-paths: "npm:^3.14.2" + is-core-module: "npm:^2.4.0" + minimatch: "npm:^3.0.4" + object.values: "npm:^1.1.3" + pkg-up: "npm:^2.0.0" + read-pkg-up: "npm:^3.0.0" + resolve: "npm:^1.20.0" + tsconfig-paths: "npm:^3.9.0" peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 10/707dc97f06b12b0f3f91d5248dcea91bcd6a72c1168249a3ba177dd1ab6f31de9d5db829705236207a6ae79ad99a7a03efdfddb4a703da3a85530f9cc7401b2f + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 + checksum: 10/d913e7526b88862717d90e2e81d76196ecd0bb695862a3aa86adf796fd3a81b21e23cd831b6d5ff2a4488dfc492b7257cc89d0ab0e3c90f487d15ab21ab400c1 languageName: node linkType: hard -"eslint-plugin-import@npm:^2.29.1": +"eslint-plugin-import@npm:2.29.1, eslint-plugin-import@npm:^2.29.1": version: 2.29.1 resolution: "eslint-plugin-import@npm:2.29.1" dependencies: @@ -8026,18 +8068,36 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jest@npm:^23.13.2": - version: 23.20.0 - resolution: "eslint-plugin-jest@npm:23.20.0" +"eslint-plugin-jest@npm:23.13.2": + version: 23.13.2 + resolution: "eslint-plugin-jest@npm:23.13.2" dependencies: "@typescript-eslint/experimental-utils": "npm:^2.5.0" peerDependencies: eslint: ">=5" - checksum: 10/e20d29cdf811bd67ed21716cc52dc5613c894a935a713636ce96cbbf069435c98946ab6d7be69d6dc4004f21ea63e1b335018df8869cb3d9d3b848861bde4f61 + checksum: 10/f2b2a8fba7f41c323641e27bd87833c53a387202e34f9d3372251a2eabc7a3eedb4f251d39d847f7f4742944eb5ff3e0bfd78c6ce3227fb7d8dc6fd89f65ee1c + languageName: node + linkType: hard + +"eslint-plugin-jest@npm:27.4.0": + version: 27.4.0 + resolution: "eslint-plugin-jest@npm:27.4.0" + dependencies: + "@typescript-eslint/utils": "npm:^5.10.0" + peerDependencies: + "@typescript-eslint/eslint-plugin": ^5.0.0 || ^6.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: "*" + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + jest: + optional: true + checksum: 10/e4eb94b521deb3a49e339d581221f77a8620e3cad429570020087e53b7227321086a614dd855d4a249ca7a161c6afbbcad270bfaad187583e9440159a7a51796 languageName: node linkType: hard -"eslint-plugin-jest@npm:^27.4.0, eslint-plugin-jest@npm:^27.9.0": +"eslint-plugin-jest@npm:^27.9.0": version: 27.9.0 resolution: "eslint-plugin-jest@npm:27.9.0" dependencies: @@ -8055,7 +8115,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-module-resolver@npm:^0.16.0": +"eslint-plugin-module-resolver@npm:0.16.0": version: 0.16.0 resolution: "eslint-plugin-module-resolver@npm:0.16.0" dependencies: @@ -8124,18 +8184,17 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.50.0, eslint@npm:^8.57.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" +"eslint@npm:8.50.0": + version: 8.50.0 + resolution: "eslint@npm:8.50.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.0" - "@humanwhocodes/config-array": "npm:^0.11.14" + "@eslint/eslintrc": "npm:^2.1.2" + "@eslint/js": "npm:8.50.0" + "@humanwhocodes/config-array": "npm:^0.11.11" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" cross-spawn: "npm:^7.0.2" @@ -8168,11 +8227,11 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 10/00496e218b23747a7a9817bf58b522276d0dc1f2e546dceb4eea49f9871574088f72f1f069a6b560ef537efa3a75261b8ef70e51ef19033da1cc4c86a755ef15 + checksum: 10/181f26677a80f21431e68a469470485467a5c847d14d8822c1041efc52905772816546ca4e3fc87b963b7b267d8faf960322df16a30a57044161a32199b0dcfa languageName: node linkType: hard -"eslint@npm:^9.3.0": +"eslint@npm:9.3.0": version: 9.3.0 resolution: "eslint@npm:9.3.0" dependencies: @@ -8216,6 +8275,54 @@ __metadata: languageName: node linkType: hard +"eslint@npm:^8.57.0": + version: 8.57.0 + resolution: "eslint@npm:8.57.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.0" + "@humanwhocodes/config-array": "npm:^0.11.14" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10/00496e218b23747a7a9817bf58b522276d0dc1f2e546dceb4eea49f9871574088f72f1f069a6b560ef537efa3a75261b8ef70e51ef19033da1cc4c86a755ef15 + languageName: node + linkType: hard + "esniff@npm:^1.1.0": version: 1.1.0 resolution: "esniff@npm:1.1.0" @@ -8237,7 +8344,7 @@ __metadata: languageName: node linkType: hard -"espree@npm:^9.0.0, espree@npm:^9.6.0, espree@npm:^9.6.1": +"espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" dependencies: @@ -8248,7 +8355,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.0, esprima@npm:^4.0.1": +"esprima@npm:^4.0.0": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -8285,7 +8392,7 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1, estraverse@npm:^4.2.0": +"estraverse@npm:^4.1.1": version: 4.3.0 resolution: "estraverse@npm:4.3.0" checksum: 10/3f67ad02b6dbfaddd9ea459cf2b6ef4ecff9a6082a7af9d22e445b9abc082ad9ca47e1825557b293fcdae477f4714e561123e30bb6a5b2f184fb2bad4a9497eb @@ -8389,6 +8496,13 @@ __metadata: languageName: node linkType: hard +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 10/588c19847216421ed92befb521767b7018dc88f88b0576df98cb242f20961425e96a92cbece525ef28cc5becceae5d544ae0f5b9b5e2aa05acb13716ca5b3099 + languageName: node + linkType: hard + "expect@npm:^29.0.0, expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" @@ -8455,6 +8569,13 @@ __metadata: languageName: node linkType: hard +"farmhash-modern@npm:^1.1.0": + version: 1.1.0 + resolution: "farmhash-modern@npm:1.1.0" + checksum: 10/48db630b5890556678cc5da85bb284b9bd65846bb60e10163d250d66533860a50cb2c84b4b6a97f784eb2a9ff3aef5b65c4a83734601518f13f6c99fd62009ad + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -8482,7 +8603,7 @@ __metadata: languageName: node linkType: hard -"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": +"fast-levenshtein@npm:^2.0.6": version: 2.0.6 resolution: "fast-levenshtein@npm:2.0.6" checksum: 10/eb7e220ecf2bab5159d157350b81d01f75726a4382f5a9266f42b9150c4523b9795f7f5d9fbbbeaeac09a441b2369f05ee02db48ea938584205530fe5693cfe1 @@ -8496,13 +8617,6 @@ __metadata: languageName: node linkType: hard -"fast-text-encoding@npm:^1.0.0, fast-text-encoding@npm:^1.0.3": - version: 1.0.6 - resolution: "fast-text-encoding@npm:1.0.6" - checksum: 10/f7b9e2e7a21e4ae5f4b8d3729850be83fb45052b28c9c38c09b8366463a291d6dc5448359238bdaf87f6a9e907d5895a94319a2c5e0e9f0786859ad6312d1d06 - languageName: node - linkType: hard - "fast-xml-parser@npm:4.2.5": version: 4.2.5 resolution: "fast-xml-parser@npm:4.2.5" @@ -8514,14 +8628,14 @@ __metadata: languageName: node linkType: hard -"fast-xml-parser@npm:^4.2.2": - version: 4.3.2 - resolution: "fast-xml-parser@npm:4.3.2" +"fast-xml-parser@npm:^4.4.1": + version: 4.5.0 + resolution: "fast-xml-parser@npm:4.5.0" dependencies: strnum: "npm:^1.0.5" bin: fxparser: src/cli/cli.js - checksum: 10/cb3d9ad7d5508e7ec1e6ee4b4753f659c7b7c93c3eb76439cb03072532d07521d53a7e35f243b490dce3fcc16519415bf1f99c6a1004a6de1dccd3d3647c336f + checksum: 10/dc9571c10e7b57b5be54bcd2d92f50c446eb42ea5df347d253e94dd14eb99b5300a6d172e840f151e0721933ca2406165a8d9b316a6d777bf0596dc4fe1df756 languageName: node linkType: hard @@ -8704,6 +8818,15 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^2.0.0, find-up@npm:^2.1.0": + version: 2.1.0 + resolution: "find-up@npm:2.1.0" + dependencies: + locate-path: "npm:^2.0.0" + checksum: 10/43284fe4da09f89011f08e3c32cd38401e786b19226ea440b75386c1b12a4cb738c94969808d53a84f564ede22f732c8409e3cfc3f7fb5b5c32378ad0bbf28bd + languageName: node + linkType: hard + "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -8733,26 +8856,28 @@ __metadata: languageName: node linkType: hard -"firebase-admin@npm:^11.3.0": - version: 11.11.0 - resolution: "firebase-admin@npm:11.11.0" +"firebase-admin@npm:13.0.0": + version: 13.0.0 + resolution: "firebase-admin@npm:13.0.0" dependencies: - "@fastify/busboy": "npm:^1.2.1" - "@firebase/database-compat": "npm:^0.3.4" - "@firebase/database-types": "npm:^0.10.4" - "@google-cloud/firestore": "npm:^6.6.0" - "@google-cloud/storage": "npm:^6.9.5" - "@types/node": "npm:>=12.12.47" + "@fastify/busboy": "npm:^3.0.0" + "@firebase/database-compat": "npm:^2.0.0" + "@firebase/database-types": "npm:^1.0.6" + "@google-cloud/firestore": "npm:^7.10.0" + "@google-cloud/storage": "npm:^7.14.0" + "@types/node": "npm:^22.8.7" + farmhash-modern: "npm:^1.1.0" + google-auth-library: "npm:^9.14.2" jsonwebtoken: "npm:^9.0.0" - jwks-rsa: "npm:^3.0.1" + jwks-rsa: "npm:^3.1.0" node-forge: "npm:^1.3.1" - uuid: "npm:^9.0.0" + uuid: "npm:^11.0.2" dependenciesMeta: "@google-cloud/firestore": optional: true "@google-cloud/storage": optional: true - checksum: 10/74f8592589c9d31b5ce14c117911df812123924c7ff06f1e0e744c85a78f54448aaefd9fd2642cf22d1b928b3161c724b1a1041e2deb5502dea16feb7f32c4e7 + checksum: 10/e9098c64d262bf79db68620afd3af062f29f4a1e0f9a8849c01e8f0c9e0d8465bd8aa51cd30800fd28f16861bdf824b825a39f3fd9b1ce6deafb7806be281a3e languageName: node linkType: hard @@ -8816,6 +8941,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.10.0": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" + peerDependenciesMeta: + debug: + optional: true + checksum: 10/e3ab42d1097e90d28b913903841e6779eb969b62a64706a3eb983e894a5db000fbd89296f45f08885a0e54cd558ef62e81be1165da9be25a6c44920da10f424c + languageName: node + linkType: hard + "follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.15.0": version: 1.15.3 resolution: "follow-redirects@npm:1.15.3" @@ -8845,7 +8980,7 @@ __metadata: languageName: node linkType: hard -"fork-ts-checker-webpack-plugin@npm:^9.0.0": +"fork-ts-checker-webpack-plugin@npm:9.0.0": version: 9.0.0 resolution: "fork-ts-checker-webpack-plugin@npm:9.0.0" dependencies: @@ -8868,6 +9003,18 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^2.5.0": + version: 2.5.2 + resolution: "form-data@npm:2.5.2" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.6" + mime-types: "npm:^2.1.12" + safe-buffer: "npm:^5.2.1" + checksum: 10/ef602e52f0bfcc8f8c346b8783f6dbd2fb271596788d42cf929dddaa50bd61e97da21f01464b4524e77872682264765e53c75ac1ab1466ea23f5c96de585faff + languageName: node + linkType: hard + "form-data@npm:^4.0.0": version: 4.0.0 resolution: "form-data@npm:4.0.0" @@ -9038,23 +9185,6 @@ __metadata: languageName: node linkType: hard -"gauge@npm:^3.0.0": - version: 3.0.2 - resolution: "gauge@npm:3.0.2" - dependencies: - aproba: "npm:^1.0.3 || ^2.0.0" - color-support: "npm:^1.1.2" - console-control-strings: "npm:^1.0.0" - has-unicode: "npm:^2.0.1" - object-assign: "npm:^4.1.1" - signal-exit: "npm:^3.0.0" - string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" - wide-align: "npm:^1.1.2" - checksum: 10/46df086451672a5fecd58f7ec86da74542c795f8e00153fbef2884286ce0e86653c3eb23be2d0abb0c4a82b9b2a9dec3b09b6a1cf31c28085fa0376599a26589 - languageName: node - linkType: hard - "gauge@npm:^4.0.3": version: 4.0.4 resolution: "gauge@npm:4.0.4" @@ -9071,25 +9201,26 @@ __metadata: languageName: node linkType: hard -"gaxios@npm:^5.0.0, gaxios@npm:^5.0.1": - version: 5.1.3 - resolution: "gaxios@npm:5.1.3" +"gaxios@npm:^6.0.0, gaxios@npm:^6.0.2, gaxios@npm:^6.1.1": + version: 6.7.1 + resolution: "gaxios@npm:6.7.1" dependencies: extend: "npm:^3.0.2" - https-proxy-agent: "npm:^5.0.0" + https-proxy-agent: "npm:^7.0.1" is-stream: "npm:^2.0.0" node-fetch: "npm:^2.6.9" - checksum: 10/62d1e1901042b25b50e28e229c220e8908a0af3a7d5ff48ab6e3dd6ec4bfce6efad4f363e3668a873b1d2f06d15c69ef6ee2b6a286d558ffc2d96c32ce3cf333 + uuid: "npm:^9.0.1" + checksum: 10/c85599162208884eadee91215ebbfa1faa412551df4044626cb561300e15193726e8f23d63b486533e066dadad130f58ed872a23acab455238d8d48b531a0695 languageName: node linkType: hard -"gcp-metadata@npm:^5.3.0": - version: 5.3.0 - resolution: "gcp-metadata@npm:5.3.0" +"gcp-metadata@npm:^6.1.0": + version: 6.1.0 + resolution: "gcp-metadata@npm:6.1.0" dependencies: - gaxios: "npm:^5.0.0" + gaxios: "npm:^6.0.0" json-bigint: "npm:^1.0.0" - checksum: 10/ec2c32bd74ef6bfab9533612ef5ece328cb4a550e7523a20245e5eae6a9a74a68ab38ab37d1c1218d893fc39a08f590cef29c98d9a9e622db4fee39d3e1d396b + checksum: 10/a0d12a9cb7499fdb9de0fff5406aa220310c1326b80056be8d9b747aae26414f99d14bd795c0ec52ef7d0473eef9d61bb657b8cd3d8186c8a84c4ddbff025fe9 languageName: node linkType: hard @@ -9209,6 +9340,13 @@ __metadata: languageName: node linkType: hard +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 10/2a091ba07fbce22205642543b4ea8aaf068397e1433c00ae0f9de36a3607baf5bcc14da97fbb798cfca6393b3c402031fca06d8b491a44206d6efef391c58537 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -9263,7 +9401,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^8.0.0, glob@npm:^8.1.0": +"glob@npm:^8.1.0": version: 8.1.0 resolution: "glob@npm:8.1.0" dependencies: @@ -9322,57 +9460,37 @@ __metadata: languageName: node linkType: hard -"google-auth-library@npm:^8.0.1, google-auth-library@npm:^8.0.2": - version: 8.9.0 - resolution: "google-auth-library@npm:8.9.0" +"google-auth-library@npm:^9.14.2, google-auth-library@npm:^9.3.0, google-auth-library@npm:^9.6.3": + version: 9.14.2 + resolution: "google-auth-library@npm:9.14.2" dependencies: - arrify: "npm:^2.0.0" base64-js: "npm:^1.3.0" ecdsa-sig-formatter: "npm:^1.0.11" - fast-text-encoding: "npm:^1.0.0" - gaxios: "npm:^5.0.0" - gcp-metadata: "npm:^5.3.0" - gtoken: "npm:^6.1.0" + gaxios: "npm:^6.1.1" + gcp-metadata: "npm:^6.1.0" + gtoken: "npm:^7.0.0" jws: "npm:^4.0.0" - lru-cache: "npm:^6.0.0" - checksum: 10/64882b178e2b77f370a3503978ab2e31c0db1053b0eb9141c3a7a2fdfb3dd8b808b00846b518f444a8926266e400ec8df30372a719806ad03a258eadae177213 + checksum: 10/141c760ec6188bed607daf98406957b84c59fda41ea9893573fbccc4098221a4cf054c90cc95058068bb4ae039ac5d542fa57f057d6d29721e23e2718e5914c3 languageName: node linkType: hard -"google-gax@npm:^3.5.7": - version: 3.6.1 - resolution: "google-gax@npm:3.6.1" +"google-gax@npm:^4.3.3": + version: 4.4.1 + resolution: "google-gax@npm:4.4.1" dependencies: - "@grpc/grpc-js": "npm:~1.8.0" - "@grpc/proto-loader": "npm:^0.7.0" + "@grpc/grpc-js": "npm:^1.10.9" + "@grpc/proto-loader": "npm:^0.7.13" "@types/long": "npm:^4.0.0" - "@types/rimraf": "npm:^3.0.2" abort-controller: "npm:^3.0.0" duplexify: "npm:^4.0.0" - fast-text-encoding: "npm:^1.0.3" - google-auth-library: "npm:^8.0.2" - is-stream-ended: "npm:^0.1.4" - node-fetch: "npm:^2.6.1" + google-auth-library: "npm:^9.3.0" + node-fetch: "npm:^2.7.0" object-hash: "npm:^3.0.0" - proto3-json-serializer: "npm:^1.0.0" - protobufjs: "npm:7.2.4" - protobufjs-cli: "npm:1.1.1" - retry-request: "npm:^5.0.0" - bin: - compileProtos: build/tools/compileProtos.js - minifyProtoJson: build/tools/minify.js - checksum: 10/aa6bef74bd23cc05f8d1958c3ca45aa5eaa48d16b25f92eaa254bb6f30c94228801b91bcdba528744b5c3b368428b7298c9fb4c893a916bb4369102de664acdf - languageName: node - linkType: hard - -"google-p12-pem@npm:^4.0.0": - version: 4.0.1 - resolution: "google-p12-pem@npm:4.0.1" - dependencies: - node-forge: "npm:^1.3.1" - bin: - gp12-pem: build/src/bin/gp12-pem.js - checksum: 10/27937440d7c3f8022c6fe9068da6fd74457fea80513b3c34a7b45b29205003bfd31042f7008cd1b970b35ff7147409f0d9a24e554a327d4cae5255c4b60693db + proto3-json-serializer: "npm:^2.0.2" + protobufjs: "npm:^7.3.2" + retry-request: "npm:^7.0.0" + uuid: "npm:^9.0.1" + checksum: 10/c569e603b9191a1036b01daf442fbcc786c14c66abf7cc8d7451d396ee7d7ae1f52f7c020b22410b6e82e71807a6000bef582c7fb6e4faf9ff19b93f498cfdf0 languageName: node linkType: hard @@ -9404,7 +9522,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.10, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.10, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 @@ -9427,14 +9545,13 @@ __metadata: languageName: node linkType: hard -"gtoken@npm:^6.1.0": - version: 6.1.2 - resolution: "gtoken@npm:6.1.2" +"gtoken@npm:^7.0.0": + version: 7.1.0 + resolution: "gtoken@npm:7.1.0" dependencies: - gaxios: "npm:^5.0.1" - google-p12-pem: "npm:^4.0.0" + gaxios: "npm:^6.0.0" jws: "npm:^4.0.0" - checksum: 10/c5599456205671c5c9321284266f13a0ed275eb190c0a553c4f528ca1c8cf25ec9bb0a2f916e24492915ad209f2f4001230ffdc4d8a270f4e62d4ab9c866a7b2 + checksum: 10/640392261e55c9242137a81a4af8feb053b57061762cedddcbb6a0d62c2314316161808ac2529eea67d06d69fdc56d82361af50f2d840a04a87ea29e124d7382 languageName: node linkType: hard @@ -9568,7 +9685,7 @@ __metadata: "@aws-sdk/client-lambda": "npm:3.540.0" "@aws-sdk/client-sqs": "npm:3.540.0" "@hathor/wallet-lib": "npm:0.39.0" - "@types/jest": "npm:^29.5.12" + "@types/jest": "npm:29.5.13" "@typescript-eslint/eslint-plugin": "npm:^7.4.0" "@typescript-eslint/parser": "npm:^7.4.0" "@wallet-service/common": "npm:1.5.0" @@ -9614,6 +9731,13 @@ __metadata: languageName: node linkType: hard +"html-entities@npm:^2.5.2": + version: 2.5.2 + resolution: "html-entities@npm:2.5.2" + checksum: 10/4ec12ebdf2d5ba8192c68e1aef3c1e4a4f36b29246a0a88464fe278a54517d0196d3489af46a3145c7ecacb4fc5fd50497be19eb713b810acab3f0efcf36fdc2 + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -9677,6 +9801,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^7.0.1": + version: 7.0.5 + resolution: "https-proxy-agent@npm:7.0.5" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 10/6679d46159ab3f9a5509ee80c3a3fc83fba3a920a5e18d32176c3327852c3c00ad640c0c4210a8fd70ea3c4a6d3a1b375bf01942516e7df80e2646bdc77658ab + languageName: node + linkType: hard + "human-signals@npm:^2.1.0": version: 2.1.0 resolution: "human-signals@npm:2.1.0" @@ -9820,7 +9954,7 @@ __metadata: languageName: node linkType: hard -"ini@npm:^1.3.4": +"ini@npm:^1.3.4, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: 10/314ae176e8d4deb3def56106da8002b462221c174ddb7ce0c49ee72c8cd1f9044f7b10cc555a7d8850982c3b9ca96fc212122749f5234bc2b6fb05fb942ed566 @@ -9993,6 +10127,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.4.0": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10/77316d5891d5743854bcef2cd2f24c5458fb69fbc9705c12ca17d54a2017a67d0693bbf1ba8c77af376c0eef6bf6d1b27a4ab08e4db4e69914c3789bdf2ceec5 + languageName: node + linkType: hard + "is-data-view@npm:^1.0.1": version: 1.0.1 resolution: "is-data-view@npm:1.0.1" @@ -10203,13 +10346,6 @@ __metadata: languageName: node linkType: hard -"is-stream-ended@npm:^0.1.4": - version: 0.1.4 - resolution: "is-stream-ended@npm:0.1.4" - checksum: 10/56cbc9cfa0a77877777a3df9e186abb5b0ca73dcbcaf0fd87ed573fb8f8e61283abec0fc072c9e3412336edc04449439b8a128d2bcc6c2797158de5465cfaf85 - languageName: node - linkType: hard - "is-stream@npm:^1.1.0": version: 1.1.0 resolution: "is-stream@npm:1.1.0" @@ -10464,7 +10600,7 @@ __metadata: languageName: node linkType: hard -"jest-cli@npm:^29.7.0": +"jest-cli@npm:^29.6.4, jest-cli@npm:^29.7.0": version: 29.7.0 resolution: "jest-cli@npm:29.7.0" dependencies: @@ -10528,18 +10664,6 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-diff@npm:27.5.1" - dependencies: - chalk: "npm:^4.0.0" - diff-sequences: "npm:^27.5.1" - jest-get-type: "npm:^27.5.1" - pretty-format: "npm:^27.5.1" - checksum: 10/af454f30f33af625832bdb02614e188a41e33ce79086b43f95dbcc515274dd36bf8443b8d0299e22c2416e7591da4321e6bc7f2b0aef56471d1133c6b6833221 - languageName: node - linkType: hard - "jest-diff@npm:^29.7.0": version: 29.7.0 resolution: "jest-diff@npm:29.7.0" @@ -10588,13 +10712,6 @@ __metadata: languageName: node linkType: hard -"jest-get-type@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-get-type@npm:27.5.1" - checksum: 10/63064ab70195c21007d897c1157bf88ff94a790824a10f8c890392e7d17eda9c3900513cb291ca1c8d5722cad79169764e9a1279f7c8a9c4cd6e9109ff04bbc0 - languageName: node - linkType: hard - "jest-get-type@npm:^29.6.3": version: 29.6.3 resolution: "jest-get-type@npm:29.6.3" @@ -10635,18 +10752,6 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:^27.0.0": - version: 27.5.1 - resolution: "jest-matcher-utils@npm:27.5.1" - dependencies: - chalk: "npm:^4.0.0" - jest-diff: "npm:^27.5.1" - jest-get-type: "npm:^27.5.1" - pretty-format: "npm:^27.5.1" - checksum: 10/037f99878a0515581d7728ed3aed03707810f4da5a1c7ffb9d68a2c6c3180851a6ec40b559af37fbe891dde3ba12552b19e47b8188a27b6c5a53376be6907f32 - languageName: node - linkType: hard - "jest-matcher-utils@npm:^29.7.0": version: 29.7.0 resolution: "jest-matcher-utils@npm:29.7.0" @@ -10887,14 +10992,14 @@ __metadata: languageName: node linkType: hard -"jest@npm:^29.6.4, jest@npm:^29.7.0": - version: 29.7.0 - resolution: "jest@npm:29.7.0" +"jest@npm:29.6.4": + version: 29.6.4 + resolution: "jest@npm:29.6.4" dependencies: - "@jest/core": "npm:^29.7.0" + "@jest/core": "npm:^29.6.4" "@jest/types": "npm:^29.6.3" import-local: "npm:^3.0.2" - jest-cli: "npm:^29.7.0" + jest-cli: "npm:^29.6.4" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -10902,31 +11007,50 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: 10/97023d78446098c586faaa467fbf2c6b07ff06e2c85a19e3926adb5b0effe9ac60c4913ae03e2719f9c01ae8ffd8d92f6b262cedb9555ceeb5d19263d8c6362a + checksum: 10/d747e293bd63f583e7978ac0693ab7a019812fa44b9bf3b3fe20e75e8a343bcd8251d292326d73151dc0b8a2b5a974d878b3aa9ffb146dfa7980553f64a35b43 languageName: node linkType: hard -"jmespath@npm:0.16.0": - version: 0.16.0 - resolution: "jmespath@npm:0.16.0" - checksum: 10/cc8b4a5cd2a22a79fc2695d66e5a43bc0020ec1ebdbe648440e796764751af2f495771ce877dea45ee6545530f0a1528450c3c3026bc0e9d976a93447af9fb74 - languageName: node +"jest@npm:29.7.0, jest@npm:^29.7.0": + version: 29.7.0 + resolution: "jest@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + import-local: "npm:^3.0.2" + jest-cli: "npm:^29.7.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10/97023d78446098c586faaa467fbf2c6b07ff06e2c85a19e3926adb5b0effe9ac60c4913ae03e2719f9c01ae8ffd8d92f6b262cedb9555ceeb5d19263d8c6362a + languageName: node linkType: hard -"joi@npm:^17.4.0": - version: 17.10.2 - resolution: "joi@npm:17.10.2" +"jmespath@npm:0.16.0": + version: 0.16.0 + resolution: "jmespath@npm:0.16.0" + checksum: 10/cc8b4a5cd2a22a79fc2695d66e5a43bc0020ec1ebdbe648440e796764751af2f495771ce877dea45ee6545530f0a1528450c3c3026bc0e9d976a93447af9fb74 + languageName: node + linkType: hard + +"joi@npm:17.4.0": + version: 17.4.0 + resolution: "joi@npm:17.4.0" dependencies: "@hapi/hoek": "npm:^9.0.0" "@hapi/topo": "npm:^5.0.0" - "@sideway/address": "npm:^4.1.3" - "@sideway/formula": "npm:^3.0.1" + "@sideway/address": "npm:^4.1.0" + "@sideway/formula": "npm:^3.0.0" "@sideway/pinpoint": "npm:^2.0.0" - checksum: 10/d0d882162e57f25f43f9c59269a530c7ee24b3a275474dc7729447bc37617d5c4dba091ecf0cd62aed669a1c4832fff3be582f413c7bd1add9b798f6a506c7d8 + checksum: 10/c9081e6bbf222fc87f574b9675275dddab03c7b64af5d437d8755974abda400f8009739bec885d4f67086285b0d8f74a841d5500a94d6cacaf77312cf69ce5c4 languageName: node linkType: hard -"jose@npm:^4.10.4, jose@npm:^4.14.6": +"jose@npm:^4.14.6": version: 4.15.1 resolution: "jose@npm:4.15.1" checksum: 10/ae2ae10c5ac50bf7d0504eba82272339af0712b25abe99465448339df512decf0e5b2e4b8e7f6d23dc3b615bb0a66ad0a033cdf1a66132f29284cafd22f4fdb9 @@ -10993,40 +11117,6 @@ __metadata: languageName: node linkType: hard -"js2xmlparser@npm:^4.0.2": - version: 4.0.2 - resolution: "js2xmlparser@npm:4.0.2" - dependencies: - xmlcreate: "npm:^2.0.4" - checksum: 10/42ccb1372844b6e1d9166254b01fe31d485a0e398fba4f2b095bcca081a2c2f4414b0bd4a32263cd20e01cee681684608255778034fec050e3f5929fd776936c - languageName: node - linkType: hard - -"jsdoc@npm:^4.0.0": - version: 4.0.2 - resolution: "jsdoc@npm:4.0.2" - dependencies: - "@babel/parser": "npm:^7.20.15" - "@jsdoc/salty": "npm:^0.2.1" - "@types/markdown-it": "npm:^12.2.3" - bluebird: "npm:^3.7.2" - catharsis: "npm:^0.9.0" - escape-string-regexp: "npm:^2.0.0" - js2xmlparser: "npm:^4.0.2" - klaw: "npm:^3.0.0" - markdown-it: "npm:^12.3.2" - markdown-it-anchor: "npm:^8.4.1" - marked: "npm:^4.0.10" - mkdirp: "npm:^1.0.4" - requizzle: "npm:^0.2.3" - strip-json-comments: "npm:^3.1.0" - underscore: "npm:~1.13.2" - bin: - jsdoc: jsdoc.js - checksum: 10/1cd7e871f1d9c2af5dd8d3bb1d01b9905807fcb7df7d59e0e4d2ab424224963a145944b975f70947909dd9e246ad52d5e685cd1e7b0381a2195d44d7b7c43163 - languageName: node - linkType: hard - "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -11178,7 +11268,7 @@ __metadata: languageName: node linkType: hard -"jsonwebtoken@npm:^8.5.1": +"jsonwebtoken@npm:8.5.1": version: 8.5.1 resolution: "jsonwebtoken@npm:8.5.1" dependencies: @@ -11248,17 +11338,17 @@ __metadata: languageName: node linkType: hard -"jwks-rsa@npm:^3.0.1": - version: 3.0.1 - resolution: "jwks-rsa@npm:3.0.1" +"jwks-rsa@npm:^3.1.0": + version: 3.1.0 + resolution: "jwks-rsa@npm:3.1.0" dependencies: - "@types/express": "npm:^4.17.14" - "@types/jsonwebtoken": "npm:^9.0.0" + "@types/express": "npm:^4.17.17" + "@types/jsonwebtoken": "npm:^9.0.2" debug: "npm:^4.3.4" - jose: "npm:^4.10.4" + jose: "npm:^4.14.6" limiter: "npm:^1.1.5" - lru-memoizer: "npm:^2.1.4" - checksum: 10/50c9d8f36f59133ab63d48f0b7dd3d552bffc94559fd9a2f291bdd23c353cabea8297185922104f59600ac35d0e85840fe08e1f93e37ff5c3c25606a35a7ab9b + lru-memoizer: "npm:^2.2.0" + checksum: 10/004883b3f2c9b12d3dd364acd6be3198343b1ca89fd51c9bc03473a2555282ebb4c374cd391847bbd46eaab19ac19a2e518787683707444c0506fcf7ac4cae97 languageName: node linkType: hard @@ -11314,15 +11404,6 @@ __metadata: languageName: node linkType: hard -"klaw@npm:^3.0.0": - version: 3.0.0 - resolution: "klaw@npm:3.0.0" - dependencies: - graceful-fs: "npm:^4.1.9" - checksum: 10/b55bb6c5dad4f5f2431914fd4b2d0312cdd3581fc1ef75ca0b83899c76dfc4c78b6a22508a33cb8c1ebe0bbdc13aa028a05eda23ef11625a935c30687fd8be14 - languageName: node - linkType: hard - "kleur@npm:^3.0.3": version: 3.0.3 resolution: "kleur@npm:3.0.3" @@ -11363,16 +11444,6 @@ __metadata: languageName: node linkType: hard -"levn@npm:~0.3.0": - version: 0.3.0 - resolution: "levn@npm:0.3.0" - dependencies: - prelude-ls: "npm:~1.1.2" - type-check: "npm:~0.3.2" - checksum: 10/e1c3e75b5c430d9aa4c32c83c8a611e4ca53608ca78e3ea3bf6bbd9d017e4776d05d86e27df7901baebd3afa732abede9f26f715b8c1be19e95505c7a3a7b589 - languageName: node - linkType: hard - "lie@npm:~3.3.0": version: 3.3.0 resolution: "lie@npm:3.3.0" @@ -11396,15 +11467,6 @@ __metadata: languageName: node linkType: hard -"linkify-it@npm:^3.0.1": - version: 3.0.3 - resolution: "linkify-it@npm:3.0.3" - dependencies: - uc.micro: "npm:^1.0.1" - checksum: 10/1ed466b02ad361bb5e5b94a81232fc126890751038bf3e61f648f4ccb01e5e096bba66c3eff3d21ed5e3da738de0dc29783afedf0255733669889aa09d49e47e - languageName: node - linkType: hard - "load-json-file@npm:^4.0.0": version: 4.0.0 resolution: "load-json-file@npm:4.0.0" @@ -11424,6 +11486,16 @@ __metadata: languageName: node linkType: hard +"locate-path@npm:^2.0.0": + version: 2.0.0 + resolution: "locate-path@npm:2.0.0" + dependencies: + p-locate: "npm:^2.0.0" + path-exists: "npm:^3.0.0" + checksum: 10/02d581edbbbb0fa292e28d96b7de36b5b62c2fa8b5a7e82638ebb33afa74284acf022d3b1e9ae10e3ffb7658fbc49163fcd5e76e7d1baaa7801c3e05a81da755 + languageName: node + linkType: hard + "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -11575,7 +11647,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.11, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21": +"lodash@npm:4.17.21, lodash@npm:^4.17.11, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10/c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532 @@ -11667,6 +11739,15 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:6.0.0, lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10/fc1fe2ee205f7c8855fa0f34c1ab0bcf14b6229e35579ec1fd1079f31d6fc8ef8eb6fd17f2f4d99788d7e339f50e047555551ebd5e434dda503696e7c6591825 + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -11676,15 +11757,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10/fc1fe2ee205f7c8855fa0f34c1ab0bcf14b6229e35579ec1fd1079f31d6fc8ef8eb6fd17f2f4d99788d7e339f50e047555551ebd5e434dda503696e7c6591825 - languageName: node - linkType: hard - "lru-cache@npm:^7.14.1, lru-cache@npm:^7.7.1": version: 7.18.3 resolution: "lru-cache@npm:7.18.3" @@ -11706,23 +11778,13 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:~4.0.0": - version: 4.0.2 - resolution: "lru-cache@npm:4.0.2" - dependencies: - pseudomap: "npm:^1.0.1" - yallist: "npm:^2.0.0" - checksum: 10/2ff07a37d71dd8936a29328a0b7263f1f9eb02e4e05b7313dd2b159d8c1a79da144562b23b95bbf61c985b6a110451d415fd269fb4171ccdf539378c2e6b3d7b - languageName: node - linkType: hard - -"lru-memoizer@npm:^2.1.4": - version: 2.2.0 - resolution: "lru-memoizer@npm:2.2.0" +"lru-memoizer@npm:^2.2.0": + version: 2.3.0 + resolution: "lru-memoizer@npm:2.3.0" dependencies: lodash.clonedeep: "npm:^4.5.0" - lru-cache: "npm:~4.0.0" - checksum: 10/a13361a11c64bc5af1a7cadba4c24b2afbe11396533e222ed092723a6928e27e14f56c1402535667d4e801d8ee49a9c0fd73a20bd6806f5f92d2f4ba102026ec + lru-cache: "npm:6.0.0" + checksum: 10/1c00afc28640a2f02116c5907be0543647ad51084c43c3cecc1198efdfb5d3693caad948590f61bce3fc8c9f52ec8f567a64273a947535c2391ee41b675cc5e4 languageName: node linkType: hard @@ -11751,15 +11813,6 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^3.1.0": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" - dependencies: - semver: "npm:^6.0.0" - checksum: 10/484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 - languageName: node - linkType: hard - "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -11832,40 +11885,6 @@ __metadata: languageName: node linkType: hard -"markdown-it-anchor@npm:^8.4.1": - version: 8.6.7 - resolution: "markdown-it-anchor@npm:8.6.7" - peerDependencies: - "@types/markdown-it": "*" - markdown-it: "*" - checksum: 10/1b061e9c8fb093dab6040725f9f3cedae7da1160a14ee8f29d144534be7ee5c788f02a4de4019f55eb8514cae5f12d350baaa7d08732c26a62abc60e5e66c7f7 - languageName: node - linkType: hard - -"markdown-it@npm:^12.3.2": - version: 12.3.2 - resolution: "markdown-it@npm:12.3.2" - dependencies: - argparse: "npm:^2.0.1" - entities: "npm:~2.1.0" - linkify-it: "npm:^3.0.1" - mdurl: "npm:^1.0.1" - uc.micro: "npm:^1.0.5" - bin: - markdown-it: bin/markdown-it.js - checksum: 10/d83d794bfb9f5e05750b25db401d9c1f9b97c6bbabb6cfd78988bb98652c62c24417435487238e2b91fd4e495547ae8c9429fb4c69e9f5bf49bd0dd292d53f24 - languageName: node - linkType: hard - -"marked@npm:^4.0.10": - version: 4.3.0 - resolution: "marked@npm:4.3.0" - bin: - marked: bin/marked.js - checksum: 10/c830bb4cb3705b754ca342b656e8a582d7428706b2678c898b856f6030c134ce2d1e19136efa3e6a1841f7330efbd24963d6bdeddc57d2938e906250f99895d0 - languageName: node - linkType: hard - "md5.js@npm:^1.3.4": version: 1.3.5 resolution: "md5.js@npm:1.3.5" @@ -11877,13 +11896,6 @@ __metadata: languageName: node linkType: hard -"mdurl@npm:^1.0.1": - version: 1.0.1 - resolution: "mdurl@npm:1.0.1" - checksum: 10/ada367d01c9e81d07328101f187d5bd8641b71f33eab075df4caed935a24fa679e625f07108801d8250a5e4a99e5cd4be7679957a11424a3aa3e740d2bb2d5cb - languageName: node - linkType: hard - "memfs@npm:^3.4.1": version: 3.5.3 resolution: "memfs@npm:3.5.3" @@ -11947,14 +11959,14 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2, mime-db@npm:^1.28.0, mime-db@npm:^1.52.0": +"mime-db@npm:1.52.0, mime-db@npm:^1.28.0, mime-db@npm:^1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 10/54bb60bf39e6f8689f6622784e668a3d7f8bed6b0d886f5c3c446cb3284be28b30bf707ed05d0fe44a036f8469976b2629bbea182684977b084de9da274694d7 languageName: node linkType: hard -"mime-types@npm:^2.0.8, mime-types@npm:^2.1.12, mime-types@npm:^2.1.27": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -12059,7 +12071,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10/908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f @@ -12165,6 +12177,13 @@ __metadata: languageName: node linkType: hard +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 10/3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac + languageName: node + linkType: hard + "mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -12218,25 +12237,25 @@ __metadata: languageName: node linkType: hard -"mysql2@npm:^2.2.5": - version: 2.3.3 - resolution: "mysql2@npm:2.3.3" +"mysql2@npm:2.2.5": + version: 2.2.5 + resolution: "mysql2@npm:2.2.5" dependencies: - denque: "npm:^2.0.1" + denque: "npm:^1.4.1" generate-function: "npm:^2.3.1" - iconv-lite: "npm:^0.6.3" + iconv-lite: "npm:^0.6.2" long: "npm:^4.0.0" lru-cache: "npm:^6.0.0" named-placeholders: "npm:^1.1.2" seq-queue: "npm:^0.0.5" sqlstring: "npm:^2.3.2" - checksum: 10/af101e46c3f342d80f85dce6053f771c9ca7fd2cdfef993226eee11edefbb01a4740f1e9674014dcd8c948c53711553c5a523d3105364f40a120318e87dc8049 + checksum: 10/d67cf9c5093512d20ae1c0f01bd6320cadc6d8926a7cc7caa48b88958c6463917b0e160b69c269cf6893a6d48696a3c9985b2ef4089e5290fe8bdc48e1321c24 languageName: node linkType: hard -"mysql2@npm:^3.5.2": - version: 3.6.1 - resolution: "mysql2@npm:3.6.1" +"mysql2@npm:3.5.2": + version: 3.5.2 + resolution: "mysql2@npm:3.5.2" dependencies: denque: "npm:^2.1.0" generate-function: "npm:^2.3.1" @@ -12246,7 +12265,7 @@ __metadata: named-placeholders: "npm:^1.1.3" seq-queue: "npm:^0.0.5" sqlstring: "npm:^2.3.2" - checksum: 10/903b44bbc5a59ed50ddc84489d5037d7e41e7de4fed9ccee87f850a6826714148ec944c56b186ddf6976bb3dea28d2d5d6bdb581e1855ce538c0155183ada3be + checksum: 10/ff3eba1e5e0007f9d9d0a388bfc27628c18dca4d5f5b778e134e07aeb0e2ca81269402f8422d9872938105024944a8df358a44c9ca4f49f775d95e2a98cbb200 languageName: node linkType: hard @@ -12266,7 +12285,7 @@ __metadata: languageName: node linkType: hard -"mysql@npm:^2.18.1": +"mysql@npm:2.18.1, mysql@npm:^2.18.1": version: 2.18.1 resolution: "mysql@npm:2.18.1" dependencies: @@ -12296,6 +12315,13 @@ __metadata: languageName: node linkType: hard +"napi-build-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "napi-build-utils@npm:1.0.2" + checksum: 10/276feb8e30189fe18718e85b6f82e4f952822baa2e7696f771cc42571a235b789dc5907a14d9ffb6838c3e4ff4c25717c2575e5ce1cf6e02e496e204c11e57f6 + languageName: node + linkType: hard + "native-promise-only@npm:^0.8.1": version: 0.8.1 resolution: "native-promise-only@npm:0.8.1" @@ -12354,6 +12380,15 @@ __metadata: languageName: node linkType: hard +"node-abi@npm:^3.3.0": + version: 3.68.0 + resolution: "node-abi@npm:3.68.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10/577ffe569606d52e2e8c00a4d23e87ec3fcd30369ba5cb0b38a95bf418d41208c6b1645694d04b7e85756ed116469a3a5f108661735bc810f2a383c5a6ff3a1c + languageName: node + linkType: hard + "node-abort-controller@npm:^3.0.1": version: 3.1.1 resolution: "node-abort-controller@npm:3.1.1" @@ -12361,12 +12396,12 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:^4.2.0": - version: 4.3.0 - resolution: "node-addon-api@npm:4.3.0" +"node-addon-api@npm:^7.0.0": + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" dependencies: node-gyp: "npm:latest" - checksum: 10/d3b38d16cb9ad0714d965331d0e38cef1c27750c2c3343cd3464a9ed8158501a2910ccbf2fd9fdc476e806a19dbc9e0524ff9d66a7c779d42a9752a63ba30b80 + checksum: 10/ee1e1ed6284a2f8cd1d59ac6175ecbabf8978dcf570345e9a8095a9d0a2b9ced591074ae77f9009287b00c402352b38aa9322a34f2199cdc9f567b842a636b94 languageName: node linkType: hard @@ -12379,7 +12414,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.11, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.8, node-fetch@npm:^2.6.9": +"node-fetch@npm:^2.6.11, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.8, node-fetch@npm:^2.6.9, node-fetch@npm:^2.7.0": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -12540,7 +12575,7 @@ __metadata: languageName: node linkType: hard -"npm-run-all@npm:^4.1.5": +"npm-run-all@npm:4.1.5": version: 4.1.5 resolution: "npm-run-all@npm:4.1.5" dependencies: @@ -12579,18 +12614,6 @@ __metadata: languageName: node linkType: hard -"npmlog@npm:^5.0.1": - version: 5.0.1 - resolution: "npmlog@npm:5.0.1" - dependencies: - are-we-there-yet: "npm:^2.0.0" - console-control-strings: "npm:^1.1.0" - gauge: "npm:^3.0.0" - set-blocking: "npm:^2.0.0" - checksum: 10/f42c7b9584cdd26a13c41a21930b6f5912896b6419ab15be88cc5721fc792f1c3dd30eb602b26ae08575694628ba70afdcf3675d86e4f450fc544757e52726ec - languageName: node - linkType: hard - "npmlog@npm:^6.0.0": version: 6.0.2 resolution: "npmlog@npm:6.0.2" @@ -12603,7 +12626,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": +"object-assign@npm:^4.0.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10/fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f @@ -12694,17 +12717,6 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.6": - version: 2.0.7 - resolution: "object.fromentries@npm:2.0.7" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - checksum: 10/1bfbe42a51f8d84e417d193fae78e4b8eebb134514cdd44406480f8e8a0e075071e0717635d8e3eccd50fec08c1d555fe505c38804cbac0808397187653edd59 - languageName: node - linkType: hard - "object.fromentries@npm:^2.0.7": version: 2.0.8 resolution: "object.fromentries@npm:2.0.8" @@ -12717,18 +12729,6 @@ __metadata: languageName: node linkType: hard -"object.groupby@npm:^1.0.0": - version: 1.0.1 - resolution: "object.groupby@npm:1.0.1" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" - checksum: 10/b7123d91403f95d63978513b23a6079c30f503311f64035fafc863c291c787f287b58df3b21ef002ce1d0b820958c9009dd5a8ab696e0eca325639d345e41524 - languageName: node - linkType: hard - "object.groupby@npm:^1.0.1": version: 1.0.3 resolution: "object.groupby@npm:1.0.3" @@ -12740,18 +12740,7 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.6": - version: 1.1.7 - resolution: "object.values@npm:1.1.7" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - checksum: 10/20ab42c0bbf984405c80e060114b18cf5d629a40a132c7eac4fb79c5d06deb97496311c19297dcf9c61f45c2539cd4c7f7c5d6230e51db360ff297bbc9910162 - languageName: node - linkType: hard - -"object.values@npm:^1.1.7": +"object.values@npm:^1.1.3, object.values@npm:^1.1.7": version: 1.2.0 resolution: "object.values@npm:1.2.0" dependencies: @@ -12819,20 +12808,6 @@ __metadata: languageName: node linkType: hard -"optionator@npm:^0.8.1": - version: 0.8.3 - resolution: "optionator@npm:0.8.3" - dependencies: - deep-is: "npm:~0.1.3" - fast-levenshtein: "npm:~2.0.6" - levn: "npm:~0.3.0" - prelude-ls: "npm:~1.1.2" - type-check: "npm:~0.3.2" - word-wrap: "npm:~1.2.3" - checksum: 10/6fa3c841b520f10aec45563962922215180e8cfbc59fde3ecd4ba2644ad66ca96bd19ad0e853f22fefcb7fc10e7612a5215b412cc66c5588f9a3138b38f6b5ff - languageName: node - linkType: hard - "optionator@npm:^0.9.3": version: 0.9.3 resolution: "optionator@npm:0.9.3" @@ -12894,6 +12869,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^1.1.0": + version: 1.3.0 + resolution: "p-limit@npm:1.3.0" + dependencies: + p-try: "npm:^1.0.0" + checksum: 10/eb9d9bc378d48ab1998d2a2b2962a99eddd3e3726c82d3258ecc1a475f22907968edea4fec2736586d100366a001c6bb449a2abe6cd65e252e9597394f01e789 + languageName: node + linkType: hard + "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -12912,6 +12896,15 @@ __metadata: languageName: node linkType: hard +"p-locate@npm:^2.0.0": + version: 2.0.0 + resolution: "p-locate@npm:2.0.0" + dependencies: + p-limit: "npm:^1.1.0" + checksum: 10/e2dceb9b49b96d5513d90f715780f6f4972f46987dc32a0e18bc6c3fc74a1a5d73ec5f81b1398af5e58b99ea1ad03fd41e9181c01fa81b4af2833958696e3081 + languageName: node + linkType: hard + "p-locate@npm:^4.1.0": version: 4.1.0 resolution: "p-locate@npm:4.1.0" @@ -12969,6 +12962,13 @@ __metadata: languageName: node linkType: hard +"p-try@npm:^1.0.0": + version: 1.0.0 + resolution: "p-try@npm:1.0.0" + checksum: 10/20d9735f57258158df50249f172c77fe800d31e80f11a3413ac9e68ccbe6b11798acb3f48f2df8cea7ba2b56b753ce695a4fe2a2987c3c7691c44226b6d82b6f + languageName: node + linkType: hard + "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -13196,6 +13196,15 @@ __metadata: languageName: node linkType: hard +"pkg-up@npm:^2.0.0": + version: 2.0.0 + resolution: "pkg-up@npm:2.0.0" + dependencies: + find-up: "npm:^2.1.0" + checksum: 10/de4b418175281a082e366ce1a919f032520ee53cf421578b35173f03816f6ec4c19e1552066840bb0988c3e1215859653948efd6ca3507a23f4f44229269500d + languageName: node + linkType: hard + "possible-typed-array-names@npm:^1.0.0": version: 1.0.0 resolution: "possible-typed-array-names@npm:1.0.0" @@ -13203,6 +13212,28 @@ __metadata: languageName: node linkType: hard +"prebuild-install@npm:^7.1.1": + version: 7.1.2 + resolution: "prebuild-install@npm:7.1.2" + dependencies: + detect-libc: "npm:^2.0.0" + expand-template: "npm:^2.0.3" + github-from-package: "npm:0.0.0" + minimist: "npm:^1.2.3" + mkdirp-classic: "npm:^0.5.3" + napi-build-utils: "npm:^1.0.1" + node-abi: "npm:^3.3.0" + pump: "npm:^3.0.0" + rc: "npm:^1.2.7" + simple-get: "npm:^4.0.0" + tar-fs: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + bin: + prebuild-install: bin.js + checksum: 10/32d5c026cc978dd02762b9ad3c765178aee8383aeac4303fed3cd226eff53100db038d4791b03ae1ebc7d213a7af392d26e32095579cedb8dba1d00ad08ecd46 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -13210,24 +13241,6 @@ __metadata: languageName: node linkType: hard -"prelude-ls@npm:~1.1.2": - version: 1.1.2 - resolution: "prelude-ls@npm:1.1.2" - checksum: 10/946a9f60d3477ca6b7d4c5e8e452ad1b98dc8aaa992cea939a6b926ac16cc4129d7217c79271dc808b5814b1537ad0af37f29a942e2eafbb92cfc5a1c87c38cb - languageName: node - linkType: hard - -"pretty-format@npm:^27.0.0, pretty-format@npm:^27.5.1": - version: 27.5.1 - resolution: "pretty-format@npm:27.5.1" - dependencies: - ansi-regex: "npm:^5.0.1" - ansi-styles: "npm:^5.0.0" - react-is: "npm:^17.0.1" - checksum: 10/248990cbef9e96fb36a3e1ae6b903c551ca4ddd733f8d0912b9cc5141d3d0b3f9f8dfb4d799fb1c6723382c9c2083ffbfa4ad43ff9a0e7535d32d41fd5f01da6 - languageName: node - linkType: hard - "pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" @@ -13258,7 +13271,7 @@ __metadata: languageName: node linkType: hard -"prom-client@npm:^13.2.0": +"prom-client@npm:13.2.0": version: 13.2.0 resolution: "prom-client@npm:13.2.0" dependencies: @@ -13308,41 +13321,18 @@ __metadata: languageName: node linkType: hard -"proto3-json-serializer@npm:^1.0.0": - version: 1.1.1 - resolution: "proto3-json-serializer@npm:1.1.1" - dependencies: - protobufjs: "npm:^7.0.0" - checksum: 10/20c5d28b6e8f4100fbae1eb78ae89019de1f6f19c352366f931d2a1c25ef48c1cfe0bbdb870e484bd8b3a0ea614295b9790e72655f0930ab445c7e10d1d99cec - languageName: node - linkType: hard - -"protobufjs-cli@npm:1.1.1": - version: 1.1.1 - resolution: "protobufjs-cli@npm:1.1.1" +"proto3-json-serializer@npm:^2.0.2": + version: 2.0.2 + resolution: "proto3-json-serializer@npm:2.0.2" dependencies: - chalk: "npm:^4.0.0" - escodegen: "npm:^1.13.0" - espree: "npm:^9.0.0" - estraverse: "npm:^5.1.0" - glob: "npm:^8.0.0" - jsdoc: "npm:^4.0.0" - minimist: "npm:^1.2.0" - semver: "npm:^7.1.2" - tmp: "npm:^0.2.1" - uglify-js: "npm:^3.7.7" - peerDependencies: - protobufjs: ^7.0.0 - bin: - pbjs: bin/pbjs - pbts: bin/pbts - checksum: 10/8c8672b1f2e0b1e9d33d98059f5d02adf94430d21df53fd307180a7bda69a6eb0546d51b3aa5c4814c9b6ba9fcc1a3a779f8b8a3a73e831e2ca1eb5606ecc23a + protobufjs: "npm:^7.2.5" + checksum: 10/d588337f9a24a94ac14a456261af48ea07e6d0a8a00faebb0b689e79e83925383b9d3ea713184d6336d0bb743dd803f188710e3e8fbfb316586cd1e3f7862a56 languageName: node linkType: hard -"protobufjs@npm:7.2.4": - version: 7.2.4 - resolution: "protobufjs@npm:7.2.4" +"protobufjs@npm:^7.2.5": + version: 7.2.5 + resolution: "protobufjs@npm:7.2.5" dependencies: "@protobufjs/aspromise": "npm:^1.1.2" "@protobufjs/base64": "npm:^1.1.2" @@ -13356,13 +13346,13 @@ __metadata: "@protobufjs/utf8": "npm:^1.1.0" "@types/node": "npm:>=13.7.0" long: "npm:^5.0.0" - checksum: 10/6972bd0a372abdbd43e20e14e9692695b92adcd0b746e73e8deb8880ce78abe4a30303a05160f5d0a5fc3dd0b7b6157cc8a06418da364fc7091f965724ca0443 + checksum: 10/6c5aa62b61dff843f585f3acd9cb7a82d566de2dbf167a300b39afee91b04298c4b4aec61354b7c00308b40596f5f3f4b07d6246cfb4ee0abeaea25101033315 languageName: node linkType: hard -"protobufjs@npm:^7.0.0, protobufjs@npm:^7.2.4, protobufjs@npm:^7.2.5": - version: 7.2.5 - resolution: "protobufjs@npm:7.2.5" +"protobufjs@npm:^7.2.6, protobufjs@npm:^7.3.2": + version: 7.4.0 + resolution: "protobufjs@npm:7.4.0" dependencies: "@protobufjs/aspromise": "npm:^1.1.2" "@protobufjs/base64": "npm:^1.1.2" @@ -13376,7 +13366,7 @@ __metadata: "@protobufjs/utf8": "npm:^1.1.0" "@types/node": "npm:>=13.7.0" long: "npm:^5.0.0" - checksum: 10/6c5aa62b61dff843f585f3acd9cb7a82d566de2dbf167a300b39afee91b04298c4b4aec61354b7c00308b40596f5f3f4b07d6246cfb4ee0abeaea25101033315 + checksum: 10/408423506610f70858d7593632f4a6aa4f05796c90fd632be9b9252457c795acc71aa6d3b54bb7f48a890141728fee4ca3906723ccea6c202ad71f21b3879b8b languageName: node linkType: hard @@ -13387,13 +13377,6 @@ __metadata: languageName: node linkType: hard -"pseudomap@npm:^1.0.1": - version: 1.0.2 - resolution: "pseudomap@npm:1.0.2" - checksum: 10/856c0aae0ff2ad60881168334448e898ad7a0e45fe7386d114b150084254c01e200c957cf378378025df4e052c7890c5bd933939b0e0d2ecfcc1dc2f0b2991f5 - languageName: node - linkType: hard - "pump@npm:^3.0.0": version: 3.0.0 resolution: "pump@npm:3.0.0" @@ -13471,10 +13454,17 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^17.0.1": - version: 17.0.2 - resolution: "react-is@npm:17.0.2" - checksum: 10/73b36281e58eeb27c9cc6031301b6ae19ecdc9f18ae2d518bdb39b0ac564e65c5779405d623f1df9abf378a13858b79442480244bd579968afc1faf9a2ce5e05 +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 10/5c4d72ae7eec44357171585938c85ce066da8ca79146b5635baf3d55d74584c92575fa4e2c9eac03efbed3b46a0b2e7c30634c012b4b4fa40d654353d3c163eb languageName: node linkType: hard @@ -13485,6 +13475,16 @@ __metadata: languageName: node linkType: hard +"read-pkg-up@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg-up@npm:3.0.0" + dependencies: + find-up: "npm:^2.0.0" + read-pkg: "npm:^3.0.0" + checksum: 10/16175573f2914ab9788897bcbe2a62b5728d0075e62285b3680cebe97059e2911e0134a062cf6e51ebe3e3775312bc788ac2039ed6af38ec68d2c10c6f2b30fb + languageName: node + linkType: hard + "read-pkg@npm:^3.0.0": version: 3.0.0 resolution: "read-pkg@npm:3.0.0" @@ -13587,7 +13587,7 @@ __metadata: languageName: node linkType: hard -"redis@npm:^3.1.2": +"redis@npm:3.1.2": version: 3.1.2 resolution: "redis@npm:3.1.2" dependencies: @@ -13636,15 +13636,6 @@ __metadata: languageName: node linkType: hard -"requizzle@npm:^0.2.3": - version: 0.2.4 - resolution: "requizzle@npm:0.2.4" - dependencies: - lodash: "npm:^4.17.21" - checksum: 10/b13ce6d2a45d46be84ab274422b08a3233119e41ea5e1c8cef814abced2e25d15b7d4b995ef5d419f3dc6537314e6b1ba4a5c84d998d4143cf9938a67fc63587 - languageName: node - linkType: hard - "resolve-alpn@npm:^1.0.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" @@ -13734,13 +13725,14 @@ __metadata: languageName: node linkType: hard -"retry-request@npm:^5.0.0": - version: 5.0.2 - resolution: "retry-request@npm:5.0.2" +"retry-request@npm:^7.0.0": + version: 7.0.2 + resolution: "retry-request@npm:7.0.2" dependencies: - debug: "npm:^4.1.1" + "@types/request": "npm:^2.48.8" extend: "npm:^3.0.2" - checksum: 10/d5045fae567337920ec0d2d5b0206ebf138ca91b5ebcdeca5f084a2d18884dcc5d2a7e1ec7703e3be88b6a2d28dffb7c1ce3eb65bf355821dc40bedda35b2ee2 + teeny-request: "npm:^9.0.0" + checksum: 10/8f4c927d41dd575fc460aad7b762fb0a33542097201c3c1a31529ad17fa8af3ac0d2a45bf4a2024d079913e9c2dd431566070fe33321c667ac87ebb400de5917 languageName: node linkType: hard @@ -13765,7 +13757,7 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": +"rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" dependencies: @@ -13776,7 +13768,7 @@ __metadata: languageName: node linkType: hard -"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1, ripemd160@npm:^2.0.2": +"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": version: 2.0.2 resolution: "ripemd160@npm:2.0.2" dependencies: @@ -13957,7 +13949,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": +"semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -13966,25 +13958,25 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" +"semver@npm:^7.3.2": + version: 7.6.0 + resolution: "semver@npm:7.6.0" dependencies: lru-cache: "npm:^6.0.0" bin: semver: bin/semver.js - checksum: 10/985dec0d372370229a262c737063860fabd4a1c730662c1ea3200a2f649117761a42184c96df62a0e885e76fbd5dace41087d6c1ac0351b13c0df5d6bcb1b5ac + checksum: 10/1b41018df2d8aca5a1db4729985e8e20428c650daea60fcd16e926e9383217d00f574fab92d79612771884a98d2ee2a1973f49d630829a8d54d6570defe62535 languageName: node linkType: hard -"semver@npm:^7.3.2": - version: 7.6.0 - resolution: "semver@npm:7.6.0" +"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" dependencies: lru-cache: "npm:^6.0.0" bin: semver: bin/semver.js - checksum: 10/1b41018df2d8aca5a1db4729985e8e20428c650daea60fcd16e926e9383217d00f574fab92d79612771884a98d2ee2a1973f49d630829a8d54d6570defe62535 + checksum: 10/985dec0d372370229a262c737063860fabd4a1c730662c1ea3200a2f649117761a42184c96df62a0e885e76fbd5dace41087d6c1ac0351b13c0df5d6bcb1b5ac languageName: node linkType: hard @@ -13995,7 +13987,7 @@ __metadata: languageName: node linkType: hard -"sequelize-cli@npm:^6.6.1": +"sequelize-cli@npm:6.6.1": version: 6.6.1 resolution: "sequelize-cli@npm:6.6.1" dependencies: @@ -14038,7 +14030,7 @@ __metadata: languageName: node linkType: hard -"sequelize@npm:^6.33.0": +"sequelize@npm:6.33.0": version: 6.33.0 resolution: "sequelize@npm:6.33.0" dependencies: @@ -14133,17 +14125,30 @@ __metadata: languageName: node linkType: hard -"serverless-api-gateway-throttling@npm:^1.1.1": - version: 1.2.2 - resolution: "serverless-api-gateway-throttling@npm:1.2.2" +"serverless-api-gateway-throttling@npm:2.0.3": + version: 2.0.3 + resolution: "serverless-api-gateway-throttling@npm:2.0.3" dependencies: lodash.get: "npm:^4.4.2" lodash.isempty: "npm:^4.4.0" - checksum: 10/53bef6ce08a18423affa434aa3330d1a8fafbaae24b657e0f22d30d0f69dc9ddc471ce36cb19f34328f2ebbda54d5ebabb469a79c07b091bc3452fec236079fd + checksum: 10/f8b275ab3312f9504a72bc57d67068b949e7e95dfbafae661fb91355237047cd17aa07078086e2771c494b056f4c81c630431de24f0864738cb87e0299fa8ddb languageName: node linkType: hard -"serverless-iam-roles-per-function@npm:^3.2.0": +"serverless-better-credentials@npm:2.0.0": + version: 2.0.0 + resolution: "serverless-better-credentials@npm:2.0.0" + dependencies: + open: "npm:^8.4.2" + peerDependencies: + "@serverless/utils": ^6.0.2 + aws-sdk: ^2.567.0 + serverless: ^2 || ^3 + checksum: 10/87f15aa9460c41d3cc3cf37dbc47a28fe5d654e73d82d46c250bf665cd21de59878091605b952a9f33f69e60024828f96c9f204377fd3de738fe6a63ff9ea9c0 + languageName: node + linkType: hard + +"serverless-iam-roles-per-function@npm:3.2.0": version: 3.2.0 resolution: "serverless-iam-roles-per-function@npm:3.2.0" dependencies: @@ -14152,20 +14157,20 @@ __metadata: languageName: node linkType: hard -"serverless-mysql@npm:^1.5.4": - version: 1.5.5 - resolution: "serverless-mysql@npm:1.5.5" +"serverless-mysql@npm:1.5.4": + version: 1.5.4 + resolution: "serverless-mysql@npm:1.5.4" dependencies: "@types/mysql": "npm:^2.15.6" mysql: "npm:^2.18.1" dependenciesMeta: "@types/mysql": optional: true - checksum: 10/1316056aa3d0651e1825bb4e1e19d30615c45a4bb715fdb313c896573004cd11ce9cdc85ed8e19c9fd0d0280f8f64604aab07a94f544198ddb5b6c7ebd337984 + checksum: 10/b978db819a58f367eb680629e95f5364625a367ef587c3675f53cb485e2abac74656e27dd60858d7979621a6f0fed8564f7fc4415efc7e8ea13ce2bbc91d2bbc languageName: node linkType: hard -"serverless-offline@npm:^13.1.2": +"serverless-offline@npm:13.1.2": version: 13.1.2 resolution: "serverless-offline@npm:13.1.2" dependencies: @@ -14199,7 +14204,7 @@ __metadata: languageName: node linkType: hard -"serverless-plugin-aws-alerts@npm:^1.7.5": +"serverless-plugin-aws-alerts@npm:1.7.5": version: 1.7.5 resolution: "serverless-plugin-aws-alerts@npm:1.7.5" dependencies: @@ -14214,7 +14219,7 @@ __metadata: languageName: node linkType: hard -"serverless-plugin-monorepo@npm:^0.11.0": +"serverless-plugin-monorepo@npm:0.11.0": version: 0.11.0 resolution: "serverless-plugin-monorepo@npm:0.11.0" dependencies: @@ -14225,14 +14230,14 @@ __metadata: languageName: node linkType: hard -"serverless-plugin-warmup@npm:^8.2.1": +"serverless-plugin-warmup@npm:8.2.1": version: 8.2.1 resolution: "serverless-plugin-warmup@npm:8.2.1" checksum: 10/9404bd15f9f5456ad088c179ae8bba30a58fd89ba6f453f69a4ca20773beb904097e4b12cff9c9cd6aaa6cd178fd31b305f1552e84ac90c463aa4ecaf7912c9c languageName: node linkType: hard -"serverless-prune-plugin@npm:^2.0.2": +"serverless-prune-plugin@npm:2.0.2": version: 2.0.2 resolution: "serverless-prune-plugin@npm:2.0.2" dependencies: @@ -14243,7 +14248,7 @@ __metadata: languageName: node linkType: hard -"serverless-webpack@npm:^5.13.0": +"serverless-webpack@npm:5.13.0": version: 5.13.0 resolution: "serverless-webpack@npm:5.13.0" dependencies: @@ -14273,7 +14278,7 @@ __metadata: languageName: node linkType: hard -"serverless@npm:^3.35.2": +"serverless@npm:3.35.2": version: 3.35.2 resolution: "serverless@npm:3.35.2" dependencies: @@ -14453,7 +14458,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10/a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 @@ -14467,6 +14472,24 @@ __metadata: languageName: node linkType: hard +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 10/4d211042cc3d73a718c21ac6c4e7d7a0363e184be6a5ad25c8a1502e49df6d0a0253979e3d50dbdd3f60ef6c6c58d756b5d66ac1e05cda9cacd2e9fc59e3876a + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: "npm:^6.0.0" + once: "npm:^1.3.1" + simple-concat: "npm:^1.0.0" + checksum: 10/93f1b32319782f78f2f2234e9ce34891b7ab6b990d19d8afefaa44423f5235ce2676aae42d6743fecac6c8dfff4b808d4c24fe5265be813d04769917a9a44f36 + languageName: node + linkType: hard + "simple-git@npm:^3.16.0": version: 3.20.0 resolution: "simple-git@npm:3.20.0" @@ -14575,7 +14598,17 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:^0.5.19, source-map-support@npm:~0.5.20": +"source-map-support@npm:0.5.19": + version: 0.5.19 + resolution: "source-map-support@npm:0.5.19" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10/5a30564f9dceef1c72101923bd05be1a0b7ec6a3afe205ca09b73133999966cb651dd0c2b9b011f78919e9488e4633929cfd5634a4a0a98a0e2f5115c1e3fe76 + languageName: node + linkType: hard + +"source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -14585,7 +14618,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10/59ef7462f1c29d502b3057e822cdbdae0b0e565302c4dd1a95e11e793d8d9d62006cdc10e0fd99163ca33ff2071360cf50ee13f90440806e7ed57d81cba2f7ff @@ -14651,13 +14684,14 @@ __metadata: languageName: node linkType: hard -"sqlite3@npm:^5.0.2": - version: 5.1.6 - resolution: "sqlite3@npm:5.1.6" +"sqlite3@npm:5.1.7": + version: 5.1.7 + resolution: "sqlite3@npm:5.1.7" dependencies: - "@mapbox/node-pre-gyp": "npm:^1.0.0" - node-addon-api: "npm:^4.2.0" + bindings: "npm:^1.5.0" + node-addon-api: "npm:^7.0.0" node-gyp: "npm:8.x" + prebuild-install: "npm:^7.1.1" tar: "npm:^6.1.11" peerDependencies: node-gyp: 8.x @@ -14667,7 +14701,7 @@ __metadata: peerDependenciesMeta: node-gyp: optional: true - checksum: 10/343ffefb69c044f256043b5945a91b723b26b9c1ad55eba896e8895a12303307cfd931f00ebe1d39a2b5d475acdf3c4f877539de59877ddc85a22fb9f4c5755d + checksum: 10/84b1183d39791b00bc9d9aa6f0d74738084c9447e7cff7cf3cc2fa7458474159e1272eed675cd3a5c6c5100e97557578dbf0e77082f1043ab6356e6446314e32 languageName: node linkType: hard @@ -14753,6 +14787,13 @@ __metadata: languageName: node linkType: hard +"stream-shift@npm:^1.0.2": + version: 1.0.3 + resolution: "stream-shift@npm:1.0.3" + checksum: 10/a24c0a3f66a8f9024bd1d579a533a53be283b4475d4e6b4b3211b964031447bdf6532dd1f3c2b0ad66752554391b7c62bd7ca4559193381f766534e723d50242 + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -14936,13 +14977,20 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 10/492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 languageName: node linkType: hard +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10/1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 + languageName: node + linkType: hard + "strip-outer@npm:^1.0.1": version: 1.0.1 resolution: "strip-outer@npm:1.0.1" @@ -15044,33 +15092,33 @@ __metadata: dependencies: "@aws-sdk/client-lambda": "npm:3.540.0" "@aws-sdk/client-sqs": "npm:3.540.0" - "@types/jest": "npm:^29.5.4" - "@types/lodash": "npm:^4.14.199" - "@types/mysql": "npm:^2.15.21" - "@types/node": "npm:^17.0.45" - "@types/ws": "npm:^8.5.5" - "@typescript-eslint/eslint-plugin": "npm:^6.7.3" - "@typescript-eslint/parser": "npm:^6.7.3" - assert: "npm:^2.1.0" - aws-sdk: "npm:^2.1454.0" - axios: "npm:^1.6.2" - dotenv: "npm:^8.2.0" - eslint: "npm:^9.3.0" - eslint-config-airbnb-base: "npm:^15.0.0" - eslint-plugin-import: "npm:^2.29.1" - eslint-plugin-jest: "npm:^27.4.0" - jest: "npm:^29.6.4" - lodash: "npm:^4.17.21" - mysql2: "npm:^3.5.2" - sequelize: "npm:^6.33.0" - sequelize-cli: "npm:^6.6.1" - ts-jest: "npm:^29.1.1" - tslib: "npm:^2.1.0" - typescript: "npm:^4.9.5" - websocket: "npm:^1.0.33" - winston: "npm:^3.13.0" - ws: "npm:^8.13.0" - xstate: "npm:^4.38.2" + "@types/jest": "npm:29.5.4" + "@types/lodash": "npm:4.14.199" + "@types/mysql": "npm:2.15.21" + "@types/node": "npm:17.0.45" + "@types/ws": "npm:8.5.5" + "@typescript-eslint/eslint-plugin": "npm:6.7.3" + "@typescript-eslint/parser": "npm:6.7.3" + assert: "npm:2.1.0" + aws-sdk: "npm:2.1454.0" + axios: "npm:1.6.2" + dotenv: "npm:8.2.0" + eslint: "npm:9.3.0" + eslint-config-airbnb-base: "npm:15.0.0" + eslint-plugin-import: "npm:2.29.1" + eslint-plugin-jest: "npm:27.4.0" + jest: "npm:29.6.4" + lodash: "npm:4.17.21" + mysql2: "npm:3.5.2" + sequelize: "npm:6.33.0" + sequelize-cli: "npm:6.6.1" + ts-jest: "npm:29.1.1" + tslib: "npm:2.1.0" + typescript: "npm:4.9.5" + websocket: "npm:1.0.33" + winston: "npm:3.13.0" + ws: "npm:8.13.0" + xstate: "npm:4.38.2" peerDependencies: "@hathor/wallet-lib": 0.39.0 "@wallet-service/common": 1.5.0 @@ -15084,6 +15132,18 @@ __metadata: languageName: node linkType: hard +"tar-fs@npm:^2.0.0": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: "npm:^1.1.1" + mkdirp-classic: "npm:^0.5.2" + pump: "npm:^3.0.0" + tar-stream: "npm:^2.1.4" + checksum: 10/526deae025453e825f87650808969662fbb12eb0461d033e9b447de60ec951c6c4607d0afe7ce057defe9d4e45cf80399dd74bc15f9d9e0773d5e990a78ce4ac + languageName: node + linkType: hard + "tar-stream@npm:^1.5.2": version: 1.6.2 resolution: "tar-stream@npm:1.6.2" @@ -15099,7 +15159,7 @@ __metadata: languageName: node linkType: hard -"tar-stream@npm:^2.2.0": +"tar-stream@npm:^2.1.4, tar-stream@npm:^2.2.0": version: 2.2.0 resolution: "tar-stream@npm:2.2.0" dependencies: @@ -15112,7 +15172,21 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.0.2, tar@npm:^6.1.11, tar@npm:^6.1.15, tar@npm:^6.1.2": +"tar@npm:^6.0.2": + version: 6.2.1 + resolution: "tar@npm:6.2.1" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 10/bfbfbb2861888077fc1130b84029cdc2721efb93d1d1fb80f22a7ac3a98ec6f8972f29e564103bbebf5e97be67ebc356d37fa48dbc4960600a1eb7230fbd1ea0 + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.15, tar@npm:^6.1.2": version: 6.2.0 resolution: "tar@npm:6.2.0" dependencies: @@ -15135,16 +15209,16 @@ __metadata: languageName: node linkType: hard -"teeny-request@npm:^8.0.0": - version: 8.0.3 - resolution: "teeny-request@npm:8.0.3" +"teeny-request@npm:^9.0.0": + version: 9.0.0 + resolution: "teeny-request@npm:9.0.0" dependencies: http-proxy-agent: "npm:^5.0.0" https-proxy-agent: "npm:^5.0.0" - node-fetch: "npm:^2.6.1" + node-fetch: "npm:^2.6.9" stream-events: "npm:^1.0.5" uuid: "npm:^9.0.0" - checksum: 10/17c45c628e6fcfc702b4b3aad5fdf16907190a2b9b6cc760829fe56682720a521e267636888851edf0d4714d8d4b7e6378e54af6e979b4ce6075a230b9ffeb2d + checksum: 10/44daabb6c2e239c3daed0218ebdafb50c7141c16d7257a6cfef786dbff56d7853c2c02c97934f7ed57818ce5861ac16c5f52f3a16fa292bd4caf53483d386443 languageName: node linkType: hard @@ -15195,13 +15269,6 @@ __metadata: languageName: node linkType: hard -"text-decoding@npm:^1.0.0": - version: 1.0.0 - resolution: "text-decoding@npm:1.0.0" - checksum: 10/73c604f285d86d653815a5c32b86ffef9ffe27074bc3e5da3718ac46bba7c04775bb3da7b13c60e3a6525d1acce7cc3442b39e25a3a43f211c866ba9ba414207 - languageName: node - linkType: hard - "text-hex@npm:1.0.x": version: 1.0.0 resolution: "text-hex@npm:1.0.0" @@ -15240,7 +15307,16 @@ __metadata: languageName: node linkType: hard -"tiny-secp256k1@npm:^2.2.1, tiny-secp256k1@npm:^2.2.3": +"tiny-secp256k1@npm:2.2.1": + version: 2.2.1 + resolution: "tiny-secp256k1@npm:2.2.1" + dependencies: + uint8array-tools: "npm:0.0.7" + checksum: 10/8eb871e912c18d3282d9a6e4cf7f33e18548d48445b16d8381442529cbbf958bbaaa7912817898eadf896d2b8c631ddf3f212162e2305397d4260019d2e17418 + languageName: node + linkType: hard + +"tiny-secp256k1@npm:^2.2.3": version: 2.2.3 resolution: "tiny-secp256k1@npm:2.2.3" dependencies: @@ -15258,15 +15334,6 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.2.1": - version: 0.2.1 - resolution: "tmp@npm:0.2.1" - dependencies: - rimraf: "npm:^3.0.0" - checksum: 10/445148d72df3ce99356bc89a7857a0c5c3b32958697a14e50952c6f7cf0a8016e746ababe9a74c1aa52f04c526661992f14659eba34d3c6701d49ba2f3cf781b - languageName: node - linkType: hard - "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -15353,7 +15420,7 @@ __metadata: languageName: node linkType: hard -"ts-jest@npm:^29.1.1": +"ts-jest@npm:29.1.1": version: 29.1.1 resolution: "ts-jest@npm:29.1.1" dependencies: @@ -15386,7 +15453,7 @@ __metadata: languageName: node linkType: hard -"ts-jest@npm:^29.1.2": +"ts-jest@npm:29.1.2": version: 29.1.2 resolution: "ts-jest@npm:29.1.2" dependencies: @@ -15419,7 +15486,7 @@ __metadata: languageName: node linkType: hard -"ts-loader@npm:^9.4.4": +"ts-loader@npm:9.4.4": version: 9.4.4 resolution: "ts-loader@npm:9.4.4" dependencies: @@ -15472,19 +15539,7 @@ __metadata: languageName: node linkType: hard -"tsconfig-paths@npm:^3.14.2": - version: 3.14.2 - resolution: "tsconfig-paths@npm:3.14.2" - dependencies: - "@types/json5": "npm:^0.0.29" - json5: "npm:^1.0.2" - minimist: "npm:^1.2.6" - strip-bom: "npm:^3.0.0" - checksum: 10/17f23e98612a60cf23b80dc1d3b7b840879e41fcf603868fc3618a30f061ac7b463ef98cad8c28b68733b9bfe0cc40ffa2bcf29e94cf0d26e4f6addf7ac8527d - languageName: node - linkType: hard - -"tsconfig-paths@npm:^3.15.0": +"tsconfig-paths@npm:^3.15.0, tsconfig-paths@npm:^3.9.0": version: 3.15.0 resolution: "tsconfig-paths@npm:3.15.0" dependencies: @@ -15496,6 +15551,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:2.1.0": + version: 2.1.0 + resolution: "tslib@npm:2.1.0" + checksum: 10/15a0efbca455d7ce0bb2b7eaabbda70293082519e7d7f14b660d2fdb7a70c64f8dbd142067b1de25c84d4acc87922e699726cfe38864af92b056d14dcd01670f + languageName: node + linkType: hard + "tslib@npm:^1.11.1, tslib@npm:^1.8.1": version: 1.14.1 resolution: "tslib@npm:1.14.1" @@ -15521,6 +15583,15 @@ __metadata: languageName: node linkType: hard +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10/7f0d9ed5c22404072b2ae8edc45c071772affd2ed14a74f03b4e71b4dd1a14c3714d85aed64abcaaee5fec2efc79002ba81155c708f4df65821b444abb0cfade + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -15530,15 +15601,6 @@ __metadata: languageName: node linkType: hard -"type-check@npm:~0.3.2": - version: 0.3.2 - resolution: "type-check@npm:0.3.2" - dependencies: - prelude-ls: "npm:~1.1.2" - checksum: 10/11dec0b50d7c3fd2e630b4b074ba36918ed2b1efbc87dfbd40ba9429d49c58d12dad5c415ece69fcf358fa083f33466fc370f23ab91aa63295c45d38b3a60dda - languageName: node - linkType: hard - "type-detect@npm:4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" @@ -15710,7 +15772,17 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.9.3, typescript@npm:^4.9.5": +"typescript@npm:4.9.3": + version: 4.9.3 + resolution: "typescript@npm:4.9.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/dda600a5a37b945ad1fff76f0c874e7bfda3fd56cfc43b9f328780d602b6e7127b4342bbc6ad68ccf7bf6645047be329586ea1b393a80fb942d608a796aba0de + languageName: node + linkType: hard + +"typescript@npm:4.9.5": version: 4.9.5 resolution: "typescript@npm:4.9.5" bin: @@ -15720,7 +15792,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.4.3": +"typescript@npm:5.4.3": version: 5.4.3 resolution: "typescript@npm:5.4.3" bin: @@ -15730,7 +15802,17 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^4.9.3#optional!builtin, typescript@patch:typescript@npm%3A^4.9.5#optional!builtin": +"typescript@patch:typescript@npm%3A4.9.3#optional!builtin": + version: 4.9.3 + resolution: "typescript@patch:typescript@npm%3A4.9.3#optional!builtin::version=4.9.3&hash=a66ed4" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/cc7506c7cb5419b3e64bff50082307ed31d0de163ed6ccd9f418e94c364ebde2aba3f57087ac431805410855421917718a1a6ed85f46620cf03c87e86d1ce9c5 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A4.9.5#optional!builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587" bin: @@ -15740,7 +15822,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.4.3#optional!builtin": +"typescript@patch:typescript@npm%3A5.4.3#optional!builtin": version: 5.4.3 resolution: "typescript@patch:typescript@npm%3A5.4.3#optional!builtin::version=5.4.3&hash=d69c25" bin: @@ -15750,22 +15832,6 @@ __metadata: languageName: node linkType: hard -"uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5": - version: 1.0.6 - resolution: "uc.micro@npm:1.0.6" - checksum: 10/6898bb556319a38e9cf175e3628689347bd26fec15fc6b29fa38e0045af63075ff3fea4cf1fdba9db46c9f0cbf07f2348cd8844889dd31ebd288c29fe0d27e7a - languageName: node - linkType: hard - -"uglify-js@npm:^3.7.7": - version: 3.17.4 - resolution: "uglify-js@npm:3.17.4" - bin: - uglifyjs: bin/uglifyjs - checksum: 10/4c0b800e0ff192079d2c3ce8414fd3b656a570028c7c79af5c29c53d5c532b68bbcae4ad47307f89c2ee124d11826fff7a136b59d5c5bb18422bcdf5568afe1e - languageName: node - linkType: hard - "uint8array-tools@npm:0.0.7": version: 0.0.7 resolution: "uint8array-tools@npm:0.0.7" @@ -15804,13 +15870,6 @@ __metadata: languageName: node linkType: hard -"underscore@npm:~1.13.2": - version: 1.13.6 - resolution: "underscore@npm:1.13.6" - checksum: 10/58cf5dc42cb0ac99c146ae4064792c0a2cc84f3a3c4ad88f5082e79057dfdff3371d896d1ec20379e9ece2450d94fa78f2ef5bfefc199ba320653e32c009bd66 - languageName: node - linkType: hard - "undici-types@npm:~5.26.4": version: 5.26.5 resolution: "undici-types@npm:5.26.5" @@ -15818,6 +15877,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.19.8": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10/cf0b48ed4fc99baf56584afa91aaffa5010c268b8842f62e02f752df209e3dea138b372a60a963b3b2576ed932f32329ce7ddb9cb5f27a6c83040d8cd74b7a70 + languageName: node + linkType: hard + "uni-global@npm:^1.0.0": version: 1.0.0 resolution: "uni-global@npm:1.0.0" @@ -15956,7 +16022,25 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.0.0, uuid@npm:^8.3.0, uuid@npm:^8.3.2": +"uuid@npm:8.3.0": + version: 8.3.0 + resolution: "uuid@npm:8.3.0" + bin: + uuid: dist/bin/uuid + checksum: 10/a9760cd58e2cec7015d5e1a615f6c4ed8d0bf47574558fb49ccb7fd6021f50311cc8a091099ee1f9ead3e823b95f1a661be3b0dcdd5ff15cd8d4e23b53430308 + languageName: node + linkType: hard + +"uuid@npm:^11.0.2": + version: 11.0.3 + resolution: "uuid@npm:11.0.3" + bin: + uuid: dist/esm/bin/uuid + checksum: 10/251385563195709eb0697c74a834764eef28e1656d61174e35edbd129288acb4d95a43f4ce8a77b8c2fc128e2b55924296a0945f964b05b9173469d045625ff2 + languageName: node + linkType: hard + +"uuid@npm:^8.0.0, uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" bin: @@ -15965,7 +16049,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^9.0.0": +"uuid@npm:^9.0.0, uuid@npm:^9.0.1": version: 9.0.1 resolution: "uuid@npm:9.0.1" bin: @@ -16054,63 +16138,64 @@ __metadata: "@aws-sdk/client-apigatewaymanagementapi": "npm:3.540.0" "@aws-sdk/client-lambda": "npm:3.540.0" "@aws-sdk/client-sqs": "npm:3.540.0" - "@hathor/healthcheck-lib": "npm:^0.1.0" - "@middy/core": "npm:^2.5.7" - "@middy/http-cors": "npm:^2.5.7" - "@types/aws-lambda": "npm:^8.10.95" - "@types/jest": "npm:^27.0.24" - "@types/node": "npm:^18.0.4" - "@types/redis": "npm:^2.8.28" - "@typescript-eslint/eslint-plugin": "npm:^6.7.4" - "@typescript-eslint/parser": "npm:^3.3.0" - aws-lambda: "npm:^1.0.7" - axios: "npm:^0.21.1" - bip32: "npm:^3.0.1" - bitcoinjs-lib: "npm:^6.1.5" - bitcoinjs-message: "npm:^2.2.0" + "@hathor/healthcheck-lib": "npm:0.1.0" + "@middy/core": "npm:2.5.7" + "@middy/http-cors": "npm:2.5.7" + "@types/aws-lambda": "npm:8.10.95" + "@types/jest": "npm:^29.5.13" + "@types/node": "npm:18.0.4" + "@types/redis": "npm:2.8.28" + "@typescript-eslint/eslint-plugin": "npm:6.7.4" + "@typescript-eslint/parser": "npm:3.3.0" + aws-lambda: "npm:1.0.7" + axios: "npm:0.21.1" + bip32: "npm:3.0.1" + bitcoinjs-lib: "npm:6.1.5" + bitcoinjs-message: "npm:2.2.0" bitcore-lib: "npm:8.25.10" bitcore-mnemonic: "npm:8.25.10" - dotenv: "npm:^10.0.0" - eslint: "npm:^8.50.0" - eslint-config-airbnb-base: "npm:^14.2.1" - eslint-import-resolver-alias: "npm:^1.1.2" - eslint-plugin-import: "npm:^2.23.3" - eslint-plugin-jest: "npm:^23.13.2" - eslint-plugin-module-resolver: "npm:^0.16.0" - firebase-admin: "npm:^11.3.0" - fork-ts-checker-webpack-plugin: "npm:^9.0.0" - jest: "npm:^29.7.0" - joi: "npm:^17.4.0" - jsonwebtoken: "npm:^8.5.1" - lodash: "npm:^4.17.21" - mysql: "npm:^2.18.1" - mysql2: "npm:^2.2.5" - npm-run-all: "npm:^4.1.5" - prom-client: "npm:^13.2.0" - redis: "npm:^3.1.2" - serverless: "npm:^3.35.2" - serverless-api-gateway-throttling: "npm:^1.1.1" - serverless-iam-roles-per-function: "npm:^3.2.0" - serverless-mysql: "npm:^1.5.4" - serverless-offline: "npm:^13.1.2" - serverless-plugin-aws-alerts: "npm:^1.7.5" - serverless-plugin-monorepo: "npm:^0.11.0" - serverless-plugin-warmup: "npm:^8.2.1" - serverless-prune-plugin: "npm:^2.0.2" - serverless-webpack: "npm:^5.13.0" - source-map-support: "npm:^0.5.19" - sqlite3: "npm:^5.0.2" - tiny-secp256k1: "npm:^2.2.1" - ts-jest: "npm:^29.1.1" - ts-loader: "npm:^9.4.4" - typescript: "npm:^4.9.3" + dotenv: "npm:10.0.0" + eslint: "npm:8.50.0" + eslint-config-airbnb-base: "npm:14.2.1" + eslint-import-resolver-alias: "npm:1.1.2" + eslint-plugin-import: "npm:2.23.3" + eslint-plugin-jest: "npm:23.13.2" + eslint-plugin-module-resolver: "npm:0.16.0" + firebase-admin: "npm:13.0.0" + fork-ts-checker-webpack-plugin: "npm:9.0.0" + jest: "npm:29.7.0" + joi: "npm:17.4.0" + jsonwebtoken: "npm:8.5.1" + lodash: "npm:4.17.21" + mysql: "npm:2.18.1" + mysql2: "npm:2.2.5" + npm-run-all: "npm:4.1.5" + prom-client: "npm:13.2.0" + redis: "npm:3.1.2" + serverless: "npm:3.35.2" + serverless-api-gateway-throttling: "npm:2.0.3" + serverless-better-credentials: "npm:2.0.0" + serverless-iam-roles-per-function: "npm:3.2.0" + serverless-mysql: "npm:1.5.4" + serverless-offline: "npm:13.1.2" + serverless-plugin-aws-alerts: "npm:1.7.5" + serverless-plugin-monorepo: "npm:0.11.0" + serverless-plugin-warmup: "npm:8.2.1" + serverless-prune-plugin: "npm:2.0.2" + serverless-webpack: "npm:5.13.0" + source-map-support: "npm:0.5.19" + sqlite3: "npm:5.1.7" + tiny-secp256k1: "npm:2.2.1" + ts-jest: "npm:29.1.1" + ts-loader: "npm:9.4.4" + typescript: "npm:4.9.3" typescript-eslint: "npm:0.0.1-alpha.0" - uuid: "npm:^8.3.0" - webpack: "npm:^5.88.2" - webpack-node-externals: "npm:^3.0.0" - winston: "npm:^3.13.0" + uuid: "npm:8.3.0" + webpack: "npm:5.88.2" + webpack-node-externals: "npm:3.0.0" + winston: "npm:3.13.0" peerDependencies: - "@hathor/wallet-lib": ^0.39.0 + "@hathor/wallet-lib": 0.39.0 "@wallet-service/common": 1.5.0 languageName: unknown linkType: soft @@ -16141,7 +16226,7 @@ __metadata: languageName: node linkType: hard -"webpack-node-externals@npm:^3.0.0": +"webpack-node-externals@npm:3.0.0": version: 3.0.0 resolution: "webpack-node-externals@npm:3.0.0" checksum: 10/1a08102f73be2d6e787d16cf677f98c413076f35f379d64a4c83aa83769099b38091a4592953fac5b2eb0c7e3eb1977f6b901ef2cba531d458e32665314b8025 @@ -16155,7 +16240,7 @@ __metadata: languageName: node linkType: hard -"webpack@npm:^5.88.2": +"webpack@npm:5.88.2": version: 5.88.2 resolution: "webpack@npm:5.88.2" dependencies: @@ -16210,9 +16295,9 @@ __metadata: languageName: node linkType: hard -"websocket@npm:^1.0.33": - version: 1.0.34 - resolution: "websocket@npm:1.0.34" +"websocket@npm:1.0.33": + version: 1.0.33 + resolution: "websocket@npm:1.0.33" dependencies: bufferutil: "npm:^4.0.1" debug: "npm:^2.2.0" @@ -16220,7 +16305,7 @@ __metadata: typedarray-to-buffer: "npm:^3.1.5" utf-8-validate: "npm:^5.0.2" yaeti: "npm:^0.0.6" - checksum: 10/b72e3dcc3fa92b4a4511f0df89b25feed6ab06979cb9e522d2736f09855f4bf7588d826773b9405fcf3f05698200eb55ba9da7ef333584653d4912a5d3b13c18 + checksum: 10/d1046e2da09f891418ac55b597460acf079cba39a7f51fc29af8bf5c1d71c300736b261fe6e6f77571719c4e0082b7a416d1cb1eff3fde5f722081eaf62d20a9 languageName: node linkType: hard @@ -16295,7 +16380,7 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.2, wide-align@npm:^1.1.5": +"wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" dependencies: @@ -16333,7 +16418,7 @@ __metadata: languageName: node linkType: hard -"winston@npm:3.13.0, winston@npm:^3.13.0": +"winston@npm:3.13.0": version: 3.13.0 resolution: "winston@npm:3.13.0" dependencies: @@ -16361,13 +16446,6 @@ __metadata: languageName: node linkType: hard -"word-wrap@npm:~1.2.3": - version: 1.2.5 - resolution: "word-wrap@npm:1.2.5" - checksum: 10/1ec6f6089f205f83037be10d0c4b34c9183b0b63fca0834a5b3cee55dd321429d73d40bb44c8fc8471b5203d6e8f8275717f49a8ff4b2b0ab41d7e1b563e0854 - languageName: node - linkType: hard - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -16418,6 +16496,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:8.13.0": + version: 8.13.0 + resolution: "ws@npm:8.13.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10/1769532b6fdab9ff659f0b17810e7501831d34ecca23fd179ee64091dd93a51f42c59f6c7bb4c7a384b6c229aca8076fb312aa35626257c18081511ef62a161d + languageName: node + linkType: hard + "ws@npm:^7.2.1, ws@npm:^7.5.3, ws@npm:^7.5.9": version: 7.5.9 resolution: "ws@npm:7.5.9" @@ -16433,7 +16526,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.13.0, ws@npm:^8.14.2": +"ws@npm:^8.14.2": version: 8.14.2 resolution: "ws@npm:8.14.2" peerDependencies: @@ -16465,14 +16558,7 @@ __metadata: languageName: node linkType: hard -"xmlcreate@npm:^2.0.4": - version: 2.0.4 - resolution: "xmlcreate@npm:2.0.4" - checksum: 10/4b508f92848fcc05d98b5c0bee40242de327410dda3d16659bb9d3c88faeba26f4af793111ad443be673a60f300b9fd51a6349875c63f34bcbe61a321b94c7ef - languageName: node - linkType: hard - -"xstate@npm:^4.38.2": +"xstate@npm:4.38.2": version: 4.38.2 resolution: "xstate@npm:4.38.2" checksum: 10/76bbd8d2dd0de9f99376daf41654c3f162b8f14102ab1e7a44a13b05e21e50e6bdd5b3867ac8d252a367e438e3928f8e1b4c56f30fac19708b22167d3fd175b6 @@ -16500,13 +16586,6 @@ __metadata: languageName: node linkType: hard -"yallist@npm:^2.0.0": - version: 2.1.2 - resolution: "yallist@npm:2.1.2" - checksum: 10/75fc7bee4821f52d1c6e6021b91b3e079276f1a9ce0ad58da3c76b79a7e47d6f276d35e206a96ac16c1cf48daee38a8bb3af0b1522a3d11c8ffe18f898828832 - languageName: node - linkType: hard - "yallist@npm:^3.0.2": version: 3.1.1 resolution: "yallist@npm:3.1.1"