From 5d9a9f77d8b5acd439a4666c3f4f904b7209d354 Mon Sep 17 00:00:00 2001 From: Ivan Gusakov <74269317+larmork@users.noreply.github.com> Date: Mon, 9 Sep 2024 09:41:09 +0200 Subject: [PATCH 01/45] feat: csm-alerts initial commit --- csm-alerts/.dockerignore | 4 + csm-alerts/.env.sample | 13 + csm-alerts/.eslintignore | 2 + csm-alerts/.eslintrc.json | 14 + csm-alerts/.gitignore | 15 + csm-alerts/.prettierignore | 2 + csm-alerts/.prettierrc.json | 7 + csm-alerts/Dockerfile | 35 + csm-alerts/Makefile | 42 + csm-alerts/README.md | 126 + csm-alerts/alerts.yml | 10 + csm-alerts/alerts_tests.yml | 30 + csm-alerts/jest.config.js | 6 + csm-alerts/package-lock.json | 10501 ++++++++++++++++ csm-alerts/package.json | 86 + csm-alerts/src/brief/abi/CSAccounting.json | 2293 ++++ .../src/brief/abi/CSFeeDistributor.json | 849 ++ csm-alerts/src/brief/abi/CSFeeOracle.json | 1397 ++ csm-alerts/src/brief/abi/CSModule.json | 2996 +++++ csm-alerts/src/brief/abi/HashConsensus.json | 1 + csm-alerts/src/brief/abi/Lido.json | 871 ++ csm-alerts/src/brief/abi/ProxyShortABI.json | 28 + csm-alerts/src/brief/proto/agent.proto | 348 + csm-alerts/src/brief/proto/alert.proto | 179 + csm-alerts/src/clients/eth_provider.ts | 160 + csm-alerts/src/clients/mocks/mock.ts | 5 + csm-alerts/src/entity/events.ts | 99 + csm-alerts/src/entity/metadata.ts | 1 + csm-alerts/src/handlers/alert.handler.ts | 18 + csm-alerts/src/handlers/block.handler.ts | 103 + csm-alerts/src/handlers/health.handler.ts | 78 + csm-alerts/src/handlers/init.handler.ts | 93 + csm-alerts/src/handlers/tx.handler.ts | 82 + csm-alerts/src/main.ts | 241 + .../CSAccounting/CSAccounting.srv.spec.ts | 160 + .../services/CSAccounting/CSAccounting.srv.ts | 107 + .../CSAccounting.srv.spec.ts.snap | 227 + .../CSFeeDistributor.srv.spec.ts | 87 + .../CSFeeDistributor/CSFeeDistributor.srv.ts | 208 + .../CSFeeDistributor.srv.spec.ts.snap | 44 + .../CSFeeOracle/CSFeeOracle.srv.spec.ts | 205 + .../services/CSFeeOracle/CSFeeOracle.srv.ts | 236 + .../CSFeeOracle.srv.spec.ts.snap | 481 + .../src/services/CSModule/CSModule.srv.ts | 74 + .../ProxyWatcher/ProxyWatcher.srv.spec.ts | 168 + .../services/ProxyWatcher/ProxyWatcher.srv.ts | 72 + .../ProxyWatcher.srv.spec.ts.snap | 511 + .../health-checker/health-checker.srv.spec.ts | 69 + .../health-checker/health-checker.srv.ts | 78 + csm-alerts/src/utils/constants.holesky.ts | 141 + csm-alerts/src/utils/constants.mainnet.ts | 143 + csm-alerts/src/utils/constants.ts | 8 + csm-alerts/src/utils/env/env.ts | 43 + csm-alerts/src/utils/errors.ts | 54 + .../utils/events/asset_recoverer_events.ts | 81 + .../src/utils/events/cs_accounting_events.ts | 56 + .../utils/events/cs_fee_distributor_events.ts | 26 + .../src/utils/events/cs_fee_oracle_events.ts | 175 + .../src/utils/events/mocks/events.mock.ts | 19 + .../src/utils/events/ossified_proxy_events.ts | 55 + .../src/utils/events/pausable_events.ts | 36 + csm-alerts/src/utils/metrics/metrics.ts | 88 + csm-alerts/src/utils/mutex.ts | 32 + csm-alerts/src/utils/string.ts | 15 + csm-alerts/src/utils/time.ts | 32 + csm-alerts/src/utils/utils.ts | 17 + csm-alerts/src/utils/version.ts | 27 + csm-alerts/tools/go.mod | 173 + csm-alerts/tools/go.sum | 969 ++ csm-alerts/tools/tools.go | 10 + csm-alerts/tsconfig.json | 15 + csm-alerts/yarn.lock | 5723 +++++++++ 72 files changed, 31400 insertions(+) create mode 100644 csm-alerts/.dockerignore create mode 100644 csm-alerts/.env.sample create mode 100644 csm-alerts/.eslintignore create mode 100644 csm-alerts/.eslintrc.json create mode 100644 csm-alerts/.gitignore create mode 100644 csm-alerts/.prettierignore create mode 100644 csm-alerts/.prettierrc.json create mode 100644 csm-alerts/Dockerfile create mode 100644 csm-alerts/Makefile create mode 100644 csm-alerts/README.md create mode 100644 csm-alerts/alerts.yml create mode 100644 csm-alerts/alerts_tests.yml create mode 100644 csm-alerts/jest.config.js create mode 100644 csm-alerts/package-lock.json create mode 100644 csm-alerts/package.json create mode 100644 csm-alerts/src/brief/abi/CSAccounting.json create mode 100644 csm-alerts/src/brief/abi/CSFeeDistributor.json create mode 100644 csm-alerts/src/brief/abi/CSFeeOracle.json create mode 100644 csm-alerts/src/brief/abi/CSModule.json create mode 100644 csm-alerts/src/brief/abi/HashConsensus.json create mode 100644 csm-alerts/src/brief/abi/Lido.json create mode 100644 csm-alerts/src/brief/abi/ProxyShortABI.json create mode 100644 csm-alerts/src/brief/proto/agent.proto create mode 100644 csm-alerts/src/brief/proto/alert.proto create mode 100644 csm-alerts/src/clients/eth_provider.ts create mode 100644 csm-alerts/src/clients/mocks/mock.ts create mode 100644 csm-alerts/src/entity/events.ts create mode 100644 csm-alerts/src/entity/metadata.ts create mode 100644 csm-alerts/src/handlers/alert.handler.ts create mode 100644 csm-alerts/src/handlers/block.handler.ts create mode 100644 csm-alerts/src/handlers/health.handler.ts create mode 100644 csm-alerts/src/handlers/init.handler.ts create mode 100644 csm-alerts/src/handlers/tx.handler.ts create mode 100644 csm-alerts/src/main.ts create mode 100644 csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts create mode 100644 csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts create mode 100644 csm-alerts/src/services/CSAccounting/__snapshots__/CSAccounting.srv.spec.ts.snap create mode 100644 csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts create mode 100644 csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts create mode 100644 csm-alerts/src/services/CSFeeDistributor/__snapshots__/CSFeeDistributor.srv.spec.ts.snap create mode 100644 csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts create mode 100644 csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts create mode 100644 csm-alerts/src/services/CSFeeOracle/__snapshots__/CSFeeOracle.srv.spec.ts.snap create mode 100644 csm-alerts/src/services/CSModule/CSModule.srv.ts create mode 100644 csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.spec.ts create mode 100644 csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.ts create mode 100644 csm-alerts/src/services/ProxyWatcher/__snapshots__/ProxyWatcher.srv.spec.ts.snap create mode 100644 csm-alerts/src/services/health-checker/health-checker.srv.spec.ts create mode 100644 csm-alerts/src/services/health-checker/health-checker.srv.ts create mode 100644 csm-alerts/src/utils/constants.holesky.ts create mode 100644 csm-alerts/src/utils/constants.mainnet.ts create mode 100644 csm-alerts/src/utils/constants.ts create mode 100644 csm-alerts/src/utils/env/env.ts create mode 100644 csm-alerts/src/utils/errors.ts create mode 100644 csm-alerts/src/utils/events/asset_recoverer_events.ts create mode 100644 csm-alerts/src/utils/events/cs_accounting_events.ts create mode 100644 csm-alerts/src/utils/events/cs_fee_distributor_events.ts create mode 100644 csm-alerts/src/utils/events/cs_fee_oracle_events.ts create mode 100644 csm-alerts/src/utils/events/mocks/events.mock.ts create mode 100644 csm-alerts/src/utils/events/ossified_proxy_events.ts create mode 100644 csm-alerts/src/utils/events/pausable_events.ts create mode 100644 csm-alerts/src/utils/metrics/metrics.ts create mode 100644 csm-alerts/src/utils/mutex.ts create mode 100644 csm-alerts/src/utils/string.ts create mode 100644 csm-alerts/src/utils/time.ts create mode 100644 csm-alerts/src/utils/utils.ts create mode 100644 csm-alerts/src/utils/version.ts create mode 100644 csm-alerts/tools/go.mod create mode 100644 csm-alerts/tools/go.sum create mode 100644 csm-alerts/tools/tools.go create mode 100644 csm-alerts/tsconfig.json create mode 100644 csm-alerts/yarn.lock diff --git a/csm-alerts/.dockerignore b/csm-alerts/.dockerignore new file mode 100644 index 000000000..df4f0900f --- /dev/null +++ b/csm-alerts/.dockerignore @@ -0,0 +1,4 @@ +node_modules/ +dist/ +forta.config.json +generated diff --git a/csm-alerts/.env.sample b/csm-alerts/.env.sample new file mode 100644 index 000000000..e00cc6bad --- /dev/null +++ b/csm-alerts/.env.sample @@ -0,0 +1,13 @@ +APP_NAME=csm-alerts +INSTANCE=forta + +HTTP_PORT=3000 +LOG_FORMAT=simple +LOG_LEVEL=debug +ETHEREUM_RPC_URL=https://holesky.drpc.org +USE_FORTA_RPC_URL=true + +## FORTA compatible env names +NODE_ENV=local +AGENT_GRPC_PORT=50051 +FORTA_CHAIN_ID=17000 \ No newline at end of file diff --git a/csm-alerts/.eslintignore b/csm-alerts/.eslintignore new file mode 100644 index 000000000..a096acf71 --- /dev/null +++ b/csm-alerts/.eslintignore @@ -0,0 +1,2 @@ +generated +proto \ No newline at end of file diff --git a/csm-alerts/.eslintrc.json b/csm-alerts/.eslintrc.json new file mode 100644 index 000000000..1262ce136 --- /dev/null +++ b/csm-alerts/.eslintrc.json @@ -0,0 +1,14 @@ +{ + "parser": "@typescript-eslint/parser", + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"], + "plugins": ["@typescript-eslint", "prettier"], + "env": { + "node": true, + "es6": true + }, + "rules": { + "prettier/prettier": "error", + "curly": "error", + "semi": "off" + } +} diff --git a/csm-alerts/.gitignore b/csm-alerts/.gitignore new file mode 100644 index 000000000..1d4d3cc06 --- /dev/null +++ b/csm-alerts/.gitignore @@ -0,0 +1,15 @@ +node_modules +dist +forta.config.json +generated +.yarn/* +!.yarn/releases/ +*.log +version.json +.DS_Store +/coverage/ + +tools/vendor +bin + +.env \ No newline at end of file diff --git a/csm-alerts/.prettierignore b/csm-alerts/.prettierignore new file mode 100644 index 000000000..a096acf71 --- /dev/null +++ b/csm-alerts/.prettierignore @@ -0,0 +1,2 @@ +generated +proto \ No newline at end of file diff --git a/csm-alerts/.prettierrc.json b/csm-alerts/.prettierrc.json new file mode 100644 index 000000000..852349dd9 --- /dev/null +++ b/csm-alerts/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "semi": false, + "trailingComma": "all", + "singleQuote": true, + "printWidth": 120, + "tabWidth": 2 +} diff --git a/csm-alerts/Dockerfile b/csm-alerts/Dockerfile new file mode 100644 index 000000000..aaec8f0e0 --- /dev/null +++ b/csm-alerts/Dockerfile @@ -0,0 +1,35 @@ +# Build stage: compile Typescript to Javascript +FROM node:20.10.0-alpine3.18 AS base + +RUN apk add --no-cache python3=3.11.8-r0 g++=12.2.1_git20220924-r10 make=4.4.1-r1 + +FROM base AS builder + +WORKDIR /app + +COPY . . +RUN yarn install --immutable && yarn run build + +# Final stage: copy compiled Javascript from previous stage and install production dependencies +FROM base AS production +LABEL "network.forta.settings.agent-logs.enable"="true" + +ENV APP_NAME=csm-alerts +ENV NODE_ENV=production +ENV ETHEREUM_RPC_URL=https://holesky.drpc.org + +ENV AGENT_GRPC_PORT=50051 +ENV HTTP_PORT=3000 +ENV LOG_FORMAT=simple +ENV LOG_LEVEL=info +ENV INSTANCE=forta +ENV USE_FORTA_RPC_URL=true + +WORKDIR /app + +COPY package*.json yarn.lock ./ +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/dist ./src +COPY version.json ./ + +CMD ["yarn", "run", "start:docker:prod"] \ No newline at end of file diff --git a/csm-alerts/Makefile b/csm-alerts/Makefile new file mode 100644 index 000000000..8b12e9335 --- /dev/null +++ b/csm-alerts/Makefile @@ -0,0 +1,42 @@ +# Makefile + +.PHONY: gen_proto_prod +gen_proto_prod: + # generate js codes via grpc-tools + yarn grpc_tools_node_protoc \ + --js_out=import_style=commonjs,binary:./dist/generated/proto \ + --grpc_out=grpc_js:./dist/generated/proto \ + --plugin=protoc-gen-grpc=./node_modules/.bin/grpc_tools_node_protoc_plugin \ + -I ./src/brief/proto \ + ./src/brief/proto/*.proto + +.PHONY: gen_js +gen_js: + # generate js codes via grpc-tools + yarn grpc_tools_node_protoc \ + --js_out=import_style=commonjs,binary:./src/generated/proto \ + --grpc_out=grpc_js:./src/generated/proto \ + --plugin=protoc-gen-grpc=./node_modules/.bin/grpc_tools_node_protoc_plugin \ + --proto_path=./src/brief/proto \ + ./src/brief/proto/*.proto + +.PHONY: gen_ts +gen_ts: + # generate d.ts codes + yarn grpc_tools_node_protoc \ + --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts \ + --ts_out=grpc_js:./src/generated/proto \ + --proto_path=./src/brief/proto \ + ./src/brief/proto/*.proto + +tools: + cd tools && go mod tidy && go mod vendor && go mod verify && go generate -tags tools +.PHONY: tools + +.PHONY: check_alerts_syntax +check_alerts_syntax: + ./bin/promtool check rules ./alerts.yml + +.PHONY: test_alerts +test_alerts: + bin/promtool test rules ./alerts_tests.yml \ No newline at end of file diff --git a/csm-alerts/README.md b/csm-alerts/README.md new file mode 100644 index 000000000..49b26fae6 --- /dev/null +++ b/csm-alerts/README.md @@ -0,0 +1,126 @@ +# Lido CSM bot + +## Supported chains + +- Holesky testnet + +## Alerts + +1. **CSModule** + 1. General + - _To be added_ + 2. Roles monitoring + - _To be added_ +2. **CSAccounting** + 1. General + - _To be added_ + 2. Events monitoring + 1. 🚨 CRITICAL: ChargePenaltyRecipientSet(address chargeRecipient) + 2. 🚨 CRITICAL: BondCurveUpdated(uint256 indexed curveId, uint256[] bondCurve) + 3. πŸ”΄ HIGH: BondCurveAdded(uint256[] bondCurve) + 4. πŸ”΄ HIGH: BondCurveSet(uint256 indexed nodeOperatorId, uint256 curveId) + 5. πŸ”΅ INFO: Approval(address owner, address spender, uint256 value) (stETH contract) + 3. Roles monitoring + - _To be added_ +3. **CSFeeOracle** + 1. General + 1. 🚨 CRITICAL: ConsensusHashContractSet(address indexed addr, address indexed prevAddr) + 2. πŸ”΄ HIGH: PerfLeewaySet(uint256 valueBP) + 3. πŸ”΄ HIGH: FeeDistributorContractSet(address feeDistributorContract) + 4. πŸ”΄ HIGH: ConsensusVersionSet(uint256 indexed version, uint256 indexed prevVersion) + 5. πŸ”΄ HIGH: report overdue (expect consensus every 28 days) + 6. πŸ”΄ HIGH: WarnProcessingMissed(uint256 indexed refSlot) + 7. πŸ”΅ INFO: ReportSubmitted(uint256 indexed refSlot, bytes32 hash, uint256 processingDeadlineTime) + 8. πŸ”΅ INFO: ProcessingStarted(uint256 indexed refSlot, bytes32 hash) + 9. πŸ”΅ INFO: ReportSettled(uint256 indexed refSlot, uint256 distributed, bytes32 treeRoot, string treeCid) + 2. Roles monitoring + - _To be added_ + 3. HashConsensus (for CSFeeOracle) + 1. Events monitoring + 1. πŸ”΄ HIGH: MemberAdded(address indexed addr, uint256 newTotalMembers, uint256 newQuorum) + 2. πŸ”΄ HIGH: MemberRemoved(address indexed addr, uint256 newTotalMembers, uint256 newQuorum) + 3. πŸ”΄ HIGH: QuorumSet(uint256 newQuorum, uint256 totalMembers, uint256 prevQuorum) + 4. πŸ”΄ HIGH: FastLaneConfigSet(uint256 fastLaneLengthSlots) + 5. πŸ”΄ HIGH: FrameConfigSet(uint256 newInitialEpoch, uint256 newEpochsPerFrame) + 6. πŸ”΄ HIGH: ReportProcessorSet(address indexed processor, address indexed prevProcessor) + 7. πŸ”΄ HIGH: another report variant appeared (alternative hash) event ReportReceived(uint256 indexed refSlot, address indexed member, bytes32 report) + 8. πŸ”΄ HIGH: ConsensusLost(uint256 indexed refSlot) + 9. πŸ”΅ INFO: ConsensusReached(uint256 indexed refSlot, bytes32 report, uint256 support) + 2. Roles monitoring + - _To be added_ +4. **CSFeeDistributor** + 1. Alerting for failed transactions + - _To be added_ + 2. Events monitoring + 1. 🚨 CRITICAL: Receiver of TransferShares is NOT CSAccounting, if from is CSFeeDistributor + 2. πŸ”΄ HIGH: No fees distributed for X days (repeat every 1 day). + 3. πŸ”΅ INFO: DistributionDataUpdated -> Oracle settled a new report. + 3. Roles monitoring + - _To be added_ + +5. **CSEarlyAdoption** + - _To be added_ + +6. **OssifiableProxy** + For the following contracts: + + - CSModule + - CSAccounting + - CSFeeOracle + - CSFeeDistributor + +1. 🚨 CRITICAL: event ProxyOssified() +2. 🚨 CRITICAL: event Upgraded(address indexed implementation) +3. 🚨 CRITICAL: event AdminChanged(address previousAdmin, address newAdmin) +4. 🚨 CRITICAL: event BeaconUpgraded(address indexed beacon) + +7. **PausableUntil** + For the following contracts: + + - CSModule + - CSAccounting + - CSFeeOracle + + 1. 🚨 CRITICAL: Paused(uint256 duration); + 2. 🚨 CRITICAL: Resumed(); + +8. **AssetRecoverer** + For the following contracts: + + - CSModule + - CSAccounting + - CSFeeOracle + - CSFeeDistributor + + 1. πŸ”΄ HIGH: EtherRecovered() + 2. πŸ”΄ HIGH: ERC20Recovered() + 3. πŸ”΄ HIGH: StETHSharesRecovered() + 4. πŸ”΄ HIGH: ERC721Recovered() + 5. πŸ”΄ HIGH: ERC1155Recovered() + +## Development (Forta specific) + +Edit `alerting-forta//forta.config.json` and set `jsonRpcUrl` to your JSON-RPC provider. Install deps: + +``` +yarn install +yarn build +yarn start +``` + +In separate console run + +``` +docker-compose up -d +``` + +## Testing alerts + +1. For testing alerts you have to install promtool on your machine. + ``` + make tools + ``` +2. Check alerts + ``` + make test_alerts + ``` diff --git a/csm-alerts/alerts.yml b/csm-alerts/alerts.yml new file mode 100644 index 000000000..bd5dd09bb --- /dev/null +++ b/csm-alerts/alerts.yml @@ -0,0 +1,10 @@ +groups: + - name: CSMGroup + rules: + - alert: TooMuchNetworkErrors + expr: increase(csm_alerts_network_errors_total[15m]) >= 25 + labels: + severity: critical + annotations: + summary: "CSM bot has detected {{ $value }} network errors in the last 15 minutes" + description: "The csm_alerts_network_errors_total {{ $value }} in the last 15 minutes." diff --git a/csm-alerts/alerts_tests.yml b/csm-alerts/alerts_tests.yml new file mode 100644 index 000000000..28fb0f83d --- /dev/null +++ b/csm-alerts/alerts_tests.yml @@ -0,0 +1,30 @@ +rule_files: + - alerts.yml + +tests: + - interval: 5m + input_series: + - series: 'csm_network_errors_total{}' + values: '100 110 120 125 130 165' + alert_rule_test: + - alertname: TooMuchNetworkErrors + eval_time: 15m + exp_alerts: + - exp_labels: + severity: critical + exp_annotations: + summary: "CSM bot has detected 25 network errors in the last 15 minutes" + description: "The csm_network_errors_total 25 in the last 15 minutes." + + - alertname: TooMuchNetworkErrors + eval_time: 20m + exp_alerts: [ ] + + - alertname: TooMuchNetworkErrors + eval_time: 25m + exp_alerts: + - exp_labels: + severity: critical + exp_annotations: + summary: "CSM bot has detected 45 network errors in the last 15 minutes" + description: "The csm_network_errors_total 45 in the last 15 minutes." diff --git a/csm-alerts/jest.config.js b/csm-alerts/jest.config.js new file mode 100644 index 000000000..9dfeb5d27 --- /dev/null +++ b/csm-alerts/jest.config.js @@ -0,0 +1,6 @@ +/** @type {import("ts-jest").JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testPathIgnorePatterns: ['dist'], +} diff --git a/csm-alerts/package-lock.json b/csm-alerts/package-lock.json new file mode 100644 index 000000000..3acadf8c7 --- /dev/null +++ b/csm-alerts/package-lock.json @@ -0,0 +1,10501 @@ +{ + "name": "lido-csm-bot", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lido-csm-bot", + "version": "1.0.0", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "@fortanetwork/forta-bot": "^0.2.3", + "@grpc/grpc-js": "^1.10.2", + "@types/lodash": "^4.14.202", + "@types/node": "^20.14.2", + "async-mutex": "^0.4.0", + "bignumber.js": "^9.1.2", + "dotenv": "^16.4.5", + "ethers": "^5.7.2", + "express": "^4.19.2", + "forta-agent": "^0.1.48", + "fp-ts": "^2.16.1", + "knex": "^3.1.0", + "lodash": "^4.17.21", + "prom-client": "^15.1.2", + "ts-retry": "^4.2.4", + "winston": "^3.11.0" + }, + "devDependencies": { + "@faker-js/faker": "^8.3.1", + "@jest/globals": "^29.7.0", + "@tsconfig/node20": "^20.1.4", + "@typechain/ethers-v5": "^11.1.2", + "@types/express": "^4.17.21", + "@types/jest": "^29.5.11", + "@types/nodemon": "^1.19.0", + "@types/ws": "^8.5.10", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@typescript-eslint/parser": "^6.12.0", + "eslint": "^8.54.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-jest": "^27.6.0", + "eslint-plugin-prettier": "^5.0.1", + "grpc_tools_node_protoc_ts": "^5.3.3", + "grpc-tools": "^1.12.4", + "husky": "^8.0.3", + "jest": "^29.7.0", + "nodemon": "^3.0.1", + "postinstall": "^0.8.0", + "prettier": "^3.1.0", + "ts-generator": "^0.1.1", + "ts-jest": "^29.1.2", + "ts-node": "^10.9.2", + "typechain": "^8.3.2", + "typescript": "^5.3.2" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helpers": "^7.24.8", + "@babel/parser": "^7.24.8", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.8", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.24.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "license": "MIT", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@danieldietrich/copy": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@danieldietrich/copy/-/copy-0.4.2.tgz", + "integrity": "sha512-ZVNZIrgb2KeomfNahP77rL445ho6aQj0HHqU6hNlQ61o4rhvca+NS+ePj0d82zQDq2UPk1mjVZBTXgP+ErsDgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/danieldietrich" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@faker-js/faker": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", + "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "npm": ">=6.14.13" + } + }, + "node_modules/@fortanetwork/forta-bot": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@fortanetwork/forta-bot/-/forta-bot-0.2.3.tgz", + "integrity": "sha512-kGPAYZFyAFzB9IvZ+jn6OQ3+ASDeKWEyL1Ltzi8wNL57kfVF+C+WiKXhDk77BA1GwP8qyYBRztCxF73k8kA7vQ==", + "dependencies": { + "awilix": "^9.0.0", + "axios": "^1.6.2", + "base64-arraybuffer": "^1.0.2", + "ethers": "^6.9.0", + "flat-cache": "^3.2.0", + "jsonc": "^2.0.0", + "lodash": "^4.17.21", + "lru-cache": "^10.2.0", + "murmurhash3js": "^3.0.1", + "sha3": "^2.1.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@fortanetwork/forta-bot/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/@fortanetwork/forta-bot/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "node_modules/@fortanetwork/forta-bot/node_modules/awilix": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/awilix/-/awilix-9.0.0.tgz", + "integrity": "sha512-DVhdT1sbCCjGBvJbNKJaPSh+JVvgzUV0Rbdq3r3/MqxDgm7e/zs8aAhWI8O8nFNFvUYFtJPqWsFldyzC2rpMnA==", + "dependencies": { + "camel-case": "^4.1.2", + "fast-glob": "^3.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@fortanetwork/forta-bot/node_modules/ethers": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.1.tgz", + "integrity": "sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@fortanetwork/forta-bot/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/@fortanetwork/forta-bot/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@fortanetwork/forta-bot/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.10.11", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node20": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz", + "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typechain/ethers-v5": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-11.1.2.tgz", + "integrity": "sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "ethers": "^5.1.3", + "typechain": "^8.3.2", + "typescript": ">=4.3.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.6", + "license": "MIT" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mkdirp": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", + "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.14.10", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/nodemon": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/nodemon/-/nodemon-1.19.6.tgz", + "integrity": "sha512-vjKuaQOLUA5EY2zkUmWG1ipXbKt9Wd+H/0SiIuHVeH4cHtt6509iRUGH9ZR0iqgUrtj3BrP9KqoTuV3ZCbQcYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "license": "MIT" + }, + "node_modules/async-mutex": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz", + "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "license": "MIT", + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/awilix": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/awilix/-/awilix-4.3.4.tgz", + "integrity": "sha512-NgRwUPxUnoK+OTRa2fXcRQVFPOPQXlwCN1FJPkhO3IHKQJHokhdVpDfgz9L3VZTcA1iSaOFE3N/Q/5P7lIDqig==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "glob": "^7.1.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "license": "MIT", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "license": "ISC", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-sign/node_modules/elliptic": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/browserify-sign/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT" + }, + "node_modules/browserslist": { + "version": "4.23.2", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001641", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "license": "MIT" + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "license": "MIT", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/command-line-usage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/command-line-usage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.827", + "dev": true, + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "license": "ISC" + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forta-agent": { + "version": "0.1.48", + "resolved": "https://registry.npmjs.org/forta-agent/-/forta-agent-0.1.48.tgz", + "integrity": "sha512-fk3mar7/Avqg/4OHFmgv01ww/azr1XM+g5KcSnwvNxZy3KDMi7aFp1jAjPCsBjs8ZyVcR03ITUlbtFpRVgZB4Q==", + "license": "MIT", + "dependencies": { + "@grpc/grpc-js": "^1.3.6", + "@grpc/proto-loader": "^0.6.4", + "@types/uuid": "^8.3.4", + "async-retry": "^1.3.3", + "awilix": "^4.3.4", + "axios": "^1.6.2", + "base64-arraybuffer": "^1.0.2", + "ethers": "^5.5.1", + "flat-cache": "^3.0.4", + "form-data": "^4.0.0", + "jsonc": "^2.0.0", + "keythereum": "^1.2.0", + "lodash": "^4.17.21", + "murmurhash3js": "^3.0.1", + "n-readlines": "^1.0.1", + "prompts": "^2.4.1", + "python-shell": "^3.0.0", + "sha3": "^2.1.4", + "shelljs": "^0.8.4", + "uuid": "^8.3.2", + "yargs": "^17.0.1" + }, + "bin": { + "forta-agent": "dist/cli/index.js" + } + }, + "node_modules/forta-agent/node_modules/@grpc/proto-loader": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", + "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", + "license": "Apache-2.0", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.11.3", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/forta-agent/node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/forta-agent/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/forta-agent/node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "license": "Apache-2.0" + }, + "node_modules/forta-agent/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/forta-agent/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fp-ts": { + "version": "2.16.8", + "license": "MIT" + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getopts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", + "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/google-protobuf": { + "version": "3.15.8", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.15.8.tgz", + "integrity": "sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/grpc_tools_node_protoc_ts": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", + "integrity": "sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww==", + "dev": true, + "license": "MIT", + "dependencies": { + "google-protobuf": "3.15.8", + "handlebars": "4.7.7" + }, + "bin": { + "protoc-gen-ts": "bin/protoc-gen-ts" + } + }, + "node_modules/grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5" + }, + "bin": { + "grpc_tools_node_protoc": "bin/protoc.js", + "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.9.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", + "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==", + "license": "MIT", + "dependencies": { + "fast-safe-stringify": "^2.0.6", + "graceful-fs": "^4.1.15", + "mkdirp": "^0.5.1", + "parse-json": "^4.0.0", + "strip-bom": "^4.0.0", + "strip-json-comments": "^3.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsonc/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keccak": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", + "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/keythereum": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/keythereum/-/keythereum-1.2.0.tgz", + "integrity": "sha512-u3XnjIruOmjIvJ4tH1Wdr2y0X8+z8BZTQ+dqJuDMyLvNWw6VnH9XKtt0yauSE+96Bq97h6CPm4w5LbW3i28x0g==", + "license": "MIT", + "dependencies": { + "crypto-browserify": "3.12.0", + "keccak": "3.0.1", + "scrypt-js": "3.0.1", + "secp256k1": "4.0.2", + "sjcl": "1.0.6", + "uuid": "3.0.0" + } + }, + "node_modules/keythereum/node_modules/uuid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz", + "integrity": "sha512-rqE1LoOVLv3QrZMjb4NkF5UWlkurCfPyItVnFPNKDDGkHw4dQUdE4zMcLqx28+0Kcf3+bnUk4PisaiRJT4aiaQ==", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/knex": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz", + "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==", + "license": "MIT", + "dependencies": { + "colorette": "2.0.19", + "commander": "^10.0.0", + "debug": "4.3.4", + "escalade": "^3.1.1", + "esm": "^3.2.25", + "get-package-type": "^0.1.0", + "getopts": "2.3.0", + "interpret": "^2.2.0", + "lodash": "^4.17.21", + "pg-connection-string": "2.6.2", + "rechoir": "^0.8.0", + "resolve-from": "^5.0.0", + "tarn": "^3.0.2", + "tildify": "2.0.0" + }, + "bin": { + "knex": "bin/cli.js" + }, + "engines": { + "node": ">=16" + }, + "peerDependenciesMeta": { + "better-sqlite3": { + "optional": true + }, + "mysql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/knex/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/knex/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "license": "Apache-2.0" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/murmurhash3js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/murmurhash3js/-/murmurhash3js-3.0.1.tgz", + "integrity": "sha512-KL8QYUaxq7kUbcl0Yto51rMcYt7E/4N4BG3/c96Iqw1PQrTRspu8Cpx4TZ4Nunib1d4bEkIH3gjCYlP2RLBdow==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/n-readlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/n-readlines/-/n-readlines-1.0.1.tgz", + "integrity": "sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ==", + "license": "MIT", + "engines": { + "node": ">=6.x.x" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon": { + "version": "3.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "license": "ISC", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postinstall": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/postinstall/-/postinstall-0.8.0.tgz", + "integrity": "sha512-onh5cnUw4ue+iBzwoyHZNfih1iopqm5abfc/0vK/A9QyYVPxCbLW0DxwrRpHFZ2/Fs5Uo7j4TiaVDNWriq0HIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@danieldietrich/copy": "^0.4.2", + "glob": "^8.0.3", + "minimist": "^1.2.6", + "resolve-from": "^5.0.0", + "resolve-pkg": "^2.0.0" + }, + "bin": { + "postinstall": "bin/postinstall.js" + } + }, + "node_modules/postinstall/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/postinstall/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postinstall/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prom-client": { + "version": "15.1.3", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.4.0", + "tdigest": "^0.1.1" + }, + "engines": { + "node": "^16 || ^18 || >=20" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/protobufjs": { + "version": "7.3.2", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/python-shell": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/python-shell/-/python-shell-3.0.1.tgz", + "integrity": "sha512-TWeotuxe1auhXa5bGRScxnc2J+0r41NBntSa6RYZtMBLtAEsvCboKrEbW6DvASosWQepVkhZZlT3B5Ei766G+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "license": "MIT" + }, + "node_modules/secp256k1": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", + "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "elliptic": "^6.5.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/sha3": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", + "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", + "license": "MIT", + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs/node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/shelljs/node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sjcl": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/sjcl/-/sjcl-1.0.6.tgz", + "integrity": "sha512-oUVs+hzMSWEZ3rdeDL461QilvvEU2OL9q6T42lpVi2C5Proej9obVZ1nQeY9T96NxoMy/dqw82m33MfNNEmYJg==", + "engines": { + "node": "*" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "dev": true, + "license": "WTFPL OR MIT" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/tarn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", + "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/tdigest": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "license": "MIT", + "dependencies": { + "bintrees": "1.0.2" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", + "dev": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" + }, + "bin": { + "write-markdown": "dist/write-markdown.js" + } + }, + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">=3.7.0" + } + }, + "node_modules/ts-generator": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz", + "integrity": "sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mkdirp": "^0.5.2", + "@types/prettier": "^2.1.1", + "@types/resolve": "^0.0.8", + "chalk": "^2.4.1", + "glob": "^7.1.2", + "mkdirp": "^0.5.1", + "prettier": "^2.1.2", + "resolve": "^1.8.1", + "ts-essentials": "^1.0.0" + }, + "bin": { + "ts-generator": "dist/cli/run.js" + } + }, + "node_modules/ts-generator/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ts-generator/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ts-generator/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ts-generator/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-generator/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ts-generator/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ts-generator/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/ts-generator/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ts-generator/node_modules/ts-essentials": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz", + "integrity": "sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-jest": { + "version": "29.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "0.x", + "ejs": "^3.0.0", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/ts-retry/-/ts-retry-4.2.5.tgz", + "integrity": "sha512-dFBa4pxMBkt/bjzdBio8EwYfbAdycEAwe0KZgzlUKKwU9Wr1WErK7Hg9QLqJuDDYJXTW4KYZyXAyqYKOdO/ehA==", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typechain": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", + "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.3.0" + } + }, + "node_modules/typechain/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typechain/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typechain/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/typescript": { + "version": "5.5.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/uglify-js": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", + "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/winston": { + "version": "3.13.1", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.6.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.7.1", + "license": "MIT", + "dependencies": { + "logform": "^2.6.1", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "license": "MIT", + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/csm-alerts/package.json b/csm-alerts/package.json new file mode 100644 index 000000000..f63198550 --- /dev/null +++ b/csm-alerts/package.json @@ -0,0 +1,86 @@ +{ + "name": "lido-csm-bot", + "version": "1.0.0", + "description": "Forta Bot for Lido CSM", + "repository": { + "type": "git", + "directory": "https://github.com/lidofinance/alerting-forta/tree/main/csm-alerts" + }, + "license": "MIT", + "chainIds": [ + 17000 + ], + "husky": { + "hooks": { + "pre-commit": "yarn run lint" + } + }, + "scripts": { + "update-version": "node ../utils/write-version.js", + "build": "tsc && mkdir dist/generated/proto && make gen_proto_prod", + "copy-version": "cp version.json dist", + "start": "ts-node src/main.ts", + "start:prod": "node dist/main.js", + "start:docker:prod": "node src/main.js", + "push": "yarn run update-version && forta-agent push", + "test": "jest", + "generate-types": "typechain --target=ethers-v5 --out-dir=./src/generated/typechain ./src/brief/abi/*", + "generate-proto": "make gen_ts && make gen_js", + "eslint:lint": "eslint ./src", + "eslint:format": "eslint ./src --fix", + "prettier:check": "prettier --check ./src", + "prettier:format": "prettier --write ./src README.md", + "lint": "yarn run prettier:check && yarn run eslint:lint", + "format": "yarn run eslint:format && yarn run prettier:format", + "postinstall": "yarn generate-types && yarn generate-proto" + }, + "dependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "@fortanetwork/forta-bot": "^0.2.3", + "@grpc/grpc-js": "^1.10.2", + "@types/lodash": "^4.14.202", + "@types/node": "^20.14.2", + "async-mutex": "^0.4.0", + "bignumber.js": "^9.1.2", + "dotenv": "^16.4.5", + "ethers": "^5.7.2", + "express": "^4.19.2", + "forta-agent": "^0.1.48", + "fp-ts": "^2.16.1", + "knex": "^3.1.0", + "lodash": "^4.17.21", + "prom-client": "^15.1.2", + "ts-retry": "^4.2.4", + "winston": "^3.11.0" + }, + "devDependencies": { + "@faker-js/faker": "^8.3.1", + "@jest/globals": "^29.7.0", + "@tsconfig/node20": "^20.1.4", + "@typechain/ethers-v5": "^11.1.2", + "@types/express": "^4.17.21", + "@types/jest": "^29.5.11", + "@types/nodemon": "^1.19.0", + "@types/ws": "^8.5.10", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@typescript-eslint/parser": "^6.12.0", + "eslint": "^8.54.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-jest": "^27.6.0", + "eslint-plugin-prettier": "^5.0.1", + "grpc_tools_node_protoc_ts": "^5.3.3", + "grpc-tools": "^1.12.4", + "husky": "^8.0.3", + "jest": "^29.7.0", + "nodemon": "^3.0.1", + "postinstall": "^0.8.0", + "prettier": "^3.1.0", + "ts-generator": "^0.1.1", + "ts-jest": "^29.1.2", + "ts-node": "^10.9.2", + "typechain": "^8.3.2", + "typescript": "^5.3.2" + }, + "packageManager": "yarn@1.22.22" +} diff --git a/csm-alerts/src/brief/abi/CSAccounting.json b/csm-alerts/src/brief/abi/CSAccounting.json new file mode 100644 index 000000000..26de59f9f --- /dev/null +++ b/csm-alerts/src/brief/abi/CSAccounting.json @@ -0,0 +1,2293 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "lidoLocator", + "type": "address" + }, + { + "internalType": "address", + "name": "communityStakingModule", + "type": "address" + }, + { + "internalType": "uint256", + "name": "maxCurveLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBondLockRetentionPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxBondLockRetentionPeriod", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "ElRewardsVaultReceiveFailed", + "type": "error" + }, + { + "inputs": [], + "name": "FailedToSendEther", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidBondCurveId", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidBondCurveLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidBondCurveMaxLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidBondCurveValues", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidBondLockAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidBondLockRetentionPeriod", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialisationCurveId", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NodeOperatorDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "NotAllowedToRecover", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [], + "name": "NothingToClaim", + "type": "error" + }, + { + "inputs": [], + "name": "PauseUntilMustBeInFuture", + "type": "error" + }, + { + "inputs": [], + "name": "PausedExpected", + "type": "error" + }, + { + "inputs": [], + "name": "ResumedExpected", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "bits", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeCastOverflowedUintDowncast", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotCSM", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAdminAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroChargePenaltyRecipientAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroFeeDistributorAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroLocatorAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroModuleAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPauseDuration", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "toBurnAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "burnedAmount", + "type": "uint256" + } + ], + "name": "BondBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "toChargeAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "chargedAmount", + "type": "uint256" + } + ], + "name": "BondCharged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BondClaimedStETH", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "BondClaimedUnstETH", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BondClaimedWstETH", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256[]", + "name": "bondCurve", + "type": "uint256[]" + } + ], + "name": "BondCurveAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "curveId", + "type": "uint256" + } + ], + "name": "BondCurveSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "curveId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "bondCurve", + "type": "uint256[]" + } + ], + "name": "BondCurveUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BondDepositedETH", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BondDepositedStETH", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BondDepositedWstETH", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "retentionUntil", + "type": "uint256" + } + ], + "name": "BondLockChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BondLockCompensated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "BondLockRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "retentionPeriod", + "type": "uint256" + } + ], + "name": "BondLockRetentionPeriodChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "chargePenaltyRecipient", + "type": "address" + } + ], + "name": "ChargePenaltyRecipientSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ERC1155Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ERC20Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "ERC721Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "EtherRecovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Resumed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "StETHSharesRecovered", + "type": "event" + }, + { + "inputs": [], + "name": "ACCOUNTING_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "CSM", + "outputs": [ + { + "internalType": "contract ICSModule", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_BOND_CURVE_ID", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIDO", + "outputs": [ + { + "internalType": "contract ILido", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIDO_LOCATOR", + "outputs": [ + { + "internalType": "contract ILidoLocator", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_BOND_CURVES_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_BOND_LOCK_RETENTION_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_CURVE_LENGTH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_BOND_LOCK_RETENTION_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_CURVE_LENGTH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_INFINITELY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RECOVERER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESET_BOND_CURVE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESUME_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SET_BOND_CURVE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WITHDRAWAL_QUEUE", + "outputs": [ + { + "internalType": "contract IWithdrawalQueue", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WSTETH", + "outputs": [ + { + "internalType": "contract IWstETH", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "bondCurve", + "type": "uint256[]" + } + ], + "name": "addBondCurve", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "chargeFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "chargePenaltyRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stETHAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "rewardAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "cumulativeFeeShares", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "rewardsProof", + "type": "bytes32[]" + } + ], + "name": "claimRewardsStETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stEthAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "rewardAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "cumulativeFeeShares", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "rewardsProof", + "type": "bytes32[]" + } + ], + "name": "claimRewardsUnstETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wstETHAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "rewardAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "cumulativeFeeShares", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "rewardsProof", + "type": "bytes32[]" + } + ], + "name": "claimRewardsWstETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "compensateLockedBondETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "depositETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stETHAmount", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct ICSAccounting.PermitInput", + "name": "permit", + "type": "tuple" + } + ], + "name": "depositStETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wstETHAmount", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct ICSAccounting.PermitInput", + "name": "permit", + "type": "tuple" + } + ], + "name": "depositWstETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "feeDistributor", + "outputs": [ + { + "internalType": "contract ICSFeeDistributor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getActualLockedBond", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getBond", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keys", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256[]", + "name": "points", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "trend", + "type": "uint256" + } + ], + "internalType": "struct ICSBondCurve.BondCurve", + "name": "curve", + "type": "tuple" + } + ], + "name": "getBondAmountByKeysCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keys", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "curveId", + "type": "uint256" + } + ], + "name": "getBondAmountByKeysCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keysCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "curveId", + "type": "uint256" + } + ], + "name": "getBondAmountByKeysCountWstETH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keysCount", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256[]", + "name": "points", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "trend", + "type": "uint256" + } + ], + "internalType": "struct ICSBondCurve.BondCurve", + "name": "curve", + "type": "tuple" + } + ], + "name": "getBondAmountByKeysCountWstETH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getBondCurve", + "outputs": [ + { + "components": [ + { + "internalType": "uint256[]", + "name": "points", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "trend", + "type": "uint256" + } + ], + "internalType": "struct ICSBondCurve.BondCurve", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getBondCurveId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBondLockRetentionPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getBondShares", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getBondSummary", + "outputs": [ + { + "internalType": "uint256", + "name": "current", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "required", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getBondSummaryShares", + "outputs": [ + { + "internalType": "uint256", + "name": "current", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "required", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "curveId", + "type": "uint256" + } + ], + "name": "getCurveInfo", + "outputs": [ + { + "components": [ + { + "internalType": "uint256[]", + "name": "points", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "trend", + "type": "uint256" + } + ], + "internalType": "struct ICSBondCurve.BondCurve", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256[]", + "name": "points", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "trend", + "type": "uint256" + } + ], + "internalType": "struct ICSBondCurve.BondCurve", + "name": "curve", + "type": "tuple" + } + ], + "name": "getKeysCountByBondAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "curveId", + "type": "uint256" + } + ], + "name": "getKeysCountByBondAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getLockedBondInfo", + "outputs": [ + { + "components": [ + { + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "retentionUntil", + "type": "uint128" + } + ], + "internalType": "struct ICSBondLock.BondLock", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "additionalKeys", + "type": "uint256" + } + ], + "name": "getRequiredBondForNextKeys", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "additionalKeys", + "type": "uint256" + } + ], + "name": "getRequiredBondForNextKeysWstETH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getResumeSinceTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getUnbondedKeysCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getUnbondedKeysCountToEject", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "bondCurve", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "_feeDistributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "bondLockRetentionPeriod", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_chargePenaltyRecipient", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "lockBondETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "pauseFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "penalize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "cumulativeFeeShares", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "rewardsProof", + "type": "bytes32[]" + } + ], + "name": "pullFeeRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "recoverERC1155", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "recoverERC721", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "recoverEther", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "recoverStETHShares", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "releaseLockedBondETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renewBurnerAllowance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "callerConfirmation", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "resetBondCurve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "resume", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "curveId", + "type": "uint256" + } + ], + "name": "setBondCurve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_chargePenaltyRecipient", + "type": "address" + } + ], + "name": "setChargePenaltyRecipient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "retention", + "type": "uint256" + } + ], + "name": "setLockedBondRetentionPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "settleLockedBondETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalBondShares", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "curveId", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "bondCurve", + "type": "uint256[]" + } + ], + "name": "updateBondCurve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/csm-alerts/src/brief/abi/CSFeeDistributor.json b/csm-alerts/src/brief/abi/CSFeeDistributor.json new file mode 100644 index 000000000..75ed4aa7a --- /dev/null +++ b/csm-alerts/src/brief/abi/CSFeeDistributor.json @@ -0,0 +1,849 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "stETH", + "type": "address" + }, + { + "internalType": "address", + "name": "accounting", + "type": "address" + }, + { + "internalType": "address", + "name": "oracle", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "FailedToSendEther", + "type": "error" + }, + { + "inputs": [], + "name": "FeeSharesDecrease", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidShares", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidTreeCID", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidTreeRoot", + "type": "error" + }, + { + "inputs": [], + "name": "NotAccounting", + "type": "error" + }, + { + "inputs": [], + "name": "NotAllowedToRecover", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughShares", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [], + "name": "NotOracle", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAccountingAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAdminAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroOracleAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroStEthAddress", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "totalClaimableShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "treeRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "treeCid", + "type": "string" + } + ], + "name": "DistributionDataUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ERC1155Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ERC20Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "ERC721Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "EtherRecovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "FeeDistributed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "StETHSharesRecovered", + "type": "event" + }, + { + "inputs": [], + "name": "ACCOUNTING", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ORACLE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RECOVERER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STETH", + "outputs": [ + { + "internalType": "contract IStETH", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + } + ], + "name": "distributeFees", + "outputs": [ + { + "internalType": "uint256", + "name": "sharesToDistribute", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "distributedShares", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + } + ], + "name": "getFeesToDistribute", + "outputs": [ + { + "internalType": "uint256", + "name": "sharesToDistribute", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "hashLeaf", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingSharesToDistribute", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_treeRoot", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "_treeCid", + "type": "string" + }, + { + "internalType": "uint256", + "name": "distributed", + "type": "uint256" + } + ], + "name": "processOracleReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "recoverERC1155", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "recoverERC721", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "recoverEther", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "callerConfirmation", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalClaimableShares", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "treeCid", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "treeRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/csm-alerts/src/brief/abi/CSFeeOracle.json b/csm-alerts/src/brief/abi/CSFeeOracle.json new file mode 100644 index 000000000..0292f38cb --- /dev/null +++ b/csm-alerts/src/brief/abi/CSFeeOracle.json @@ -0,0 +1,1397 @@ +[ + { + "inputs": [ + { + "internalType": "uint256", + "name": "secondsPerSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "genesisTime", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "AddressCannotBeSame", + "type": "error" + }, + { + "inputs": [], + "name": "AddressCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "FailedToSendEther", + "type": "error" + }, + { + "inputs": [], + "name": "HashCannotBeZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "initialRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingRefSlot", + "type": "uint256" + } + ], + "name": "InitialRefSlotCannotBeLessThanProcessingOne", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidContractVersionIncrement", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPerfLeeway", + "type": "error" + }, + { + "inputs": [], + "name": "NoConsensusReportToProcess", + "type": "error" + }, + { + "inputs": [], + "name": "NonZeroContractVersionOnInit", + "type": "error" + }, + { + "inputs": [], + "name": "NotAllowedToRecover", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [], + "name": "PauseUntilMustBeInFuture", + "type": "error" + }, + { + "inputs": [], + "name": "PausedExpected", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "ProcessingDeadlineMissed", + "type": "error" + }, + { + "inputs": [], + "name": "RefSlotAlreadyProcessing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevRefSlot", + "type": "uint256" + } + ], + "name": "RefSlotCannotDecrease", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingRefSlot", + "type": "uint256" + } + ], + "name": "RefSlotMustBeGreaterThanProcessingOne", + "type": "error" + }, + { + "inputs": [], + "name": "ResumedExpected", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "bits", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeCastOverflowedUintDowncast", + "type": "error" + }, + { + "inputs": [], + "name": "SecondsPerSlotCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotTheConsensusContract", + "type": "error" + }, + { + "inputs": [], + "name": "SenderNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "UnexpectedChainConfig", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expectedVersion", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedVersion", + "type": "uint256" + } + ], + "name": "UnexpectedConsensusVersion", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "received", + "type": "uint256" + } + ], + "name": "UnexpectedContractVersion", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "consensusHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "receivedHash", + "type": "bytes32" + } + ], + "name": "UnexpectedDataHash", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "consensusRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "dataRefSlot", + "type": "uint256" + } + ], + "name": "UnexpectedRefSlot", + "type": "error" + }, + { + "inputs": [], + "name": "VersionCannotBeSame", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAdminAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroFeeDistributorAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPauseDuration", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "prevAddr", + "type": "address" + } + ], + "name": "ConsensusHashContractSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "version", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "prevVersion", + "type": "uint256" + } + ], + "name": "ConsensusVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "ContractVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ERC1155Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ERC20Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "ERC721Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "EtherRecovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "feeDistributorContract", + "type": "address" + } + ], + "name": "FeeDistributorContractSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "valueBP", + "type": "uint256" + } + ], + "name": "PerfLeewaySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "ProcessingStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "ReportDiscarded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "distributed", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "treeRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "treeCid", + "type": "string" + } + ], + "name": "ReportSettled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "processingDeadlineTime", + "type": "uint256" + } + ], + "name": "ReportSubmitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Resumed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "StETHSharesRecovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + } + ], + "name": "WarnProcessingMissed", + "type": "event" + }, + { + "inputs": [], + "name": "CONTRACT_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GENESIS_TIME", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_CONSENSUS_CONTRACT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_CONSENSUS_VERSION_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_INFINITELY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RECOVERER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESUME_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SECONDS_PER_SLOT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SUBMIT_DATA_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "avgPerfLeewayBP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + } + ], + "name": "discardConsensusReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "feeDistributor", + "outputs": [ + { + "internalType": "contract ICSFeeDistributor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusReport", + "outputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingDeadlineTime", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "processingStarted", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getContractVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastProcessingRefSlot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getResumeSinceTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "feeDistributorContract", + "type": "address" + }, + { + "internalType": "address", + "name": "consensusContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "consensusVersion", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_avgPerfLeewayBP", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "pauseFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pauseUntilInclusive", + "type": "uint256" + } + ], + "name": "pauseUntil", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "recoverERC1155", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "recoverERC721", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "recoverEther", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "callerConfirmation", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "resume", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "setConsensusContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "setConsensusVersion", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "feeDistributorContract", + "type": "address" + } + ], + "name": "setFeeDistributorContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "valueBP", + "type": "uint256" + } + ], + "name": "setPerformanceLeeway", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "reportHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "submitConsensusReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "consensusVersion", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "treeRoot", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "treeCid", + "type": "string" + }, + { + "internalType": "uint256", + "name": "distributed", + "type": "uint256" + } + ], + "internalType": "struct CSFeeOracle.ReportData", + "name": "data", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "contractVersion", + "type": "uint256" + } + ], + "name": "submitReportData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/csm-alerts/src/brief/abi/CSModule.json b/csm-alerts/src/brief/abi/CSModule.json new file mode 100644 index 000000000..4914db6e7 --- /dev/null +++ b/csm-alerts/src/brief/abi/CSModule.json @@ -0,0 +1,2996 @@ +[ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "moduleType", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "minSlashingPenaltyQuotient", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "elRewardsStealingFine", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxKeysPerOperatorEA", + "type": "uint256" + }, + { + "internalType": "address", + "name": "lidoLocator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyActivated", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyProposed", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadySubmitted", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyWithdrawn", + "type": "error" + }, + { + "inputs": [], + "name": "EmptyKey", + "type": "error" + }, + { + "inputs": [], + "name": "ExitedKeysDecrease", + "type": "error" + }, + { + "inputs": [], + "name": "ExitedKeysHigherThanTotalDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "FailedToSendEther", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInput", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidKeysCount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidReportData", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidVetKeysPointer", + "type": "error" + }, + { + "inputs": [], + "name": "MaxSigningKeysCountExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "MethodCallIsNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "NodeOperatorDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "NotAllowedToJoinYet", + "type": "error" + }, + { + "inputs": [], + "name": "NotAllowedToRecover", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughKeys", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [], + "name": "NotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "PauseUntilMustBeInFuture", + "type": "error" + }, + { + "inputs": [], + "name": "PausedExpected", + "type": "error" + }, + { + "inputs": [], + "name": "QueueIsEmpty", + "type": "error" + }, + { + "inputs": [], + "name": "QueueLookupNoLimit", + "type": "error" + }, + { + "inputs": [], + "name": "ResumedExpected", + "type": "error" + }, + { + "inputs": [], + "name": "SameAddress", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotEligible", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotManagerAddress", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotProposedAddress", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotRewardAddress", + "type": "error" + }, + { + "inputs": [], + "name": "SigningKeysInvalidOffset", + "type": "error" + }, + { + "inputs": [], + "name": "StuckKeysHigherThanNonExited", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAccountingAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAdminAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroLocatorAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPauseDuration", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroRewardAddress", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "name": "BatchEnqueued", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "depositableKeysCount", + "type": "uint256" + } + ], + "name": "DepositableSigningKeysCountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "depositedKeysCount", + "type": "uint256" + } + ], + "name": "DepositedSigningKeysCountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ELRewardsStealingPenaltyCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "proposedBlockHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stolenAmount", + "type": "uint256" + } + ], + "name": "ELRewardsStealingPenaltyReported", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "ELRewardsStealingPenaltySettled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ERC1155Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ERC20Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "ERC721Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "EtherRecovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "exitedKeysCount", + "type": "uint256" + } + ], + "name": "ExitedSigningKeysCountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "keyIndex", + "type": "uint256" + } + ], + "name": "InitialSlashingSubmitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "KeyRemovalChargeApplied", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "KeyRemovalChargeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "managerAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "rewardAddress", + "type": "address" + } + ], + "name": "NodeOperatorAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "oldProposedAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newProposedAddress", + "type": "address" + } + ], + "name": "NodeOperatorManagerAddressChangeProposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "oldAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "NodeOperatorManagerAddressChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "oldProposedAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newProposedAddress", + "type": "address" + } + ], + "name": "NodeOperatorRewardAddressChangeProposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "oldAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "NodeOperatorRewardAddressChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "name": "NonceChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "PublicRelease", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "referrer", + "type": "address" + } + ], + "name": "ReferrerSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Resumed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "SigningKeyAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "SigningKeyRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "StETHSharesRecovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stuckKeysCount", + "type": "uint256" + } + ], + "name": "StuckSigningKeysCountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "targetLimitMode", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "targetValidatorsCount", + "type": "uint256" + } + ], + "name": "TargetValidatorsCountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalKeysCount", + "type": "uint256" + } + ], + "name": "TotalSigningKeysCountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "vettedKeysCount", + "type": "uint256" + } + ], + "name": "VettedSigningKeysCountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "VettedSigningKeysCountDecreased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "keyIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "WithdrawalSubmitted", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EL_REWARDS_STEALING_FINE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIAL_SLASHING_PENALTY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIDO_LOCATOR", + "outputs": [ + { + "internalType": "contract ILidoLocator", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_SIGNING_KEYS_PER_OPERATOR_BEFORE_PUBLIC_RELEASE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MODULE_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_INFINITELY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RECOVERER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_EL_REWARDS_STEALING_PENALTY_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESUME_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_ROUTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STETH", + "outputs": [ + { + "internalType": "contract IStETH", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERIFIER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "accounting", + "outputs": [ + { + "internalType": "contract ICSAccounting", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "activatePublicRelease", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keysCount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "publicKeys", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "address", + "name": "managerAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardAddress", + "type": "address" + }, + { + "internalType": "bool", + "name": "extendedManagerPermissions", + "type": "bool" + } + ], + "internalType": "struct NodeOperatorManagementProperties", + "name": "managementProperties", + "type": "tuple" + }, + { + "internalType": "bytes32[]", + "name": "eaProof", + "type": "bytes32[]" + }, + { + "internalType": "address", + "name": "referrer", + "type": "address" + } + ], + "name": "addNodeOperatorETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keysCount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "publicKeys", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "address", + "name": "managerAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardAddress", + "type": "address" + }, + { + "internalType": "bool", + "name": "extendedManagerPermissions", + "type": "bool" + } + ], + "internalType": "struct NodeOperatorManagementProperties", + "name": "managementProperties", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct ICSAccounting.PermitInput", + "name": "permit", + "type": "tuple" + }, + { + "internalType": "bytes32[]", + "name": "eaProof", + "type": "bytes32[]" + }, + { + "internalType": "address", + "name": "referrer", + "type": "address" + } + ], + "name": "addNodeOperatorStETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keysCount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "publicKeys", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "address", + "name": "managerAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardAddress", + "type": "address" + }, + { + "internalType": "bool", + "name": "extendedManagerPermissions", + "type": "bool" + } + ], + "internalType": "struct NodeOperatorManagementProperties", + "name": "managementProperties", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct ICSAccounting.PermitInput", + "name": "permit", + "type": "tuple" + }, + { + "internalType": "bytes32[]", + "name": "eaProof", + "type": "bytes32[]" + }, + { + "internalType": "address", + "name": "referrer", + "type": "address" + } + ], + "name": "addNodeOperatorWstETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "keysCount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "publicKeys", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + } + ], + "name": "addValidatorKeysETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "keysCount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "publicKeys", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct ICSAccounting.PermitInput", + "name": "permit", + "type": "tuple" + } + ], + "name": "addValidatorKeysStETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "keysCount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "publicKeys", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct ICSAccounting.PermitInput", + "name": "permit", + "type": "tuple" + } + ], + "name": "addValidatorKeysWstETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "cancelELRewardsStealingPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "changeNodeOperatorRewardAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stETHAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "cumulativeFeeShares", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "rewardsProof", + "type": "bytes32[]" + } + ], + "name": "claimRewardsStETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stEthAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "cumulativeFeeShares", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "rewardsProof", + "type": "bytes32[]" + } + ], + "name": "claimRewardsUnstETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wstETHAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "cumulativeFeeShares", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "rewardsProof", + "type": "bytes32[]" + } + ], + "name": "claimRewardsWstETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxItems", + "type": "uint256" + } + ], + "name": "cleanDepositQueue", + "outputs": [ + { + "internalType": "uint256", + "name": "removed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastRemovedAtDepth", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "compensateELRewardsStealingPenalty", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "confirmNodeOperatorManagerAddressChange", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "confirmNodeOperatorRewardAddressChange", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "nodeOperatorIds", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "vettedSigningKeysCounts", + "type": "bytes" + } + ], + "name": "decreaseVettedSigningKeysCount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "depositETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "depositQueue", + "outputs": [ + { + "internalType": "uint128", + "name": "head", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "tail", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint128", + "name": "index", + "type": "uint128" + } + ], + "name": "depositQueueItem", + "outputs": [ + { + "internalType": "Batch", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stETHAmount", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct ICSAccounting.PermitInput", + "name": "permit", + "type": "tuple" + } + ], + "name": "depositStETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wstETHAmount", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct ICSAccounting.PermitInput", + "name": "permit", + "type": "tuple" + } + ], + "name": "depositWstETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "earlyAdoption", + "outputs": [ + { + "internalType": "contract ICSEarlyAdoption", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getActiveNodeOperatorsCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getNodeOperator", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "totalAddedKeys", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "totalWithdrawnKeys", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "totalDepositedKeys", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "totalVettedKeys", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "stuckValidatorsCount", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "depositableValidatorsCount", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "targetLimit", + "type": "uint32" + }, + { + "internalType": "uint8", + "name": "targetLimitMode", + "type": "uint8" + }, + { + "internalType": "uint32", + "name": "totalExitedKeys", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "enqueuedCount", + "type": "uint32" + }, + { + "internalType": "address", + "name": "managerAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "proposedManagerAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "proposedRewardAddress", + "type": "address" + }, + { + "internalType": "bool", + "name": "extendedManagerPermissions", + "type": "bool" + } + ], + "internalType": "struct NodeOperator", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "offset", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + } + ], + "name": "getNodeOperatorIds", + "outputs": [ + { + "internalType": "uint256[]", + "name": "nodeOperatorIds", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getNodeOperatorIsActive", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getNodeOperatorNonWithdrawnKeys", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "getNodeOperatorSummary", + "outputs": [ + { + "internalType": "uint256", + "name": "targetLimitMode", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refundedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckPenaltyEndTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNodeOperatorsCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getResumeSinceTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "startIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "keysCount", + "type": "uint256" + } + ], + "name": "getSigningKeys", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "startIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "keysCount", + "type": "uint256" + } + ], + "name": "getSigningKeysWithSignatures", + "outputs": [ + { + "internalType": "bytes", + "name": "keys", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingModuleSummary", + "outputs": [ + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getType", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_accounting", + "type": "address" + }, + { + "internalType": "address", + "name": "_earlyAdoption", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_keyRemovalCharge", + "type": "uint256" + }, + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "keyIndex", + "type": "uint256" + } + ], + "name": "isValidatorSlashed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "keyIndex", + "type": "uint256" + } + ], + "name": "isValidatorWithdrawn", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "keyRemovalCharge", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "normalizeQueue", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "depositsCount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "obtainDepositData", + "outputs": [ + { + "internalType": "bytes", + "name": "publicKeys", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "onExitedAndStuckValidatorsCountsUpdated", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "totalShares", + "type": "uint256" + } + ], + "name": "onRewardsMinted", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "onWithdrawalCredentialsChanged", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "pauseFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "proposedAddress", + "type": "address" + } + ], + "name": "proposeNodeOperatorManagerAddressChange", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "proposedAddress", + "type": "address" + } + ], + "name": "proposeNodeOperatorRewardAddressChange", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "publicRelease", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "recoverERC1155", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "recoverERC721", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "recoverEther", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "recoverStETHShares", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "startIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "keysCount", + "type": "uint256" + } + ], + "name": "removeKeys", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "callerConfirmation", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "reportELRewardsStealingPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + } + ], + "name": "resetNodeOperatorManagerAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "resume", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "setKeyRemovalCharge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "nodeOperatorIds", + "type": "uint256[]" + } + ], + "name": "settleELRewardsStealingPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "keyIndex", + "type": "uint256" + } + ], + "name": "submitInitialSlashing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "keyIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isSlashed", + "type": "bool" + } + ], + "name": "submitWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitedValidatorsKeysCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckValidatorsKeysCount", + "type": "uint256" + } + ], + "name": "unsafeUpdateValidatorsCount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "nodeOperatorIds", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "exitedValidatorsCounts", + "type": "bytes" + } + ], + "name": "updateExitedValidatorsCount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "updateRefundedValidatorsCount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "nodeOperatorIds", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "stuckValidatorsCounts", + "type": "bytes" + } + ], + "name": "updateStuckValidatorsCount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetLimitMode", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetLimit", + "type": "uint256" + } + ], + "name": "updateTargetValidatorsLimits", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/csm-alerts/src/brief/abi/HashConsensus.json b/csm-alerts/src/brief/abi/HashConsensus.json new file mode 100644 index 000000000..c3d30982e --- /dev/null +++ b/csm-alerts/src/brief/abi/HashConsensus.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"uint256","name":"slotsPerEpoch","type":"uint256"},{"internalType":"uint256","name":"secondsPerSlot","type":"uint256"},{"internalType":"uint256","name":"genesisTime","type":"uint256"},{"internalType":"uint256","name":"epochsPerFrame","type":"uint256"},{"internalType":"uint256","name":"fastLaneLengthSlots","type":"uint256"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"reportProcessor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"AddressCannotBeZero","type":"error"},{"inputs":[],"name":"AdminCannotBeZero","type":"error"},{"inputs":[],"name":"ConsensusReportAlreadyProcessing","type":"error"},{"inputs":[],"name":"DuplicateMember","type":"error"},{"inputs":[],"name":"DuplicateReport","type":"error"},{"inputs":[],"name":"EmptyReport","type":"error"},{"inputs":[],"name":"EpochsPerFrameCannotBeZero","type":"error"},{"inputs":[],"name":"FastLanePeriodCannotBeLongerThanFrame","type":"error"},{"inputs":[],"name":"InitialEpochAlreadyArrived","type":"error"},{"inputs":[],"name":"InitialEpochIsYetToArrive","type":"error"},{"inputs":[],"name":"InitialEpochRefSlotCannotBeEarlierThanProcessingSlot","type":"error"},{"inputs":[],"name":"InvalidChainConfig","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidSlot","type":"error"},{"inputs":[],"name":"NewProcessorCannotBeTheSame","type":"error"},{"inputs":[],"name":"NonFastLaneMemberCannotReportWithinFastLaneInterval","type":"error"},{"inputs":[],"name":"NonMember","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"NumericOverflow","type":"error"},{"inputs":[{"internalType":"uint256","name":"minQuorum","type":"uint256"},{"internalType":"uint256","name":"receivedQuorum","type":"uint256"}],"name":"QuorumTooSmall","type":"error"},{"inputs":[],"name":"ReportProcessorCannotBeZero","type":"error"},{"inputs":[{"internalType":"uint8","name":"bits","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"SafeCastOverflowedUintDowncast","type":"error"},{"inputs":[],"name":"StaleReport","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"name":"UnexpectedConsensusVersion","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"}],"name":"ConsensusLost","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"report","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"support","type":"uint256"}],"name":"ConsensusReached","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fastLaneLengthSlots","type":"uint256"}],"name":"FastLaneConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newInitialEpoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEpochsPerFrame","type":"uint256"}],"name":"FrameConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"newTotalMembers","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newQuorum","type":"uint256"}],"name":"MemberAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"newTotalMembers","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newQuorum","type":"uint256"}],"name":"MemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newQuorum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalMembers","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"prevQuorum","type":"uint256"}],"name":"QuorumSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"processor","type":"address"},{"indexed":true,"internalType":"address","name":"prevProcessor","type":"address"}],"name":"ReportProcessorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":true,"internalType":"address","name":"member","type":"address"},{"indexed":false,"internalType":"bytes32","name":"report","type":"bytes32"}],"name":"ReportReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISABLE_CONSENSUS_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_FAST_LANE_CONFIG_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_FRAME_CONFIG_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_MEMBERS_AND_QUORUM_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_REPORT_PROCESSOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"quorum","type":"uint256"}],"name":"addMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableConsensus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getChainConfig","outputs":[{"internalType":"uint256","name":"slotsPerEpoch","type":"uint256"},{"internalType":"uint256","name":"secondsPerSlot","type":"uint256"},{"internalType":"uint256","name":"genesisTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConsensusState","outputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"bytes32","name":"consensusReport","type":"bytes32"},{"internalType":"bool","name":"isReportProcessing","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getConsensusStateForMember","outputs":[{"components":[{"internalType":"uint256","name":"currentFrameRefSlot","type":"uint256"},{"internalType":"bytes32","name":"currentFrameConsensusReport","type":"bytes32"},{"internalType":"bool","name":"isMember","type":"bool"},{"internalType":"bool","name":"isFastLane","type":"bool"},{"internalType":"bool","name":"canReport","type":"bool"},{"internalType":"uint256","name":"lastMemberReportRefSlot","type":"uint256"},{"internalType":"bytes32","name":"currentFrameMemberReport","type":"bytes32"}],"internalType":"struct HashConsensus.MemberConsensusState","name":"result","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentFrame","outputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"reportProcessingDeadlineSlot","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFastLaneMembers","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"lastReportedRefSlots","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFrameConfig","outputs":[{"internalType":"uint256","name":"initialEpoch","type":"uint256"},{"internalType":"uint256","name":"epochsPerFrame","type":"uint256"},{"internalType":"uint256","name":"fastLaneLengthSlots","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInitialRefSlot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getIsFastLaneMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getIsMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMembers","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"lastReportedRefSlots","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReportProcessor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReportVariants","outputs":[{"internalType":"bytes32[]","name":"variants","type":"bytes32[]"},{"internalType":"uint256[]","name":"support","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"quorum","type":"uint256"}],"name":"removeMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fastLaneLengthSlots","type":"uint256"}],"name":"setFastLaneLengthSlots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epochsPerFrame","type":"uint256"},{"internalType":"uint256","name":"fastLaneLengthSlots","type":"uint256"}],"name":"setFrameConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quorum","type":"uint256"}],"name":"setQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newProcessor","type":"address"}],"name":"setReportProcessor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"bytes32","name":"report","type":"bytes32"},{"internalType":"uint256","name":"consensusVersion","type":"uint256"}],"name":"submitReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"initialEpoch","type":"uint256"}],"name":"updateInitialEpoch","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/csm-alerts/src/brief/abi/Lido.json b/csm-alerts/src/brief/abi/Lido.json new file mode 100644 index 000000000..0d2c29468 --- /dev/null +++ b/csm-alerts/src/brief/abi/Lido.json @@ -0,0 +1,871 @@ +[ + { + "constant": false, + "inputs": [], + "name": "resume", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [{ "name": "", "type": "string" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "stop", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "hasInitialized", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_spender", "type": "address" }, + { "name": "_amount", "type": "uint256" } + ], + "name": "approve", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "STAKING_CONTROL_ROLE", + "outputs": [{ "name": "", "type": "bytes32" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "_ethAmount", "type": "uint256" }], + "name": "getSharesByPooledEth", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isStakingPaused", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_sender", "type": "address" }, + { "name": "_recipient", "type": "address" }, + { "name": "_amount", "type": "uint256" } + ], + "name": "transferFrom", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "_script", "type": "bytes" }], + "name": "getEVMScriptExecutor", + "outputs": [{ "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_maxStakeLimit", "type": "uint256" }, + { "name": "_stakeLimitIncreasePerBlock", "type": "uint256" } + ], + "name": "setStakingLimit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "RESUME_ROLE", + "outputs": [{ "name": "", "type": "bytes32" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_lidoLocator", "type": "address" }, + { "name": "_eip712StETH", "type": "address" } + ], + "name": "finalizeUpgrade_v2", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [{ "name": "", "type": "uint8" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getRecoveryVault", + "outputs": [{ "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [{ "name": "", "type": "bytes32" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getTotalPooledEther", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "_newDepositedValidators", "type": "uint256" }], + "name": "unsafeChangeDepositedValidators", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "PAUSE_ROLE", + "outputs": [{ "name": "", "type": "bytes32" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_spender", "type": "address" }, + { "name": "_addedValue", "type": "uint256" } + ], + "name": "increaseAllowance", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getTreasury", + "outputs": [{ "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isStopped", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getBufferedEther", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_lidoLocator", "type": "address" }, + { "name": "_eip712StETH", "type": "address" } + ], + "name": "initialize", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "receiveELRewards", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getWithdrawalCredentials", + "outputs": [{ "name": "", "type": "bytes32" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCurrentStakeLimit", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getStakeLimitFullInfo", + "outputs": [ + { "name": "isStakingPaused", "type": "bool" }, + { "name": "isStakingLimitSet", "type": "bool" }, + { "name": "currentStakeLimit", "type": "uint256" }, + { "name": "maxStakeLimit", "type": "uint256" }, + { "name": "maxStakeLimitGrowthBlocks", "type": "uint256" }, + { "name": "prevStakeLimit", "type": "uint256" }, + { "name": "prevStakeBlockNumber", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_sender", "type": "address" }, + { "name": "_recipient", "type": "address" }, + { "name": "_sharesAmount", "type": "uint256" } + ], + "name": "transferSharesFrom", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "_account", "type": "address" }], + "name": "balanceOf", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "resumeStaking", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getFeeDistribution", + "outputs": [ + { "name": "treasuryFeeBasisPoints", "type": "uint16" }, + { "name": "insuranceFeeBasisPoints", "type": "uint16" }, + { "name": "operatorsFeeBasisPoints", "type": "uint16" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "receiveWithdrawals", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "_sharesAmount", "type": "uint256" }], + "name": "getPooledEthByShares", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "token", "type": "address" }], + "name": "allowRecoverability", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "owner", "type": "address" }], + "name": "nonces", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "appId", + "outputs": [{ "name": "", "type": "bytes32" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getOracle", + "outputs": [{ "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { "name": "name", "type": "string" }, + { "name": "version", "type": "string" }, + { "name": "chainId", "type": "uint256" }, + { "name": "verifyingContract", "type": "address" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getContractVersion", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getInitializationBlock", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_recipient", "type": "address" }, + { "name": "_sharesAmount", "type": "uint256" } + ], + "name": "transferShares", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [{ "name": "", "type": "string" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getEIP712StETH", + "outputs": [{ "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "", "type": "address" }], + "name": "transferToVault", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "name": "_sender", "type": "address" }, + { "name": "_role", "type": "bytes32" }, + { "name": "_params", "type": "uint256[]" } + ], + "name": "canPerform", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "_referral", "type": "address" }], + "name": "submit", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_spender", "type": "address" }, + { "name": "_subtractedValue", "type": "uint256" } + ], + "name": "decreaseAllowance", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getEVMScriptRegistry", + "outputs": [{ "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_recipient", "type": "address" }, + { "name": "_amount", "type": "uint256" } + ], + "name": "transfer", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_maxDepositsCount", "type": "uint256" }, + { "name": "_stakingModuleId", "type": "uint256" }, + { "name": "_depositCalldata", "type": "bytes" } + ], + "name": "deposit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "UNSAFE_CHANGE_DEPOSITED_VALIDATORS_ROLE", + "outputs": [{ "name": "", "type": "bytes32" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getBeaconStat", + "outputs": [ + { "name": "depositedValidators", "type": "uint256" }, + { "name": "beaconValidators", "type": "uint256" }, + { "name": "beaconBalance", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "removeStakingLimit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_reportTimestamp", "type": "uint256" }, + { "name": "_timeElapsed", "type": "uint256" }, + { "name": "_clValidators", "type": "uint256" }, + { "name": "_clBalance", "type": "uint256" }, + { "name": "_withdrawalVaultBalance", "type": "uint256" }, + { "name": "_elRewardsVaultBalance", "type": "uint256" }, + { "name": "_sharesRequestedToBurn", "type": "uint256" }, + { "name": "_withdrawalFinalizationBatches", "type": "uint256[]" }, + { "name": "_simulatedShareRate", "type": "uint256" } + ], + "name": "handleOracleReport", + "outputs": [{ "name": "postRebaseAmounts", "type": "uint256[4]" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getFee", + "outputs": [{ "name": "totalFee", "type": "uint16" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "kernel", + "outputs": [{ "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getTotalShares", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "_owner", "type": "address" }, + { "name": "_spender", "type": "address" }, + { "name": "_value", "type": "uint256" }, + { "name": "_deadline", "type": "uint256" }, + { "name": "_v", "type": "uint8" }, + { "name": "_r", "type": "bytes32" }, + { "name": "_s", "type": "bytes32" } + ], + "name": "permit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "name": "_owner", "type": "address" }, + { "name": "_spender", "type": "address" } + ], + "name": "allowance", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isPetrified", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getLidoLocator", + "outputs": [{ "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "canDeposit", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "STAKING_PAUSE_ROLE", + "outputs": [{ "name": "", "type": "bytes32" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getDepositableEther", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "_account", "type": "address" }], + "name": "sharesOf", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "pauseStaking", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getTotalELRewardsCollected", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { "payable": true, "stateMutability": "payable", "type": "fallback" }, + { "anonymous": false, "inputs": [], "name": "StakingPaused", "type": "event" }, + { "anonymous": false, "inputs": [], "name": "StakingResumed", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "maxStakeLimit", "type": "uint256" }, + { "indexed": false, "name": "stakeLimitIncreasePerBlock", "type": "uint256" } + ], + "name": "StakingLimitSet", + "type": "event" + }, + { "anonymous": false, "inputs": [], "name": "StakingLimitRemoved", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "reportTimestamp", "type": "uint256" }, + { "indexed": false, "name": "preCLValidators", "type": "uint256" }, + { "indexed": false, "name": "postCLValidators", "type": "uint256" } + ], + "name": "CLValidatorsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "name": "depositedValidators", "type": "uint256" }], + "name": "DepositedValidatorsChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "reportTimestamp", "type": "uint256" }, + { "indexed": false, "name": "preCLBalance", "type": "uint256" }, + { "indexed": false, "name": "postCLBalance", "type": "uint256" }, + { "indexed": false, "name": "withdrawalsWithdrawn", "type": "uint256" }, + { "indexed": false, "name": "executionLayerRewardsWithdrawn", "type": "uint256" }, + { "indexed": false, "name": "postBufferedEther", "type": "uint256" } + ], + "name": "ETHDistributed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "reportTimestamp", "type": "uint256" }, + { "indexed": false, "name": "timeElapsed", "type": "uint256" }, + { "indexed": false, "name": "preTotalShares", "type": "uint256" }, + { "indexed": false, "name": "preTotalEther", "type": "uint256" }, + { "indexed": false, "name": "postTotalShares", "type": "uint256" }, + { "indexed": false, "name": "postTotalEther", "type": "uint256" }, + { "indexed": false, "name": "sharesMintedAsFees", "type": "uint256" } + ], + "name": "TokenRebased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "name": "lidoLocator", "type": "address" }], + "name": "LidoLocatorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "name": "amount", "type": "uint256" }], + "name": "ELRewardsReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "name": "amount", "type": "uint256" }], + "name": "WithdrawalsReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "sender", "type": "address" }, + { "indexed": false, "name": "amount", "type": "uint256" }, + { "indexed": false, "name": "referral", "type": "address" } + ], + "name": "Submitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "name": "amount", "type": "uint256" }], + "name": "Unbuffered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "executor", "type": "address" }, + { "indexed": false, "name": "script", "type": "bytes" }, + { "indexed": false, "name": "input", "type": "bytes" }, + { "indexed": false, "name": "returnData", "type": "bytes" } + ], + "name": "ScriptResult", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "vault", "type": "address" }, + { "indexed": true, "name": "token", "type": "address" }, + { "indexed": false, "name": "amount", "type": "uint256" } + ], + "name": "RecoverToVault", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "name": "eip712StETH", "type": "address" }], + "name": "EIP712StETHInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "from", "type": "address" }, + { "indexed": true, "name": "to", "type": "address" }, + { "indexed": false, "name": "sharesValue", "type": "uint256" } + ], + "name": "TransferShares", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "account", "type": "address" }, + { "indexed": false, "name": "preRebaseTokenAmount", "type": "uint256" }, + { "indexed": false, "name": "postRebaseTokenAmount", "type": "uint256" }, + { "indexed": false, "name": "sharesAmount", "type": "uint256" } + ], + "name": "SharesBurnt", + "type": "event" + }, + { "anonymous": false, "inputs": [], "name": "Stopped", "type": "event" }, + { "anonymous": false, "inputs": [], "name": "Resumed", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "from", "type": "address" }, + { "indexed": true, "name": "to", "type": "address" }, + { "indexed": false, "name": "value", "type": "uint256" } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "owner", "type": "address" }, + { "indexed": true, "name": "spender", "type": "address" }, + { "indexed": false, "name": "value", "type": "uint256" } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "name": "version", "type": "uint256" }], + "name": "ContractVersionSet", + "type": "event" + } +] diff --git a/csm-alerts/src/brief/abi/ProxyShortABI.json b/csm-alerts/src/brief/abi/ProxyShortABI.json new file mode 100644 index 000000000..b73d7c162 --- /dev/null +++ b/csm-alerts/src/brief/abi/ProxyShortABI.json @@ -0,0 +1,28 @@ +[ + { + "inputs": [], + "name": "proxy__getAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxy__getImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/csm-alerts/src/brief/proto/agent.proto b/csm-alerts/src/brief/proto/agent.proto new file mode 100644 index 000000000..95b9af4b6 --- /dev/null +++ b/csm-alerts/src/brief/proto/agent.proto @@ -0,0 +1,348 @@ +syntax = "proto3"; + +package network.forta; + +import public "alert.proto"; + +option go_package = "./;protocol"; + + +service Agent { + rpc Initialize (InitializeRequest) returns (InitializeResponse) {} + rpc EvaluateTx (EvaluateTxRequest) returns (EvaluateTxResponse) {} + rpc EvaluateBlock (EvaluateBlockRequest) returns (EvaluateBlockResponse) {} + rpc EvaluateAlert (EvaluateAlertRequest) returns (EvaluateAlertResponse) {} + rpc HealthCheck (HealthCheckRequest) returns (HealthCheckResponse) {} +} + +message Error { + string message = 1; +} + +enum ResponseStatus { + UNKNOWN = 0; + ERROR = 1; + SUCCESS = 2; +} + +message HealthCheckRequest {} + +message HealthCheckResponse { + enum ResponseStatus { + UNKNOWN = 0; + ERROR = 1; + SUCCESS = 2; + } + + ResponseStatus status = 1; + repeated Error errors = 2; +} + +message InitializeRequest { + string agentId = 1; + string proxyHost = 2; + int32 shardId = 3; +} + +message InitializeResponse { + ResponseStatus status = 1; + repeated Error errors = 2; + repeated string addresses = 3; + AlertConfig alertConfig = 4; +} + +message AlertConfig { + repeated CombinerBotSubscription subscriptions = 1; +} + +message CombinerBotSubscription { + string botId = 1; + string alertId = 2; + repeated string alertIds = 3; + uint64 chainId = 4; +} + +message EvaluateTxRequest { + string requestId = 1; + TransactionEvent event = 2; + int32 shardId = 3; +} + +message EvaluateBlockRequest { + string requestId = 1; + BlockEvent event = 2; + int32 shardId = 3; +} + +message EvaluateAlertRequest { + string requestId = 1; + AlertEvent event = 2; + string targetBotId = 3; + int32 shardId = 4; +} + +message EvaluateTxResponse { + ResponseStatus status = 1; + repeated Error errors = 2; + repeated Finding findings = 3; + map metadata = 4; + string timestamp = 5; + uint32 latencyMs = 6; + bool private = 7; +} + +message EvaluateBlockResponse { + ResponseStatus status = 1; + repeated Error errors = 2; + repeated Finding findings = 3; + map metadata = 4; + string timestamp = 5; + uint32 latencyMs = 6; + bool private = 7; +} + +message EvaluateAlertResponse { + ResponseStatus status = 1; + repeated Error errors = 2; + repeated Finding findings = 3; + map metadata = 4; + string timestamp = 5; + uint32 latencyMs = 6; + bool private = 7; +} + +message BlockEvent { + enum EventType { + BLOCK = 0; + REORG = 1 [deprecated = true]; + } + message Network { + string chainId = 1; + } + + message EthBlock { + string difficulty = 1; + string extraData = 2; + string gasLimit = 3; + string gasUsed = 4; + string hash = 5; + string logsBloom = 6; + string miner = 7; + string mixHash = 8; + string nonce = 9; + string number = 10; + string parentHash = 11; + string receiptsRoot = 12; + string sha3Uncles = 13; + string size = 14; + string stateRoot = 15; + string timestamp = 16; + string totalDifficulty = 17; + repeated string transactions = 18; + string transactionsRoot = 19; + repeated string uncles = 20; + string baseFeePerGas = 21; + } + + EventType type = 1; + string blockHash = 2; + string blockNumber = 3; + Network network = 4; + EthBlock block = 5; + TrackingTimestamps timestamps = 6; +} + +message TransactionEvent { + + enum EventType { + BLOCK = 0; + REORG = 1; + } + + message Network { + string chainId = 1; + } + + message EthBlock { + string blockHash = 1; + string blockNumber = 2; + string blockTimestamp = 3; + string baseFeePerGas = 4; + } + + message EthTransaction { + string type = 1; + string nonce = 2; + string gasPrice = 3; + string gas = 4; + string value = 5; + string input = 6; + string v = 7; + string r = 8; + string s = 9; + string to = 10; + string hash = 11; + string from = 12; + string maxFeePerGas = 13; + string maxPriorityFeePerGas = 14; + } + + message Log { + string address = 1; + repeated string topics = 2; + string data = 3; + string blockNumber = 4; + string transactionHash = 5; + string transactionIndex = 6; + string blockHash = 7; + string logIndex = 8; + bool removed = 9; + } + + message EthReceipt { + string root = 1; + string status = 2; + string cumulativeGasUsed = 3; + string logsBloom = 4; + repeated Log logs = 5; + string transactionHash = 6; + string contractAddress = 7; + string gasUsed = 8; + string blockHash = 9; + string blockNumber = 10; + string transactionIndex = 11; + } + + message TraceAction { + string callType = 1; + string to = 2; + string input = 3; + string from = 4; + string value = 5; + string init = 6; + string address = 7; + string balance = 8; + string refundAddress = 9; + } + + message TraceResult { + string gasUsed = 1; + string address = 2; + string code = 3; + string output = 4; + } + + message Trace { + TraceAction action = 1; + string blockHash = 2; + int64 blockNumber = 3; + TraceResult result = 4; + int64 subtraces = 5; + repeated int64 traceAddress = 6; + string transactionHash = 7; + int64 transactionPosition = 8; + string type = 9; + string error = 10; + } + + EventType type = 1; + EthTransaction transaction = 2; + EthReceipt receipt = 3 [deprecated = true]; + Network network = 4; + repeated Trace traces = 5; + map addresses = 6; + EthBlock block = 7; + repeated Log logs = 8; + bool isContractDeployment = 9; + string contractAddress = 10; + TrackingTimestamps timestamps = 11; + map txAddresses = 12; +} + +message AlertEvent { + message Alert { + message Contract { + string name = 1; + string projectId = 2; + } + + message Project { + string id = 1; + } + + message Block { + uint64 number = 1; + string hash = 2; + string timestamp = 3; + uint64 chainId = 4; + } + + message Bot { + repeated string chainIds = 1; + string createdAt = 2; + string description = 3; + string developer = 4; + string DocReference = 5; + bool enabled = 6; + string id = 7; + string image = 8; + string name = 9; + string reference = 10; + string repository = 11; + repeated string projects = 12; + repeated string scanNodes = 13; + string version = 14; + } + + message SourceAlertEvent { + string botId = 1; + string hash = 2; + string timestamp = 3; + uint64 chainId = 4; + } + + message Source { + string transactionHash = 1; + Bot bot = 2; + Block block = 3; + SourceAlertEvent sourceAlert = 4; + } + + message Label { + string label = 1; + float confidence = 2; + string entity = 3; + string entityType = 4; + bool remove = 5; + repeated string metadata = 6; + string uniqueKey = 7; + } + + // Unique string to identify this class of finding, + // primarily used to group similar findings for the end user + string alertId = 1; + // List of addresses involved in the alert + repeated string addresses = 2; + // List of contracts related to the alert + repeated Contract contracts = 3; + // Timestamp when the alert was published + string createdAt = 4; + string description = 5; + string hash = 6; + map metadata = 7; + string name = 8; + repeated Project projects = 9; + int32 scanNodeCount = 10; + string severity = 11; + Source source = 12; + string findingType = 13; + repeated string relatedAlerts = 14; + uint64 chainId = 15; + repeated Label labels = 16; + bool truncated = 17; + BloomFilter addressBloomFilter = 18; + } + + Alert alert = 1; + TrackingTimestamps timestamps = 2; +} diff --git a/csm-alerts/src/brief/proto/alert.proto b/csm-alerts/src/brief/proto/alert.proto new file mode 100644 index 000000000..16c089991 --- /dev/null +++ b/csm-alerts/src/brief/proto/alert.proto @@ -0,0 +1,179 @@ +syntax = "proto3"; + +package network.forta; + +option go_package = "./;protocol"; + +message TrackingTimestamps { + string block = 1; + string feed = 2; + string botRequest = 3; + string botResponse = 4; + string sourceAlert = 5; +} + +enum AlertType { + UNKNOWN_ALERT_TYPE = 0; + TRANSACTION = 1; + BLOCK = 2; + PRIVATE = 3; + COMBINATION = 4; + API = 5; +} + +message AgentInfo { + string image = 1; + string imageHash = 2; + string id = 3; + bool isTest = 4; + string manifest = 5; +} + +message ScannerInfo { + string address = 1; +} + +message AlertResponse { + repeated SignedAlert alerts = 1; + string nextPageToken = 2; +} + +message Signature { + string signature = 1; + string algorithm = 2; + string signer = 3; +} + +message BloomFilter { + string k = 1; + string m = 2; + string bitset = 3; + uint32 itemCount = 4; +} + +message Alert { + string id = 1; + AlertType type = 2; + Finding finding = 3; + string timestamp = 4; + map metadata = 5; + AgentInfo agent = 6; + map tags = 7; + ScannerInfo scanner = 8; + TrackingTimestamps timestamps = 9; + bool truncated = 10; + BloomFilter addressBloomFilter = 11; +} + +message SignedAlert { + Alert alert = 1; + Signature signature = 2; + string chainId = 3; + string blockNumber = 4; + string publishedWithTx = 5; +} + +message Label { + enum EntityType { + UNKNOWN_ENTITY_TYPE = 0; + ADDRESS = 1; + TRANSACTION = 2; + BLOCK = 3; + URL = 4; + } + + EntityType entityType = 1; + string entity = 2; + reserved 3; + float confidence = 4; + reserved 5; + bool remove = 6; + string label = 7; + repeated string metadata = 8; + string uniqueKey = 9; +} + +message Source { + message TransactionSource { + uint64 chainId = 1; + string hash = 2; + } + + message BlockSource { + uint64 chainId = 1; + string hash = 2; + uint64 number = 3; + } + + message URLSource { + string url = 1; + } + + message ChainSource { + uint64 chainId = 1; + } + + message AlertSource { + string id = 1; + } + + message CustomSource { + string name = 1; + string value = 2; + } + + repeated TransactionSource transactions = 1; + repeated BlockSource blocks = 2; + repeated URLSource urls = 3; + repeated ChainSource chains = 4; + repeated AlertSource alerts = 5; + repeated CustomSource customSources = 6; +} + +message Finding { + enum Severity { + UNKNOWN = 0; + INFO = 1; + LOW = 2; + MEDIUM = 3; + HIGH = 4; + CRITICAL = 5; + } + + enum FindingType { + UNKNOWN_TYPE = 0; + EXPLOIT = 1; + SUSPICIOUS = 2; + DEGRADED = 3; + INFORMATION = 4; + SCAM = 5; + } + + string protocol = 1; + Severity severity = 2; + map metadata = 3; + FindingType type = 4; + string alertId = 5; + string name = 6; + string description = 7; + reserved 8; + bool private = 9; + repeated string addresses = 10; + map indicators = 11; + repeated Label labels = 12; + repeated string relatedAlerts = 13; + string uniqueKey = 14; + Source source = 15; + string timestamp = 16; +} + +message APIAlert { + message APIAlertAgent { + string id = 1; + } + string id = 1; + AlertType type = 2; + Finding finding = 3; + APIAlertAgent agent = 4; + string timestamp = 5; +} \ No newline at end of file diff --git a/csm-alerts/src/clients/eth_provider.ts b/csm-alerts/src/clients/eth_provider.ts new file mode 100644 index 000000000..1c42e732e --- /dev/null +++ b/csm-alerts/src/clients/eth_provider.ts @@ -0,0 +1,160 @@ +import { ethers } from 'forta-agent' +import { either as E } from 'fp-ts' +import { retryAsync } from 'ts-retry' +import { + CSModule as CSModuleRunner, + CSAccounting as CSAccountingRunner, + CSFeeDistributor as CSFeeDistributorRunner, + CSFeeOracle as CSFeeOracleRunner, +} from '../generated/typechain' +import { NetworkError } from '../utils/errors' +import { Logger } from 'winston' +import { ICSAccountingClient } from '../services/CSAccounting/CSAccounting.srv' +import { Block } from '@ethersproject/providers' +import { ICSModuleClient } from '../services/CSModule/CSModule.srv' +import { ICSFeeOracleClient } from '../services/CSFeeOracle/CSFeeOracle.srv' +import { ICSFeeDistributorClient } from '../services/CSFeeDistributor/CSFeeDistributor.srv' +import { Metrics, StatusFail, StatusOK } from '../utils/metrics/metrics' +import { BlockDto } from '../entity/events' + +const DELAY_IN_500MS = 500 +const ATTEMPTS_5 = 5 + +export class ETHProvider implements ICSAccountingClient, ICSModuleClient, ICSFeeOracleClient, ICSFeeDistributorClient { + private jsonRpcProvider: ethers.providers.JsonRpcProvider + + private readonly csModuleRunner: CSModuleRunner + private readonly csAccountingRunner: CSAccountingRunner + private readonly csFeeDistributorRunner: CSFeeDistributorRunner + private csFeeOracleRunner: CSFeeOracleRunner + + private readonly logger: Logger + private readonly metrics: Metrics + + constructor( + logger: Logger, + metrcs: Metrics, + jsonRpcProvider: ethers.providers.JsonRpcProvider, + csModuleRunner: CSModuleRunner, + csAccountingRunner: CSAccountingRunner, + csFeeDistributorRunner: CSFeeDistributorRunner, + csFeeOracleRunner: CSFeeOracleRunner, + ) { + this.jsonRpcProvider = jsonRpcProvider + this.csModuleRunner = csModuleRunner + this.csAccountingRunner = csAccountingRunner + this.csFeeDistributorRunner = csFeeDistributorRunner + this.csFeeOracleRunner = csFeeOracleRunner + this.logger = logger + this.metrics = metrcs + } + + public async getBlockNumber(): Promise> { + const end = this.metrics.etherJsDurationHistogram.labels({ method: 'getBlockNumber' }).startTimer() + try { + const latestBlockNumber = await this.jsonRpcProvider.getBlockNumber() + + this.metrics.etherJsRequest.labels({ method: 'getBlockNumber', status: StatusOK }).inc() + end({ status: StatusOK }) + + return E.right(latestBlockNumber) + } catch (e) { + this.metrics.etherJsRequest.labels({ method: 'getBlockNumber', status: StatusFail }).inc() + end({ status: StatusFail }) + + return E.left(new NetworkError(e, `Could not fetch latest block number`)) + } + } + + public async getBlockByHash(blockHash: string): Promise> { + const end = this.metrics.etherJsDurationHistogram.startTimer({ method: 'getBlockByHash' }) + + try { + const out = await retryAsync( + async (): Promise => { + return await this.jsonRpcProvider.getBlock(blockHash) + }, + { delay: DELAY_IN_500MS, maxTry: ATTEMPTS_5 }, + ) + + this.metrics.etherJsRequest.labels({ method: 'getBlockByHash', status: StatusOK }).inc() + end({ status: StatusOK }) + + return E.right({ + number: out.number, + timestamp: out.timestamp, + parentHash: out.parentHash, + hash: out.hash, + }) + } catch (e) { + this.metrics.etherJsRequest.labels({ method: 'getBlockByHash', status: StatusFail }).inc() + end({ status: StatusFail }) + + return E.left(new NetworkError(e, `Could not call jsonRpcProvider.getBlock(blockHash)`)) + } + } + + public async getBlockByNumber(blockNumber: number): Promise> { + const end = this.metrics.etherJsDurationHistogram.startTimer({ method: this.getBlockByNumber.name }) + + try { + const out = await retryAsync( + async (): Promise => { + return await this.jsonRpcProvider.getBlock(blockNumber) + }, + { delay: DELAY_IN_500MS, maxTry: ATTEMPTS_5 }, + ) + + this.metrics.etherJsRequest.labels({ method: this.getBlockByNumber.name, status: StatusOK }).inc() + end({ status: StatusOK }) + + return E.right({ + number: out.number, + timestamp: out.timestamp, + parentHash: out.parentHash, + hash: out.hash, + }) + } catch (e) { + this.metrics.etherJsRequest.labels({ method: this.getBlockByNumber.name, status: StatusFail }).inc() + end({ status: StatusFail }) + + return E.left(new NetworkError(e, `Could not call jsonRpcProvider.${this.getBlockByNumber.name}`)) + } + } + + public async getChainPrevBlocks(parentHash: string, depth: number): Promise> { + const end = this.metrics.etherJsDurationHistogram.startTimer({ method: 'getChainPrevBlocks' }) + const chain = new Array(depth) + + while (depth > 0) { + try { + const prevBlock = await retryAsync( + async (): Promise => { + const parentBlock = await this.getBlockByHash(parentHash) + + if (E.isLeft(parentBlock)) { + throw parentBlock.left + } + + return parentBlock.right + }, + { delay: DELAY_IN_500MS, maxTry: ATTEMPTS_5 }, + ) + + chain[depth - 1] = prevBlock + parentHash = prevBlock.parentHash + depth -= 1 + } catch (e) { + this.metrics.etherJsRequest.labels({ method: 'getChainPrevBlocks', status: StatusFail }).inc() + end({ status: StatusFail }) + + return E.left(new NetworkError(e, `Could not call this.getBlockByHash(parentHash)`)) + } + } + + this.metrics.etherJsRequest.labels({ method: 'getChainPrevBlocks', status: StatusOK }).inc() + end({ status: StatusOK }) + + return E.right(chain) + } +} diff --git a/csm-alerts/src/clients/mocks/mock.ts b/csm-alerts/src/clients/mocks/mock.ts new file mode 100644 index 000000000..494f9f0e0 --- /dev/null +++ b/csm-alerts/src/clients/mocks/mock.ts @@ -0,0 +1,5 @@ +import { IEtherscanProvider } from '../eth_provider' + +export const EtherscanProviderMock = (): jest.Mocked => ({ + getBalance: jest.fn(), +}) diff --git a/csm-alerts/src/entity/events.ts b/csm-alerts/src/entity/events.ts new file mode 100644 index 000000000..3a074646b --- /dev/null +++ b/csm-alerts/src/entity/events.ts @@ -0,0 +1,99 @@ +import { Log } from '@ethersproject/abstract-provider' +import * as agent_pb from '../generated/proto/agent_pb' +import { TransactionEvent } from '../generated/proto/agent_pb' +import BigNumber from 'bignumber.js' +import { formatAddress } from 'forta-agent/dist/cli/utils' +import { Finding } from '../generated/proto/alert_pb' +import { ethers } from 'ethers' + +export type EventOfNotice = { + name: string + address: string + abi: string + alertId: string + description: CallableFunction + severity: Finding.Severity + type: Finding.FindingType +} + +export type BlockDto = { + number: number + timestamp: number + parentHash: string + hash: string +} + +export type TransactionDto = { + logs: Log[] + to: string | null + block: { + timestamp: number + number: number + } +} + +export function newTransactionDto(request: agent_pb.EvaluateTxRequest): TransactionDto { + const txEvent = request.getEvent() + const transaction = txEvent.getTransaction() + const logList = >txEvent.getLogsList() + const block = txEvent.getBlock() + + const logs: Log[] = [] + for (const l of logList) { + logs.push({ + blockNumber: new BigNumber(l.getBlocknumber(), 10).toNumber(), + blockHash: l.getTransactionhash(), + transactionIndex: new BigNumber(l.getTransactionindex(), 10).toNumber(), + removed: l.getRemoved(), + address: l.getAddress(), + data: l.getData(), + topics: l.getTopicsList(), + transactionHash: l.getTransactionhash(), + logIndex: new BigNumber(l.getLogindex(), 10).toNumber(), + }) + } + + return { + logs: logs, + to: transaction.getTo() ? formatAddress(transaction.getTo()) : null, + block: { + number: new BigNumber(block.getBlocknumber(), 10).toNumber(), + timestamp: new BigNumber(block.getBlocktimestamp(), 10).toNumber(), + }, + } +} + +export function handleEventsOfNotice(txEvent: TransactionDto, eventsOfNotice: EventOfNotice[]): Finding[] { + const out: Finding[] = [] + + const addresses = new Set(eventsOfNotice.map((event) => event.address.toLowerCase())) + + for (const log of txEvent.logs) { + if (addresses.has(log.address.toLowerCase())) { + for (const eventInfo of eventsOfNotice) { + const parser = new ethers.utils.Interface([eventInfo.abi]) + + try { + const logDesc = parser.parseLog(log) + const f: Finding = new Finding() + + f.setName(eventInfo.name) + f.setDescription(eventInfo.description(logDesc.args)) + f.setAlertid(eventInfo.alertId) + f.setSeverity(eventInfo.severity) + f.setType(eventInfo.type) + f.setProtocol('ethereum') + const m = f.getMetadataMap() + m.set('args', String(logDesc.args)) + + out.push(f) + } catch (e) { + // Only one from eventsOfNotice could be correct + // Others - skipping + } + } + } + } + + return out +} diff --git a/csm-alerts/src/entity/metadata.ts b/csm-alerts/src/entity/metadata.ts new file mode 100644 index 000000000..32745c4d7 --- /dev/null +++ b/csm-alerts/src/entity/metadata.ts @@ -0,0 +1 @@ +export type Metadata = { [key: string]: string } diff --git a/csm-alerts/src/handlers/alert.handler.ts b/csm-alerts/src/handlers/alert.handler.ts new file mode 100644 index 000000000..2ee864d13 --- /dev/null +++ b/csm-alerts/src/handlers/alert.handler.ts @@ -0,0 +1,18 @@ +import { sendUnaryData, ServerUnaryCall } from '@grpc/grpc-js' +import { EvaluateAlertRequest, EvaluateAlertResponse, ResponseStatus } from '../generated/proto/agent_pb' + +export class AlertHandler { + public handleAlert() { + return async ( + call: ServerUnaryCall, + callback: sendUnaryData, + ) => { + const resp = new EvaluateAlertResponse() + resp.setStatus(ResponseStatus.SUCCESS) + resp.setFindingsList([]) + resp.setTimestamp(new Date().toISOString()) + + callback(null, resp) + } + } +} diff --git a/csm-alerts/src/handlers/block.handler.ts b/csm-alerts/src/handlers/block.handler.ts new file mode 100644 index 000000000..a723aac04 --- /dev/null +++ b/csm-alerts/src/handlers/block.handler.ts @@ -0,0 +1,103 @@ +import { sendUnaryData, ServerUnaryCall } from '@grpc/grpc-js' +import { BlockEvent, EvaluateBlockRequest, EvaluateBlockResponse, ResponseStatus } from '../generated/proto/agent_pb' +import { CSModuleSrv } from '../services/CSModule/CSModule.srv' +import { HealthChecker } from '../services/health-checker/health-checker.srv' +import { CSAccountingSrv } from '../services/CSAccounting/CSAccounting.srv' +import { CSFeeOracleSrv } from '../services/CSFeeOracle/CSFeeOracle.srv' +import { CSFeeDistributorSrv } from '../services/CSFeeDistributor/CSFeeDistributor.srv' +import { Logger } from 'winston' +import { elapsedTime } from '../utils/time' +import { BlockDto } from '../entity/events' +import BigNumber from 'bignumber.js' +import { Finding } from '../generated/proto/alert_pb' +import { HandleBlockLabel, Metrics, StatusFail, StatusOK } from '../utils/metrics/metrics' + +export class BlockHandler { + private logger: Logger + private metrics: Metrics + private csModuleSrv: CSModuleSrv + private csAccountingSrv: CSAccountingSrv + private csFeeDistributorSrv: CSFeeDistributorSrv + private csFeeOracleSrv: CSFeeOracleSrv + private healthChecker: HealthChecker + + private onAppStartFindings: Finding[] = [] + + constructor( + logger: Logger, + metrics: Metrics, + csModuleSrv: CSModuleSrv, + csAccountingSrv: CSAccountingSrv, + csFeeDistributorSrv: CSFeeDistributorSrv, + csFeeOracleSrv: CSFeeOracleSrv, + healthChecker: HealthChecker, + onAppStartFindings: Finding[], + ) { + this.logger = logger + this.metrics = metrics + this.csModuleSrv = csModuleSrv + this.csAccountingSrv = csAccountingSrv + this.csFeeDistributorSrv = csFeeDistributorSrv + this.csFeeOracleSrv = csFeeOracleSrv + this.healthChecker = healthChecker + this.onAppStartFindings = onAppStartFindings + } + + public handleBlock() { + return async ( + call: ServerUnaryCall, + callback: sendUnaryData, + ) => { + this.metrics.lastAgentTouch.labels({ method: HandleBlockLabel }).set(new Date().getTime()) + const end = this.metrics.summaryHandlers.labels({ method: HandleBlockLabel }).startTimer() + + const event = call.request.getEvent() + const block = event.getBlock() + + const blockDtoEvent: BlockDto = { + number: new BigNumber(block.getNumber(), 10).toNumber(), + timestamp: new BigNumber(block.getTimestamp(), 10).toNumber(), + parentHash: block.getParenthash(), + hash: block.getHash(), + } + + this.logger.info(`#ETH block: ${blockDtoEvent.number}`) + const startTime = new Date().getTime() + + const findings: Finding[] = [] + if (this.onAppStartFindings.length > 0) { + findings.push(...this.onAppStartFindings) + this.onAppStartFindings = [] + } + + const [csModuleFindings, csAccountingFindings, csFeeDistributorFindings, csFeeOracleFindings] = await Promise.all( + [ + this.csModuleSrv.handleBlock(blockDtoEvent), + this.csAccountingSrv.handleBlock(blockDtoEvent), + this.csFeeDistributorSrv.handleBlock(blockDtoEvent), + this.csFeeOracleSrv.handleBlock(blockDtoEvent), + ], + ) + + findings.push(...csModuleFindings, ...csAccountingFindings, ...csFeeDistributorFindings, ...csFeeOracleFindings) + + const errCount = this.healthChecker.check(findings) + errCount === 0 + ? this.metrics.processedIterations.labels({ method: HandleBlockLabel, status: StatusOK }).inc() + : this.metrics.processedIterations.labels({ method: HandleBlockLabel, status: StatusFail }).inc() + + const blockResponse = new EvaluateBlockResponse() + blockResponse.setStatus(ResponseStatus.SUCCESS) + blockResponse.setPrivate(false) + blockResponse.setFindingsList(findings) + const m = blockResponse.getMetadataMap() + m.set('timestamp', new Date().toISOString()) + + this.logger.info(elapsedTime('handleBlock', startTime) + '\n') + this.metrics.lastBlockNumber.set(blockDtoEvent.number) + + end() + callback(null, blockResponse) + } + } +} diff --git a/csm-alerts/src/handlers/health.handler.ts b/csm-alerts/src/handlers/health.handler.ts new file mode 100644 index 000000000..403730746 --- /dev/null +++ b/csm-alerts/src/handlers/health.handler.ts @@ -0,0 +1,78 @@ +import { HealthChecker } from '../services/health-checker/health-checker.srv' +import { sendUnaryData, ServerUnaryCall } from '@grpc/grpc-js' +import * as agent_pb from '../generated/proto/agent_pb' +import { HealthCheckRequest, HealthCheckResponse, ResponseStatus } from '../generated/proto/agent_pb' +import { Metrics } from '../utils/metrics/metrics' +import express, { Request, Response } from 'express' +import BigNumber from 'bignumber.js' +import { Logger } from 'winston' + +export class HealthHandler { + private healthChecker: HealthChecker + private metrics: Metrics + private logger: Logger + private readonly ethereumRpcUrl: string + private readonly chainId: number + + constructor(healthChecker: HealthChecker, metrics: Metrics, logger: Logger, ethereumRpcUrl: string, chainId: number) { + this.healthChecker = healthChecker + this.metrics = metrics + this.logger = logger + this.ethereumRpcUrl = ethereumRpcUrl + this.chainId = chainId + } + + public healthGrpc() { + return async ( + call: ServerUnaryCall, + callback: sendUnaryData, + ) => { + const resp = new HealthCheckResponse() + resp.setStatus(ResponseStatus.SUCCESS) + this.metrics.healthStatus.set(1) + + if (!this.healthChecker.isHealth()) { + const e: agent_pb.Error = new agent_pb.Error() + e.setMessage('There is too much network errors') + + const errList: Array = [] + errList.push(e) + + resp.setErrorsList(errList) + this.metrics.healthStatus.set(0) + } + + callback(null, resp) + } + } + + public healthHttp(): express.Handler { + return async (req: Request, res: Response) => { + try { + type data = { + jsonrpc: string + id: number + result: string + } + + const resp = await fetch(this.ethereumRpcUrl, { + method: 'POST', + body: JSON.stringify({ + method: 'eth_chainId', + }), + }) + + // @ts-expect-error @typescript-eslint/ban-ts-comment + const data: data = await resp.json() + const chainId = new BigNumber(data.result) + if (chainId.toNumber() === this.chainId) { + return res.status(200).send('ok') + } + } catch (e) { + this.logger.error(e) + } + + return res.status(503).send('not ok') + } + } +} diff --git a/csm-alerts/src/handlers/init.handler.ts b/csm-alerts/src/handlers/init.handler.ts new file mode 100644 index 000000000..fed415e12 --- /dev/null +++ b/csm-alerts/src/handlers/init.handler.ts @@ -0,0 +1,93 @@ +import { sendUnaryData, ServerUnaryCall } from '@grpc/grpc-js' +import { InitializeRequest, InitializeResponse, ResponseStatus } from '../generated/proto/agent_pb' +import { Logger } from 'winston' +import { CSFeeDistributorSrv } from '../services/CSFeeDistributor/CSFeeDistributor.srv' +import { CSModuleSrv } from '../services/CSModule/CSModule.srv' +import { CSAccountingSrv } from '../services/CSAccounting/CSAccounting.srv' +import { CSFeeOracleSrv } from '../services/CSFeeOracle/CSFeeOracle.srv' +import { Metadata } from '../entity/metadata' +import Version from '../utils/version' +import { elapsedTime } from '../utils/time' +import { Finding } from '../generated/proto/alert_pb' +import { ProxyWatcherSrv } from '../services/ProxyWatcher/ProxyWatcher.srv' + +export class InitHandler { + private readonly logger: Logger + private readonly csModuleSrv: CSModuleSrv + private readonly csFeeDistributorSrv: CSFeeDistributorSrv + private readonly csAccountingSrv: CSAccountingSrv + private readonly csFeeOracleSrv: CSFeeOracleSrv + private readonly proxyWatcherSrv: ProxyWatcherSrv + private readonly appName: string + private readonly latestBlockNumber: number + + private onAppStartFindings: Finding[] = [] + + constructor( + appName: string, + logger: Logger, + csModuleSrv: CSModuleSrv, + csFeeDistributorSrv: CSFeeDistributorSrv, + csAccountingSrv: CSAccountingSrv, + csFeeOracleSrv: CSFeeOracleSrv, + proxyWatcherSrv: ProxyWatcherSrv, + onAppStartFindings: Finding[], + latestBlockNumber: number, + ) { + this.appName = appName + this.logger = logger + this.csModuleSrv = csModuleSrv + this.csFeeDistributorSrv = csFeeDistributorSrv + this.csAccountingSrv = csAccountingSrv + this.csFeeOracleSrv = csFeeOracleSrv + this.proxyWatcherSrv = proxyWatcherSrv + this.onAppStartFindings = onAppStartFindings + this.latestBlockNumber = latestBlockNumber + } + + public handleInit() { + return async ( + call: ServerUnaryCall, + callback: sendUnaryData, + ) => { + const startTime = new Date().getTime() + + const metadata: Metadata = { + 'version.commitHash': Version.commitHash, + 'version.commitMsg': Version.commitMsg, + } + + const agents: string[] = [ + this.csModuleSrv.getName(), + this.csFeeDistributorSrv.getName(), + this.csAccountingSrv.getName(), + this.csFeeOracleSrv.getName(), + this.proxyWatcherSrv.getName(), + ] + metadata.agents = '[' + agents.toString() + ']' + + await this.csModuleSrv.initialize(this.latestBlockNumber) + await this.csFeeDistributorSrv.initialize(this.latestBlockNumber) + await this.csAccountingSrv.initialize(this.latestBlockNumber) + await this.csFeeOracleSrv.initialize(this.latestBlockNumber) + await this.proxyWatcherSrv.initialize(this.latestBlockNumber) + + const f: Finding = new Finding() + f.setName(`${this.appName} launched`) + f.setDescription(`Version: ${Version.desc}`) + f.setAlertid('LIDO-AGENT-LAUNCHED') + f.setSeverity(Finding.Severity.INFO) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + this.onAppStartFindings.push(f) + + this.logger.info(elapsedTime('Agent.initialize', startTime) + '\n') + + const resp = new InitializeResponse() + resp.setStatus(ResponseStatus.SUCCESS) + + callback(null, resp) + } + } +} diff --git a/csm-alerts/src/handlers/tx.handler.ts b/csm-alerts/src/handlers/tx.handler.ts new file mode 100644 index 000000000..3806682df --- /dev/null +++ b/csm-alerts/src/handlers/tx.handler.ts @@ -0,0 +1,82 @@ +import { sendUnaryData, ServerUnaryCall } from '@grpc/grpc-js' +import { CSModuleSrv } from '../services/CSModule/CSModule.srv' +import { HealthChecker } from '../services/health-checker/health-checker.srv' +import { CSAccountingSrv } from '../services/CSAccounting/CSAccounting.srv' +import { CSFeeOracleSrv } from '../services/CSFeeOracle/CSFeeOracle.srv' +import { CSFeeDistributorSrv } from '../services/CSFeeDistributor/CSFeeDistributor.srv' +import { EvaluateTxRequest, EvaluateTxResponse, ResponseStatus } from '../generated/proto/agent_pb' +import { newTransactionDto } from '../entity/events' +import { Finding } from '../generated/proto/alert_pb' +import { HandleTxLabel, Metrics, StatusFail, StatusOK } from '../utils/metrics/metrics' +import { ProxyWatcherSrv } from '../services/ProxyWatcher/ProxyWatcher.srv' + +export class TxHandler { + private metrics: Metrics + private csModuleSrv: CSModuleSrv + private csFeeDistributorSrv: CSFeeDistributorSrv + private csAccountingSrv: CSAccountingSrv + private csFeeOracleSrv: CSFeeOracleSrv + private proxyWatcherSrv: ProxyWatcherSrv + private healthChecker: HealthChecker + + constructor( + metrics: Metrics, + csModuleSrv: CSModuleSrv, + csFeeDistributorSrv: CSFeeDistributorSrv, + csAccountingSrv: CSAccountingSrv, + csFeeOracleSrv: CSFeeOracleSrv, + proxyWatcherSrv: ProxyWatcherSrv, + healthChecker: HealthChecker, + ) { + this.metrics = metrics + this.csModuleSrv = csModuleSrv + this.csFeeDistributorSrv = csFeeDistributorSrv + this.csAccountingSrv = csAccountingSrv + this.csFeeOracleSrv = csFeeOracleSrv + this.proxyWatcherSrv = proxyWatcherSrv + this.healthChecker = healthChecker + } + + public handleTx() { + return async ( + call: ServerUnaryCall, + callback: sendUnaryData, + ) => { + const end = this.metrics.summaryHandlers.labels({ method: HandleTxLabel }).startTimer() + this.metrics.lastAgentTouch.labels({ method: HandleTxLabel }).set(new Date().getTime()) + + const txEvent = newTransactionDto(call.request) + + const findings: Finding[] = [] + + const csModuleFindings = this.csModuleSrv.handleTransaction(txEvent) + const csFeeDistributorFindings = await this.csFeeDistributorSrv.handleTransaction(txEvent) + const csAccountingFindings = this.csAccountingSrv.handleTransaction(txEvent) + const csFeeOracleFindings = this.csFeeOracleSrv.handleTransaction(txEvent) + const proxyWatcherFindings = this.proxyWatcherSrv.handleTransaction(txEvent) + + findings.push( + ...csModuleFindings, + ...csFeeDistributorFindings, + ...csAccountingFindings, + ...csFeeOracleFindings, + ...proxyWatcherFindings, + ) + + const errCount = this.healthChecker.check(findings) + errCount === 0 + ? this.metrics.processedIterations.labels({ method: HandleTxLabel, status: StatusOK }).inc() + : this.metrics.processedIterations.labels({ method: HandleTxLabel, status: StatusFail }).inc() + + const txResponse = new EvaluateTxResponse() + txResponse.setStatus(ResponseStatus.SUCCESS) + txResponse.setPrivate(false) + txResponse.setFindingsList(findings) + const m = txResponse.getMetadataMap() + m.set('timestamp', new Date().toISOString()) + + end() + callback(null, txResponse) + } + } +} diff --git a/csm-alerts/src/main.ts b/csm-alerts/src/main.ts new file mode 100644 index 000000000..8326c1533 --- /dev/null +++ b/csm-alerts/src/main.ts @@ -0,0 +1,241 @@ +import * as grpc from '@grpc/grpc-js' +import { either as E } from 'fp-ts' +import { BlockHandler } from './handlers/block.handler' +import { HealthHandler } from './handlers/health.handler' +import { TxHandler } from './handlers/tx.handler' +import { InitHandler } from './handlers/init.handler' +import { AlertHandler } from './handlers/alert.handler' +import { AgentService } from './generated/proto/agent_grpc_pb' +import { Express, Request, Response } from 'express' +import Version from './utils/version' +import { Finding } from './generated/proto/alert_pb' +import { + CSModule__factory, + CSAccounting__factory, + CSFeeDistributor__factory, + CSFeeOracle__factory, +} from './generated/typechain' +import { Config } from './utils/env/env' +import * as Winston from 'winston' +import { ethers } from 'ethers' +import { ETHProvider } from './clients/eth_provider' +import { getCSFeeDistributorEvents } from './utils/events/cs_fee_distributor_events' +import { getCSFeeOracleEvents, getHashConsensusEvents } from './utils/events/cs_fee_oracle_events' +import { getOssifiedProxyEvents } from './utils/events/ossified_proxy_events' +import { getPausableEvents } from './utils/events/pausable_events' +import { getCSAccountingEvents } from './utils/events/cs_accounting_events' +import { getAssetRecovererEvents } from './utils/events/asset_recoverer_events' +import * as promClient from 'prom-client' +import { Metrics } from './utils/metrics/metrics' +import { CSModuleSrv } from './services/CSModule/CSModule.srv' +import { CSFeeDistributorSrv } from './services/CSFeeDistributor/CSFeeDistributor.srv' +import { CSAccountingSrv } from './services/CSAccounting/CSAccounting.srv' +import { CSFeeOracleSrv } from './services/CSFeeOracle/CSFeeOracle.srv' +import { BorderTime, HealthChecker, MaxNumberErrorsPerBorderTime } from './services/health-checker/health-checker.srv' +import { getEthersProvider } from 'forta-agent/dist/sdk/utils' +import express = require('express') +import { ProxyWatcherSrv } from './services/ProxyWatcher/ProxyWatcher.srv' +import { + CONTRACTS_WITH_ASSET_RECOVERER, + CSM_PROXY_CONTRACTS, + PAUSABLE_CONTRACTS, + DeploymentAddresses, +} from './utils/constants.mainnet' +import { + CONTRACTS_WITH_ASSET_RECOVERER as HOLESKY_CONTRACTS_WITH_ASSET_RECOVERER, + CSM_PROXY_CONTRACTS as HOLESKY_CSM_PROXY_CONTRACTS, + PAUSABLE_CONTRACTS as HOLESKY_PAUSABLE_CONTRACTS, + DeploymentAddresses as HoleskyDeploymentAddresses, +} from './utils/constants.holesky' + +const loadDeploymentData = (chainId: number) => { + switch (chainId) { + case 1: + return { + deploymentAddresses: DeploymentAddresses, + contractsWithAssetRecoverer: CONTRACTS_WITH_ASSET_RECOVERER, + csmProxyContracts: CSM_PROXY_CONTRACTS, + pausableContracts: PAUSABLE_CONTRACTS, + } + case 17000: + return { + deploymentAddresses: HoleskyDeploymentAddresses, + contractsWithAssetRecoverer: HOLESKY_CONTRACTS_WITH_ASSET_RECOVERER, + csmProxyContracts: HOLESKY_CSM_PROXY_CONTRACTS, + pausableContracts: HOLESKY_PAUSABLE_CONTRACTS, + } + default: + throw new Error(`Unsupported chain ID: ${chainId}`) + } +} + +const main = async () => { + const config = new Config() + if (config.dataProvider === '') { + console.log('Could not set up dataProvider') + process.exit(1) + } + + const logger: Winston.Logger = Winston.createLogger({ + format: config.logFormat === 'simple' ? Winston.format.simple() : Winston.format.json(), + transports: [new Winston.transports.Console()], + }) + + const defaultRegistry = promClient + defaultRegistry.collectDefaultMetrics({ + prefix: config.promPrefix, + }) + + const customRegister = new promClient.Registry() + const mergedRegistry = promClient.Registry.merge([defaultRegistry.register, customRegister]) + mergedRegistry.setDefaultLabels({ instance: config.instance, dataProvider: config.dataProvider }) + + const metrics = new Metrics(mergedRegistry, config.promPrefix) + + const ethProvider = new ethers.providers.JsonRpcProvider(config.ethereumRpcUrl) + let fortaEthersProvider = getEthersProvider() + if (!config.useFortaProvider) { + fortaEthersProvider = ethProvider + } + + const { deploymentAddresses, contractsWithAssetRecoverer, csmProxyContracts, pausableContracts } = loadDeploymentData( + config.chainId, + ) + + const address = deploymentAddresses + + const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) + const csAccountingRunner = CSAccounting__factory.connect(address.CS_ACCOUNTING_ADDRESS, fortaEthersProvider) + const csFeeDistributorRunner = CSFeeDistributor__factory.connect( + address.CS_FEE_DISTRIBUTOR_ADDRESS, + fortaEthersProvider, + ) + const csFeeOracleRunner = CSFeeOracle__factory.connect(address.CS_FEE_ORACLE_ADDRESS, fortaEthersProvider) + + const ethClient = new ETHProvider( + logger, + metrics, + fortaEthersProvider, + csModuleRunner, + csAccountingRunner, + csFeeDistributorRunner, + csFeeOracleRunner, + ) + + const csModuleSrv = new CSModuleSrv(logger, ethClient) + + const csFeeDistributorSrv = new CSFeeDistributorSrv( + logger, + ethClient, + getCSFeeDistributorEvents(address.CS_FEE_DISTRIBUTOR_ADDRESS), + address.CS_ACCOUNTING_ADDRESS, + address.CS_FEE_DISTRIBUTOR_ADDRESS, + address.LIDO_STETH_ADDRESS, + address.HASH_CONSENSUS_ADDRESS, + ) + + const csAccountingSrv = new CSAccountingSrv( + logger, + ethClient, + getCSAccountingEvents(address.CS_ACCOUNTING_ADDRESS), + address.CS_ACCOUNTING_ADDRESS, + address.LIDO_STETH_ADDRESS, + ) + + const csFeeOracleSrv = new CSFeeOracleSrv( + logger, + ethClient, + getHashConsensusEvents(address.HASH_CONSENSUS_ADDRESS), + getCSFeeOracleEvents(address.CS_FEE_ORACLE_ADDRESS), + address.HASH_CONSENSUS_ADDRESS, + address.CS_FEE_ORACLE_ADDRESS, + ) + + const proxyWatcherSrv = new ProxyWatcherSrv( + logger, + ethClient, + getOssifiedProxyEvents(csmProxyContracts), + getPausableEvents(pausableContracts), + getAssetRecovererEvents(contractsWithAssetRecoverer), + ) + + const onAppFindings: Finding[] = [] + + const healthChecker = new HealthChecker(logger, metrics, BorderTime, MaxNumberErrorsPerBorderTime) + + const gRPCserver = new grpc.Server() + const blockH = new BlockHandler( + logger, + metrics, + csModuleSrv, + csAccountingSrv, + csFeeDistributorSrv, + csFeeOracleSrv, + healthChecker, + onAppFindings, + ) + const txH = new TxHandler( + metrics, + csModuleSrv, + csFeeDistributorSrv, + csAccountingSrv, + csFeeOracleSrv, + proxyWatcherSrv, + healthChecker, + ) + const healthH = new HealthHandler(healthChecker, metrics, logger, config.ethereumRpcUrl, config.chainId) + + const latestBlockNumber = await ethClient.getBlockNumber() + if (E.isLeft(latestBlockNumber)) { + logger.error(latestBlockNumber.left) + + process.exit(1) + } + + const initH = new InitHandler( + config.appName, + logger, + csModuleSrv, + csFeeDistributorSrv, + csAccountingSrv, + csFeeOracleSrv, + proxyWatcherSrv, + onAppFindings, + latestBlockNumber.right, + ) + const alertH = new AlertHandler() + + gRPCserver.addService(AgentService, { + initialize: initH.handleInit(), + evaluateBlock: blockH.handleBlock(), + evaluateTx: txH.handleTx(), + healthCheck: healthH.healthGrpc(), + evaluateAlert: alertH.handleAlert(), + }) + + metrics.buildInfo.set({ commitHash: Version.commitHash }, 1) + + gRPCserver.bindAsync(`0.0.0.0:${config.grpcPort}`, grpc.ServerCredentials.createInsecure(), (err, port) => { + if (err != null) { + logger.error(err) + + process.exit(1) + } + logger.info(`${config.appName} is listening on ${port}`) + }) + + const httpService: Express = express() + + httpService.get('/metrics', async (req: Request, res: Response) => { + res.set('Content-Type', mergedRegistry.contentType) + res.send(await mergedRegistry.metrics()) + }) + + httpService.get('/health', healthH.healthHttp()) + + httpService.listen(config.httpPort, () => { + logger.info(`Http server is running at http://localhost:${config.httpPort}`) + }) +} + +main() diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts new file mode 100644 index 000000000..6c80064be --- /dev/null +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts @@ -0,0 +1,160 @@ +import { DeploymentAddress, DeploymentAddresses } from '../../utils/constants.holesky' +import { expect } from '@jest/globals' +import { TransactionDto } from '../../entity/events' +import { + CSModule__factory, + CSAccounting__factory, + CSFeeDistributor__factory, + CSFeeOracle__factory, +} from '../../generated/typechain' +import { getCSAccountingEvents } from '../../utils/events/cs_accounting_events' +import { CSAccountingSrv, ICSAccountingClient } from './CSAccounting.srv' +import * as Winston from 'winston' +import { ETHProvider } from '../../clients/eth_provider' +import { ethers } from 'forta-agent' +import { getFortaConfig } from 'forta-agent/dist/sdk/utils' +import promClient from 'prom-client' +import { Metrics } from '../../utils/metrics/metrics' + +const TEST_TIMEOUT = 120_000 // ms + +describe('CSAccounting event tests', () => { + const chainId = 17000 + + const logger: Winston.Logger = Winston.createLogger({ + format: Winston.format.simple(), + transports: [new Winston.transports.Console()], + }) + + const address: DeploymentAddress = DeploymentAddresses + + const fortaEthersProvider = new ethers.providers.JsonRpcProvider(getFortaConfig().jsonRpcUrl, chainId) + const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) + const csAccountingRunner = CSAccounting__factory.connect(address.CS_ACCOUNTING_ADDRESS, fortaEthersProvider) + const csFeeDistributorRunner = CSFeeDistributor__factory.connect( + address.CS_FEE_DISTRIBUTOR_ADDRESS, + fortaEthersProvider, + ) + const csFeeOracleRunner = CSFeeOracle__factory.connect(address.CS_FEE_ORACLE_ADDRESS, fortaEthersProvider) + + const registry = new promClient.Registry() + const m = new Metrics(registry, 'test_') + + const csAccountingClient: ICSAccountingClient = new ETHProvider( + logger, + m, + fortaEthersProvider, + csModuleRunner, + csAccountingRunner, + csFeeDistributorRunner, + csFeeOracleRunner, + ) + + const csAccountingSrv = new CSAccountingSrv( + logger, + csAccountingClient, + getCSAccountingEvents(address.CS_ACCOUNTING_ADDRESS), + address.CS_ACCOUNTING_ADDRESS, + address.LIDO_STETH_ADDRESS, + ) + + test( + '🚨 CSAccounting: Bond Curve Updated', + async () => { + const txHash = '0x8b904da83d58e520c778cc562b10fa4e0943a9f991b9050d93481fdabf2da9c2' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const results = csAccountingSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) + }, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ CSAccounting: Bond Curve added, stETH Approval', + async () => { + const txHash = '0xcc92653babec3b1748d8e04de777796cab2d1ae40fbe926db857e9103a9b74a5' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const results = csAccountingSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(4) + }, + TEST_TIMEOUT, + ) + + test( + '🚨 CSAccounting: Charge Penalty Recipient Set', + async () => { + const txHash = '0xf62269919009e1cb9c6ea8c29cb6c83f9c1d113d97d401ed5ff2b696cee6d82f' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const results = csAccountingSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) + }, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ CSAccounting: Bond Curve Set', + async () => { + const txHash = '0xcea4d214c8f6e4f3415fc941fdb6802f4243a7b3e12ba5288cf7e7df39d457a0' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const results = csAccountingSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) + }, + TEST_TIMEOUT, + ) +}) diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts new file mode 100644 index 000000000..e643fc892 --- /dev/null +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts @@ -0,0 +1,107 @@ +import { elapsedTime } from '../../utils/time' +import { either as E } from 'fp-ts' +import { Logger } from 'winston' +import { BlockDto, EventOfNotice, TransactionDto, handleEventsOfNotice } from '../../entity/events' +import { Finding } from '../../generated/proto/alert_pb' +import { filterLog } from 'forta-agent' +import { APPROVAL_EVENT } from '../../utils/events/cs_accounting_events' + +export abstract class ICSAccountingClient { + public abstract getBlockByNumber(blockNumber: number): Promise> +} + +export class CSAccountingSrv { + private readonly name = 'CSAccountingSrv' + private readonly logger: Logger + private readonly csAccountingClient: ICSAccountingClient + + private readonly csAccountingEvents: EventOfNotice[] + private readonly csAccountingAddress: string + private readonly stETHAddress: string + + constructor( + logger: Logger, + ethProvider: ICSAccountingClient, + csAccountingEvents: EventOfNotice[], + csAccountingAddress: string, + stETHAddress: string, + ) { + this.logger = logger + this.csAccountingClient = ethProvider + + this.csAccountingEvents = csAccountingEvents + this.csAccountingAddress = csAccountingAddress + this.stETHAddress = stETHAddress + } + + public async initialize(currentBlock: number): Promise { + const start = new Date().getTime() + + const currBlock = await this.csAccountingClient.getBlockByNumber(currentBlock) + if (E.isLeft(currBlock)) { + this.logger.error(elapsedTime(`Failed [${this.name}.initialize]`, start)) + return currBlock.left + } + + this.logger.info(elapsedTime(`[${this.name}.initialize]`, start)) + return null + } + + public getName(): string { + return this.name + } + + async handleBlock(blockDto: BlockDto): Promise { + const start = new Date().getTime() + const findings: Finding[] = [] + + const [rolesChangingFindings] = await Promise.all([this.handleRolesChanging(blockDto.number)]) + + findings.push(...rolesChangingFindings) + + this.logger.info(elapsedTime(CSAccountingSrv.name + '.' + this.handleBlock.name, start)) + + return findings + } + // to be implemented + handleRolesChanging(blockNumber: number): Promise { + const out: Finding = new Finding() + this.logger.info(`${blockNumber}`) + return Promise.resolve([out]) + } + + public handleStETHApprovalEvents(txEvent: TransactionDto): Finding[] { + const out: Finding[] = [] + + const approvalEvents = filterLog(txEvent.logs, APPROVAL_EVENT, this.stETHAddress) + if (approvalEvents.length === 0) { + return [] + } + + for (const event of approvalEvents) { + if (event.args.owner === this.csAccountingAddress) { + const f: Finding = new Finding() + f.setName(`πŸ”΅ Lido stETH: Approval`) + f.setDescription(`${event.args.spender} received allowance from ${event.args.owner} to ${event.args.value}`) + f.setAlertid('STETH-APPROVAL') + f.setSeverity(Finding.Severity.INFO) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + out.push(f) + } + } + return out + } + + public handleTransaction(txEvent: TransactionDto): Finding[] { + const out: Finding[] = [] + + const csAccountingFindings = handleEventsOfNotice(txEvent, this.csAccountingEvents) + const stETHApprovalFindings = this.handleStETHApprovalEvents(txEvent) + + out.push(...csAccountingFindings, ...stETHApprovalFindings) + + return out + } +} diff --git a/csm-alerts/src/services/CSAccounting/__snapshots__/CSAccounting.srv.spec.ts.snap b/csm-alerts/src/services/CSAccounting/__snapshots__/CSAccounting.srv.spec.ts.snap new file mode 100644 index 000000000..72e13d8f3 --- /dev/null +++ b/csm-alerts/src/services/CSAccounting/__snapshots__/CSAccounting.srv.spec.ts.snap @@ -0,0 +1,227 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CSAccounting event tests πŸ”΄ CSAccounting: Bond Curve Set 1`] = ` +[ + { + "array": [ + "ethereum", + 4, + [], + 4, + "CS-ACCOUNTING-BOND-CURVE-SET", + "πŸ”΄ CSAccounting: Bond curve set", + "Bond curve set for node operator ID 204 with curve ID 3", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "204,3", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; + +exports[`CSAccounting event tests πŸ”΄ CSAccounting: Bond Curve added, stETH Approval 1`] = ` +[ + { + "array": [ + "ethereum", + 4, + [], + 4, + "CS-ACCOUNTING-BOND-CURVE-ADDED", + "πŸ”΄ CSAccounting: Bond curve added", + "Bond curve added: [2.000 ETH, 3.900 ETH, 5.700 ETH, 7.400 ETH, 9.000 ETH, 10.500 ETH]", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "2000000000000000000,3900000000000000000,5700000000000000000,7400000000000000000,9000000000000000000,10500000000000000000", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 1, + , + 4, + "STETH-APPROVAL", + "πŸ”΅ Lido stETH: Approval", + "0x8d09a4502Cc8Cf1547aD300E066060D043f6982D received allowance from 0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1 to 115792089237316195423570985008687907853269984665640564039457584007913129639935", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": null, + }, + { + "array": [ + "ethereum", + 1, + , + 4, + "STETH-APPROVAL", + "πŸ”΅ Lido stETH: Approval", + "0xc7cc160b58F8Bb0baC94b80847E2CF2800565C50 received allowance from 0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1 to 115792089237316195423570985008687907853269984665640564039457584007913129639935", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": null, + }, + { + "array": [ + "ethereum", + 1, + , + 4, + "STETH-APPROVAL", + "πŸ”΅ Lido stETH: Approval", + "0x4E46BD7147ccf666E1d73A3A456fC7a68de82eCA received allowance from 0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1 to 115792089237316195423570985008687907853269984665640564039457584007913129639935", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": null, + }, +] +`; + +exports[`CSAccounting event tests 🚨 CSAccounting: Bond Curve Updated 1`] = ` +[ + { + "array": [ + "ethereum", + 5, + [], + 4, + "CS-ACCOUNTING-BOND-CURVE-UPDATED", + "🚨 CSAccounting: Bond curve updated", + "Bond curve updated with curve ID 3. Bond curve: [4.000 ETH, 5.000 ETH, 6.000 ETH, 7.000 ETH]", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "3,4000000000000000000,5000000000000000000,6000000000000000000,7000000000000000000", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; + +exports[`CSAccounting event tests 🚨 CSAccounting: Charge Penalty Recipient Set 1`] = ` +[ + { + "array": [ + "ethereum", + 5, + [], + 4, + "CS-ACCOUNTING-CHARGE-PENALTY-RECIPIENT-SET", + "🚨 CSAccounting: Charge penalty recipient set", + "Charge penalty recipient set to [0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d](https://etherscan.io/address/0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d) (expecting the treasury)", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts new file mode 100644 index 000000000..7e39e59ff --- /dev/null +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts @@ -0,0 +1,87 @@ +import { DeploymentAddress, DeploymentAddresses } from '../../utils/constants.holesky' +import { expect } from '@jest/globals' +import { TransactionDto } from '../../entity/events' +import { + CSModule__factory, + CSAccounting__factory, + CSFeeDistributor__factory, + CSFeeOracle__factory, +} from '../../generated/typechain' +import { getCSFeeDistributorEvents } from '../../utils/events/cs_fee_distributor_events' +import { CSFeeDistributorSrv, ICSFeeDistributorClient } from './CSFeeDistributor.srv' +import * as Winston from 'winston' +import { ETHProvider } from '../../clients/eth_provider' +import { ethers } from 'forta-agent' +import { getFortaConfig } from 'forta-agent/dist/sdk/utils' +import promClient from 'prom-client' +import { Metrics } from '../../utils/metrics/metrics' + +const TEST_TIMEOUT = 120_000 // ms + +describe('CsFeeDistributor event tests', () => { + const chainId = 17000 + + const logger: Winston.Logger = Winston.createLogger({ + format: Winston.format.simple(), + transports: [new Winston.transports.Console()], + }) + + const address: DeploymentAddress = DeploymentAddresses + + const fortaEthersProvider = new ethers.providers.JsonRpcProvider(getFortaConfig().jsonRpcUrl, chainId) + const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) + const csAccountingRunner = CSAccounting__factory.connect(address.CS_ACCOUNTING_ADDRESS, fortaEthersProvider) + const csFeeDistributorRunner = CSFeeDistributor__factory.connect( + address.CS_FEE_DISTRIBUTOR_ADDRESS, + fortaEthersProvider, + ) + const csFeeOracleRunner = CSFeeOracle__factory.connect(address.CS_FEE_ORACLE_ADDRESS, fortaEthersProvider) + + const registry = new promClient.Registry() + const m = new Metrics(registry, 'test_') + + const csFeeDistributorClient: ICSFeeDistributorClient = new ETHProvider( + logger, + m, + fortaEthersProvider, + csModuleRunner, + csAccountingRunner, + csFeeDistributorRunner, + csFeeOracleRunner, + ) + + const csFeeDistributorSrv = new CSFeeDistributorSrv( + logger, + csFeeDistributorClient, + getCSFeeDistributorEvents(address.CS_FEE_DISTRIBUTOR_ADDRESS), + address.CS_ACCOUNTING_ADDRESS, + address.CS_FEE_DISTRIBUTOR_ADDRESS, + address.LIDO_STETH_ADDRESS, + address.HASH_CONSENSUS_ADDRESS, + ) + + test( + 'πŸ”΅ INFO: DistributionDataUpdated', + async () => { + const txHash = '0x33a9fb726d09d543c417cb0985a41a7bee39e81e8536b5969784a520f4d2e0c1' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const results = await csFeeDistributorSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) + }, + TEST_TIMEOUT, + ) +}) diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts new file mode 100644 index 000000000..b2b8abfea --- /dev/null +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts @@ -0,0 +1,208 @@ +import { elapsedTime } from '../../utils/time' +import { BlockDto, EventOfNotice, TransactionDto, handleEventsOfNotice } from '../../entity/events' +import { Logger } from 'winston' +import { either as E } from 'fp-ts' +import { Finding } from '../../generated/proto/alert_pb' +import CS_FEE_DISTRIBUTOR_ABI from '../../brief/abi/CSFeeDistributor.json' +import HASH_CONSENSUS_ABI from '../../brief/abi/HashConsensus.json' +import { ONE_DAY, SECONDS_PER_SLOT } from '../../utils/constants' +import { ethers, filterLog, getEthersProvider } from 'forta-agent' +import { DISTRIBUTION_DATA_UPDATED_EVENT, TRANSFER_SHARES_EVENT } from '../../utils/events/cs_fee_distributor_events' +import { getLogsByChunks } from '../../utils/utils' + +export abstract class ICSFeeDistributorClient { + public abstract getBlockByNumber(blockNumber: number): Promise> +} + +export class CSFeeDistributorSrv { + private name = `CSFeeDistributorSrv` + + private readonly logger: Logger + private readonly csFeeDistributorClient: ICSFeeDistributorClient + + private readonly csFeeDistributorEvents: EventOfNotice[] + private readonly csAccountingAddress: string + private readonly csFeeDistributorAddress: string + private readonly stETHAddress: string + private readonly hashConsensusAddress: string + + private lastDistributionDataUpdatedTimestamp: number = 0 + private lastNoDistributionDataUpdatedAlertTimestamp: number = 0 + + constructor( + logger: Logger, + ethProvider: ICSFeeDistributorClient, + csFeeDistributorEvents: EventOfNotice[], + csAccountingAddress: string, + csFeeDistributorAddress: string, + stETHAddress: string, + hashConsensusAddress: string, + ) { + this.logger = logger + this.csFeeDistributorClient = ethProvider + this.csFeeDistributorEvents = csFeeDistributorEvents + this.csAccountingAddress = csAccountingAddress + this.csFeeDistributorAddress = csFeeDistributorAddress + this.stETHAddress = stETHAddress + this.hashConsensusAddress = hashConsensusAddress + } + + async initialize(currentBlock: number): Promise { + const start = new Date().getTime() + + const currBlock = await this.csFeeDistributorClient.getBlockByNumber(currentBlock) + if (E.isLeft(currBlock)) { + this.logger.error(elapsedTime(`Failed [${this.name}.initialize]`, start)) + return currBlock.left + } + + const csFeeDistributor = new ethers.Contract( + this.csFeeDistributorAddress, + CS_FEE_DISTRIBUTOR_ABI, + getEthersProvider(), + ) + const hashConsensus = new ethers.Contract(this.hashConsensusAddress, HASH_CONSENSUS_ABI, getEthersProvider()) + const frameConfig = await hashConsensus.functions.getFrameConfig() + const frameInSeconds = frameConfig.epochsPerFrame * 32 * SECONDS_PER_SLOT + const startBlock = currentBlock - Math.ceil(frameInSeconds / SECONDS_PER_SLOT) + const csFeeDistributorDistributionDataUpdatedFilter = csFeeDistributor.filters.DistributionDataUpdated() + const distributionDataUpdatedEvents = await getLogsByChunks( + csFeeDistributor, + csFeeDistributorDistributionDataUpdatedFilter, + startBlock, + currentBlock, + ) + + if (distributionDataUpdatedEvents.length > 0) { + this.lastDistributionDataUpdatedTimestamp = currBlock.right.timestamp + } + + this.logger.info(elapsedTime(`[${this.name}.initialize]`, start)) + return null + } + + public getName(): string { + return this.name + } + + async handleBlock(blockDto: BlockDto): Promise { + const start = new Date().getTime() + const out: Finding[] = [] + + const [revertedTxFindings, rolesChangingFindings] = await Promise.all([ + this.handleRevertedTx(blockDto.number), + this.handleRolesChanging(blockDto.number), + ]) + + if (blockDto.number % 10 === 0) { + const distributionDataUpdatedFindings = await this.handleDistributionDataUpdated(blockDto) + out.push(...distributionDataUpdatedFindings) + } + + out.push(...revertedTxFindings, ...rolesChangingFindings) + + this.logger.info(elapsedTime(CSFeeDistributorSrv.name + '.' + this.handleBlock.name, start)) + + return out + } + // to be implemented + handleRolesChanging(blockNumber: number): Promise { + const out: Finding = new Finding() + this.logger.info(`${blockNumber}`) + return Promise.resolve([out]) + } + // to be implemented + handleRevertedTx(blockNumber: number): Promise { + const out: Finding = new Finding() + this.logger.info(`${blockNumber}`) + return Promise.resolve([out]) + } + + private async handleDistributionDataUpdated(blockDto: BlockDto): Promise { + const out: Finding[] = [] + + const hashConsensus = new ethers.Contract(this.hashConsensusAddress, HASH_CONSENSUS_ABI, getEthersProvider()) + const frameConfig = await hashConsensus.functions.getFrameConfig() + const frameInSeconds = frameConfig.epochsPerFrame * 32 * SECONDS_PER_SLOT + + const now = blockDto.timestamp + + const chainConfig = hashConsensus.getChainConfig() + const genesisTimestamp = chainConfig.genesisTime + const currentEpoch = Math.floor((now - genesisTimestamp) / 32 / SECONDS_PER_SLOT) + if (currentEpoch < frameConfig.initialEpoch + frameConfig.epochsPerFrame) { + return out + } + + const timeSinceLastAlert = now - this.lastNoDistributionDataUpdatedAlertTimestamp + + if (timeSinceLastAlert > ONE_DAY) { + if (now - this.lastDistributionDataUpdatedTimestamp > frameInSeconds) { + const daysSinceLastUpdate = Math.floor((now - this.lastDistributionDataUpdatedTimestamp) / ONE_DAY) + + const f = new Finding() + f.setName(`πŸ”΄ CSFeeDistributor: No DistributionDataUpdated Event`) + f.setDescription(`There has been no DistributionDataUpdated event for ${daysSinceLastUpdate} days.`) + f.setAlertid('CSFEE-NO-DISTRIBUTION-DATA-UPDATED') + f.setSeverity(Finding.Severity.HIGH) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + out.push(f) + + this.lastNoDistributionDataUpdatedAlertTimestamp = now + } + } + return out + } + + public async handleTransaction(txEvent: TransactionDto): Promise { + const out: Finding[] = [] + + const distributionDataUpdatedEvents = filterLog( + txEvent.logs, + DISTRIBUTION_DATA_UPDATED_EVENT, + this.csFeeDistributorAddress, + ) + + if (distributionDataUpdatedEvents.length > 0) { + this.lastDistributionDataUpdatedTimestamp = txEvent.block.timestamp + } + + const csFeeDistributorFindings = handleEventsOfNotice(txEvent, this.csFeeDistributorEvents) + const transferSharesInvalidReceiverFindings = this.handleTransferSharesInvalidReceiver(txEvent) + + out.push(...csFeeDistributorFindings, ...transferSharesInvalidReceiverFindings) + + return out + } + + public handleTransferSharesInvalidReceiver(txEvent: TransactionDto): Finding[] { + const out: Finding[] = [] + + const transferSharesEvents = filterLog(txEvent.logs, TRANSFER_SHARES_EVENT, this.stETHAddress) + if (transferSharesEvents.length === 0) { + return [] + } + + for (const event of transferSharesEvents) { + if ( + event.args.from.toLowerCase() === this.csFeeDistributorAddress.toLowerCase() && + event.args.to.toLowerCase() !== this.csAccountingAddress.toLowerCase() + ) { + const f: Finding = new Finding() + f.setName(`🚨 CSFeeDistributor: Invalid TransferShares receiver`) + f.setDescription( + `TransferShares from CSFeeDistributor to an invalid address ${event.args.to} (expected CSAccounting)`, + ) + f.setAlertid('CSFEE-DISTRIBUTOR-INVALID-TRANSFER') + f.setSeverity(Finding.Severity.CRITICAL) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + out.push(f) + } + } + return out + } +} diff --git a/csm-alerts/src/services/CSFeeDistributor/__snapshots__/CSFeeDistributor.srv.spec.ts.snap b/csm-alerts/src/services/CSFeeDistributor/__snapshots__/CSFeeDistributor.srv.spec.ts.snap new file mode 100644 index 000000000..1a6af2969 --- /dev/null +++ b/csm-alerts/src/services/CSFeeDistributor/__snapshots__/CSFeeDistributor.srv.spec.ts.snap @@ -0,0 +1,44 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CsFeeDistributor event tests πŸ”΅ INFO: DistributionDataUpdated 1`] = ` +[ + { + "array": [ + "ethereum", + 1, + [], + 4, + "CSFEE-DISTRIBUTOR-DISTRIBUTION-DATA-UPDATED", + "πŸ”΅ CSFeeDistributor: Distribution data updated", + "Distribution data updated: +Total Claimable Shares: 2437078762437100387 +Tree Root: 0xcdd2290902bce8a93962c331e2d57ca30c754f366e1194de5448239763f5cf0f +Tree CID: QmPi5y1gyDoALFz1ZqwFMVDDEyPtDfFoeewvknfkbdobp6", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "2437078762437100387,0xcdd2290902bce8a93962c331e2d57ca30c754f366e1194de5448239763f5cf0f,QmPi5y1gyDoALFz1ZqwFMVDDEyPtDfFoeewvknfkbdobp6", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts new file mode 100644 index 000000000..852eab89e --- /dev/null +++ b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts @@ -0,0 +1,205 @@ +import { DeploymentAddress, DeploymentAddresses } from '../../utils/constants.holesky' +import { expect } from '@jest/globals' +import { TransactionDto } from '../../entity/events' +import { + CSModule__factory, + CSAccounting__factory, + CSFeeDistributor__factory, + CSFeeOracle__factory, +} from '../../generated/typechain' +import { CSFeeOracleSrv, ICSFeeOracleClient } from './CSFeeOracle.srv' +import * as Winston from 'winston' +import { ETHProvider } from '../../clients/eth_provider' +import { ethers } from 'forta-agent' +import { getFortaConfig } from 'forta-agent/dist/sdk/utils' +import promClient from 'prom-client' +import { Metrics } from '../../utils/metrics/metrics' +import { getCSFeeOracleEvents, getHashConsensusEvents } from '../../utils/events/cs_fee_oracle_events' + +const TEST_TIMEOUT = 120_000 // ms + +describe('CSFeeOracle and HashConsensus events tests', () => { + const chainId = 17000 + + const logger: Winston.Logger = Winston.createLogger({ + format: Winston.format.simple(), + transports: [new Winston.transports.Console()], + }) + + const address: DeploymentAddress = DeploymentAddresses + + const fortaEthersProvider = new ethers.providers.JsonRpcProvider(getFortaConfig().jsonRpcUrl, chainId) + const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) + const csAccountingRunner = CSAccounting__factory.connect(address.CS_ACCOUNTING_ADDRESS, fortaEthersProvider) + const csFeeDistributorRunner = CSFeeDistributor__factory.connect( + address.CS_FEE_DISTRIBUTOR_ADDRESS, + fortaEthersProvider, + ) + const csFeeOracleRunner = CSFeeOracle__factory.connect(address.CS_FEE_ORACLE_ADDRESS, fortaEthersProvider) + + const registry = new promClient.Registry() + const m = new Metrics(registry, 'test_') + + const csFeeOracleClient: ICSFeeOracleClient = new ETHProvider( + logger, + m, + fortaEthersProvider, + csModuleRunner, + csAccountingRunner, + csFeeDistributorRunner, + csFeeOracleRunner, + ) + + const csFeeOracleSrv = new CSFeeOracleSrv( + logger, + csFeeOracleClient, + getHashConsensusEvents(address.HASH_CONSENSUS_ADDRESS), + getCSFeeOracleEvents(address.CS_FEE_ORACLE_ADDRESS), + address.HASH_CONSENSUS_ADDRESS, + address.CS_FEE_ORACLE_ADDRESS, + ) + + test( + 'πŸ”΅ CSFeeOracle: Processing Started, Report Settled', + async () => { + const txHash = '0xf53cfcc9e576393b481a1c8ff4d28235703b6b5b62f9edb623d913b5d059f9c5' + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const results = csFeeOracleSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(2) + }, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ HashConsensus: FrameConfig Set', + async () => { + const txHash = '0xa6f4206ce30d66b378ab6e4ddef442ac4f29c95c5175fbb4a8944e6bec663724' + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const result = csFeeOracleSrv.handleTransaction(transactionDto) + + expect(result).toMatchSnapshot() + expect(result.length).toBe(1) + }, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ HashConsensus: Member added, Quorum Set', + async () => { + const txHash = '0xdfcdbe0b9e795b2b83ad405c17b0c7326b00748cb3b11282a460c50b1f4588b0' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const results = csFeeOracleSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(2) + }, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ HashConsensus: Member Removed, Quorum Set, Consensus Reached, Report Submitted', + async () => { + const txHash = '0xd22f8208b4bb2013a1113d68f9f19e3be13147c1f77ce811baa32ef082deed42' + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const result = csFeeOracleSrv.handleTransaction(transactionDto) + + expect(result).toMatchSnapshot() + expect(result.length).toBe(4) + }, + TEST_TIMEOUT, + ) + + test( + 'Empty findings', + async () => { + const txHash = '0x74ff368ba6ea748e19a7f0fefd9d0f708078176e56799dbe97d46ae59782ff9d' + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const result = csFeeOracleSrv.handleTransaction(transactionDto) + + expect(result.length).toBe(0) + }, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ CSFeeOracle: Consensus Hash Contract Set, Consensus Version Set, FeeDistributor Contract Set, Perf Leeway Set', + async () => { + const txHash = '0xdc5ed949e5b30a5ff6f325cd718ba5a52a32dc7719d3fe7aaf9661cc3da7e9a6' + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const result = csFeeOracleSrv.handleTransaction(transactionDto) + + expect(result).toMatchSnapshot() + expect(result.length).toBe(4) + }, + TEST_TIMEOUT, + ) +}) diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts new file mode 100644 index 000000000..4f26a6be8 --- /dev/null +++ b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts @@ -0,0 +1,236 @@ +import { elapsedTime } from '../../utils/time' +import { either as E } from 'fp-ts' +import { Logger } from 'winston' +import { BlockDto, EventOfNotice, TransactionDto, handleEventsOfNotice } from '../../entity/events' +import { Finding } from '../../generated/proto/alert_pb' +import { ethers, filterLog, getEthersProvider } from 'forta-agent' +import { ONE_DAY, ONE_MONTH, SECONDS_PER_SLOT } from '../../utils/constants' +import CS_FEE_ORACLE_ABI from '../../brief/abi/CSFeeOracle.json' +import HASH_CONSENSUS_ABI from '../../brief/abi/HashConsensus.json' +import { getLogsByChunks } from '../../utils/utils' +import { + CS_FEE_ORACLE_REPORT_SUBMITTED_EVENT, + HASH_CONSENSUS_REPORT_RECEIVED_EVENT, +} from '../../utils/events/cs_fee_oracle_events' +import BigNumber from 'bignumber.js' +export abstract class ICSFeeOracleClient { + public abstract getBlockByNumber(blockNumber: number): Promise> +} + +interface MemberReport { + refSlot: BigNumber + report: string + blockNumber: number +} + +export class CSFeeOracleSrv { + private readonly name = 'CSFeeOracleSrv' + private readonly logger: Logger + private readonly csFeeOracleClient: ICSFeeOracleClient + + private readonly hashConsensusEvents: EventOfNotice[] + private readonly csFeeOracleEvents: EventOfNotice[] + + private readonly hashConsensusAddress: string + private readonly csFeeOracleAddress: string + + private lastReportSubmitTimestamp: number = 0 + private lastReportOverdueAlertTimestamp: number = 0 + private membersAddresses: string[] = [] + private membersLastReport: Map = new Map() + + constructor( + logger: Logger, + ethProvider: ICSFeeOracleClient, + hashConsensusEvents: EventOfNotice[], + csFeeOracleEvents: EventOfNotice[], + hashConsensusAddress: string, + csFeeOracleAddress: string, + ) { + this.logger = logger + this.csFeeOracleClient = ethProvider + + this.hashConsensusAddress = hashConsensusAddress + this.csFeeOracleAddress = csFeeOracleAddress + + this.hashConsensusEvents = hashConsensusEvents + this.csFeeOracleEvents = csFeeOracleEvents + } + + async getOracleMembers(blockNumber: number, hashConsensus: ethers.Contract): Promise { + const members = await hashConsensus.functions.getMembers({ + blockTag: blockNumber, + }) + return members.addresses + } + + public async initialize(currentBlock: number): Promise { + const start = new Date().getTime() + + const currBlock = await this.csFeeOracleClient.getBlockByNumber(currentBlock) + if (E.isLeft(currBlock)) { + this.logger.error(elapsedTime(`Failed [${this.name}.initialize]`, start)) + return currBlock.left + } + + const hashConsensus = new ethers.Contract(this.hashConsensusAddress, HASH_CONSENSUS_ABI, getEthersProvider()) + this.membersAddresses = await this.getOracleMembers(currentBlock, hashConsensus) + const hashConsensusReportReceivedFilter = hashConsensus.filters.ReportReceived() + const frameConfig = await hashConsensus.functions.getFrameConfig() + const reportReceivedStartBlock = currentBlock - Math.ceil(frameConfig.epochsPerFrame * 32) + const reportReceivedEvents = await getLogsByChunks( + hashConsensus, + hashConsensusReportReceivedFilter, + reportReceivedStartBlock, + currentBlock, + ) + reportReceivedEvents.sort((a, b) => a.blockNumber - b.blockNumber) + + this.membersAddresses.forEach((member: string) => { + const memberReports = reportReceivedEvents.filter((event) => { + if (event.args) { + return event.args.member == member + } + }) + if (memberReports.length > 0) { + const lastReport = memberReports[memberReports.length - 1] + if (lastReport.args) { + this.membersLastReport.set(member, { + refSlot: lastReport.args.refSlot, + report: lastReport.args.report, + blockNumber: lastReport.blockNumber, + }) + } + } else { + this.membersLastReport.set(member, { + refSlot: new BigNumber(0), + report: '', + blockNumber: 0, + }) + } + }) + + const reportSubmits = await this.getReportSubmits( + currentBlock - Math.ceil(ONE_MONTH / SECONDS_PER_SLOT), + currentBlock, + ) + + if (reportSubmits.length > 0) { + this.lastReportSubmitTimestamp = (await reportSubmits[reportSubmits.length - 1].getBlock()).timestamp + } + + this.logger.info(elapsedTime(`[${this.name}.initialize]`, start)) + return null + } + + public getName(): string { + return this.name + } + + async getReportSubmits(blockFrom: number, blockTo: number) { + const csFeeOracle = new ethers.Contract(this.csFeeOracleAddress, CS_FEE_ORACLE_ABI, getEthersProvider()) + const oracleReportFilter = csFeeOracle.filters.ReportSubmitted() + return await getLogsByChunks(csFeeOracle, oracleReportFilter, blockFrom, blockTo) + } + + async handleBlock(blockDto: BlockDto): Promise { + const start = new Date().getTime() + const findings: Finding[] = [] + + const [reportOverdueFindings] = await Promise.all([this.handleReportOverdue(blockDto)]) + + findings.push(...reportOverdueFindings) + + this.logger.info(elapsedTime(CSFeeOracleSrv.name + '.' + this.handleBlock.name, start)) + + return findings + } + + public async handleReportOverdue(blockDto: BlockDto): Promise { + const out: Finding[] = [] + + const now = blockDto.timestamp + + const hashConsensus = new ethers.Contract(this.hashConsensusAddress, HASH_CONSENSUS_ABI, getEthersProvider()) + const frameConfig = await hashConsensus.functions.getFrameConfig() + const MAX_REPORT_DELAY = frameConfig.epochsPerFrame * 32 * SECONDS_PER_SLOT + + const reportDelay = now - (this.lastReportSubmitTimestamp ? this.lastReportSubmitTimestamp : 0) + + const chainConfig = hashConsensus.getChainConfig() + const genesisTimestamp = chainConfig.genesisTime + const currentEpoch = Math.floor((now - genesisTimestamp) / 32 / SECONDS_PER_SLOT) + if (currentEpoch < frameConfig.initialEpoch + frameConfig.epochsPerFrame) { + // If we are still within the initial epochs, skip the overdue check + return out + } + + const timeSinceLastAlert = now - this.lastReportOverdueAlertTimestamp + + if (timeSinceLastAlert > ONE_DAY) { + if (reportDelay > MAX_REPORT_DELAY) { + const f: Finding = new Finding() + f.setName(`πŸ”΄ CSFeeOracle: Report overdue`) + f.setDescription(`Report is overdue by ${Math.floor(reportDelay / ONE_DAY)} days`) + f.setAlertid('CS-FEE-ORACLE-REPORT-OVERDUE') + f.setSeverity(Finding.Severity.HIGH) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + out.push(f) + + this.lastReportOverdueAlertTimestamp = now + } + } + return out + } + + public handleAlternativeHashReceived(txEvent: TransactionDto): Finding[] { + const out: Finding[] = [] + + const [event] = filterLog(txEvent.logs, HASH_CONSENSUS_REPORT_RECEIVED_EVENT, this.hashConsensusAddress) + if (event && event.args) { + const currentReportHashes = [...this.membersLastReport.values()] + .filter((r) => r.refSlot.eq(event.args.refSlot)) + .map((r) => r.report) + + if (currentReportHashes.length > 0 && !currentReportHashes.includes(event.args.report)) { + const f = new Finding() + f.setName('πŸ”΄ HashConsensus: Another report variant appeared (alternative hash)') + f.setDescription( + `More than one distinct report hash received for slot ${event.args.refSlot}. Member: ${event.args.member}. Report: ${event.args.report}`, + ) + f.setAlertid('HASH-CONSENSUS-REPORT-RECEIVED') + f.setSeverity(Finding.Severity.HIGH) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + out.push(f) + } + + this.membersLastReport.set(event.args.member, { + refSlot: event.args.refSlot, + report: event.args.report, + blockNumber: txEvent.block.number, + }) + } + + return out + } + + public handleTransaction(txEvent: TransactionDto): Finding[] { + const out: Finding[] = [] + + const reportEvent = filterLog(txEvent.logs, CS_FEE_ORACLE_REPORT_SUBMITTED_EVENT, this.csFeeOracleAddress) + if (reportEvent.length > 0) { + this.lastReportSubmitTimestamp = txEvent.block.timestamp + } + + const hashConsensusFindings = handleEventsOfNotice(txEvent, this.hashConsensusEvents) + const csFeeOracleFindings = handleEventsOfNotice(txEvent, this.csFeeOracleEvents) + const alternativeHashReceivedFindings = this.handleAlternativeHashReceived(txEvent) + + out.push(...hashConsensusFindings, ...csFeeOracleFindings, ...alternativeHashReceivedFindings) + + return out + } +} diff --git a/csm-alerts/src/services/CSFeeOracle/__snapshots__/CSFeeOracle.srv.spec.ts.snap b/csm-alerts/src/services/CSFeeOracle/__snapshots__/CSFeeOracle.srv.spec.ts.snap new file mode 100644 index 000000000..f08c168d3 --- /dev/null +++ b/csm-alerts/src/services/CSFeeOracle/__snapshots__/CSFeeOracle.srv.spec.ts.snap @@ -0,0 +1,481 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CSFeeOracle and HashConsensus events tests πŸ”΄ CSFeeOracle: Consensus Hash Contract Set, Consensus Version Set, FeeDistributor Contract Set, Perf Leeway Set 1`] = ` +[ + { + "array": [ + "ethereum", + 5, + [], + 4, + "CSFEE-ORACLE-CONSENSUS-HASH-CONTRACT-SET", + "🚨 CSFeeOracle: Consensus hash contract set", + "Consensus hash contract set to [0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37](https://etherscan.io/address/0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37), previous contract was [0x0000000000000000000000000000000000000000](https://etherscan.io/address/0x0000000000000000000000000000000000000000)", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37,0x0000000000000000000000000000000000000000", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 4, + [], + 4, + "CSFEE-ORACLE-CONSENSUS-VERSION-SET", + "πŸ”΄ CSFeeOracle: Consensus version set", + "Consensus version set to 1, previous version was 0", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "1,0", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 4, + [], + 4, + "CSFEE-ORACLE-FEE-DISTRIBUTOR-CONTRACT-SET", + "πŸ”΄ CSFeeOracle: New CSFeeDistributor set", + "New CSFeeDistributor contract set to [0xD7ba648C8F72669C6aE649648B516ec03D07c8ED](https://etherscan.io/address/0xD7ba648C8F72669C6aE649648B516ec03D07c8ED)", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0xD7ba648C8F72669C6aE649648B516ec03D07c8ED", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 4, + [], + 4, + "CSFEE-ORACLE-PERF-LEEWAY-SET", + "πŸ”΄ CSFeeOracle: Performance leeway updated", + "Performance leeway set to 500 basis points", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "500", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; + +exports[`CSFeeOracle and HashConsensus events tests πŸ”΄ HashConsensus: FrameConfig Set 1`] = ` +[ + { + "array": [ + "ethereum", + 4, + [], + 4, + "HASH-CONSENSUS-FRAME-CONFIG-SET", + "πŸ”΄ HashConsensus: Frame config set", + "Frame configuration set. New initial epoch: 48038396020868878, Epochs per frame: 1575", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "48038396020868878,1575", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; + +exports[`CSFeeOracle and HashConsensus events tests πŸ”΄ HashConsensus: Member Removed, Quorum Set, Consensus Reached, Report Submitted 1`] = ` +[ + { + "array": [ + "ethereum", + 4, + [], + 4, + "HASH-CONSENSUS-MEMBER-REMOVED", + "πŸ”΄ HashConsensus: Member removed", + "Member [0x4c75FA734a39f3a21C57e583c1c29942F021C6B7](https://etherscan.io/address/0x4c75FA734a39f3a21C57e583c1c29942F021C6B7) removed. Total members: 9, New quorum: 5", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0x4c75FA734a39f3a21C57e583c1c29942F021C6B7,9,5", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 4, + [], + 4, + "HASH-CONSENSUS-QUORUM-SET", + "πŸ”΄ HashConsensus: Quorum set", + "Quorum set to 5. Total members: 9, Previous quorum: 6", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "5,9,6", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 1, + [], + 4, + "HASH-CONSENSUS-REACHED", + "πŸ”΅ HashConsensus: Consensus reached, report received", + "Consensus reached for slot 2068159. Report hash: 0x3f42b4c85f55a07ab3f38c6c910871fd654fe9dfed64c9ff69e8ad4921fd487b, Support: 5", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "2068159,0x3f42b4c85f55a07ab3f38c6c910871fd654fe9dfed64c9ff69e8ad4921fd487b,5", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 1, + [], + 4, + "CSFEE-ORACLE-REPORT-SUBMITTED", + "πŸ”΅ CSFeeOracle: Report submitted", + "Report submitted for slot 2068159. Hash: 0x3f42b4c85f55a07ab3f38c6c910871fd654fe9dfed64c9ff69e8ad4921fd487b, Processing deadline time: 1721325108", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "2068159,0x3f42b4c85f55a07ab3f38c6c910871fd654fe9dfed64c9ff69e8ad4921fd487b,1721325108", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; + +exports[`CSFeeOracle and HashConsensus events tests πŸ”΄ HashConsensus: Member added, Quorum Set 1`] = ` +[ + { + "array": [ + "ethereum", + 4, + [], + 4, + "HASH-CONSENSUS-MEMBER-ADDED", + "πŸ”΄ HashConsensus: Member added", + "New member [0x4c75FA734a39f3a21C57e583c1c29942F021C6B7](https://etherscan.io/address/0x4c75FA734a39f3a21C57e583c1c29942F021C6B7) added. Total members: 10, New quorum: 6", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0x4c75FA734a39f3a21C57e583c1c29942F021C6B7,10,6", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 4, + [], + 4, + "HASH-CONSENSUS-QUORUM-SET", + "πŸ”΄ HashConsensus: Quorum set", + "Quorum set to 6. Total members: 10, Previous quorum: 5", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "6,10,5", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; + +exports[`CSFeeOracle and HashConsensus events tests πŸ”΅ CSFeeOracle: Processing Started, Report Settled 1`] = ` +[ + { + "array": [ + "ethereum", + 1, + [], + 4, + "CSFEE-ORACLE-PROCESSING-STARTED", + "πŸ”΅ CSFeeOracle: Processing started", + "Processing started for slot 2068159. Hash: 0x3f42b4c85f55a07ab3f38c6c910871fd654fe9dfed64c9ff69e8ad4921fd487b", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "2068159,0x3f42b4c85f55a07ab3f38c6c910871fd654fe9dfed64c9ff69e8ad4921fd487b", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 1, + [], + 4, + "CSFEE-ORACLE-REPORT-SETTLED", + "πŸ”΅ CSFeeOracle: Report settled", + "Report settled for slot 2068159. Distributed: 219882093527933929, Tree root: 0xfe5c8e3e617728bb0cd034313cc615f79ff7e93ff2e747b99d39b7e36a65b56a, Tree CID: QmV9AfsMa4zV3J1AjMhNuTQP4F18eV3uY5ihbVFcT5SkW6", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "2068159,219882093527933929,0xfe5c8e3e617728bb0cd034313cc615f79ff7e93ff2e747b99d39b7e36a65b56a,QmV9AfsMa4zV3J1AjMhNuTQP4F18eV3uY5ihbVFcT5SkW6", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.ts b/csm-alerts/src/services/CSModule/CSModule.srv.ts new file mode 100644 index 000000000..36fda6fd6 --- /dev/null +++ b/csm-alerts/src/services/CSModule/CSModule.srv.ts @@ -0,0 +1,74 @@ +import { either as E } from 'fp-ts' +import { TransactionDto } from '../../entity/events' +import { elapsedTime } from '../../utils/time' +import { Logger } from 'winston' +import { BlockDto } from '../../entity/events' +import { Finding } from '../../generated/proto/alert_pb' + +export abstract class ICSModuleClient { + public abstract getBlockByNumber(blockNumber: number): Promise> +} + +export class CSModuleSrv { + private readonly name = 'CSModuleSrv' + private readonly logger: Logger + private readonly csModuleClient: ICSModuleClient + + constructor(logger: Logger, csModuleClient: ICSModuleClient) { + this.logger = logger + this.csModuleClient = csModuleClient + } + + public async initialize(currentBlock: number): Promise { + const start = new Date().getTime() + + const currBlock = await this.csModuleClient.getBlockByNumber(currentBlock) + if (E.isLeft(currBlock)) { + this.logger.error(elapsedTime(`Failed [${this.name}.initialize]`, start)) + return currBlock.left + } + + this.logger.info(elapsedTime(`[${this.name}.initialize]`, start)) + return null + } + + public getName(): string { + return this.name + } + + async handleBlock(blockDto: BlockDto): Promise { + const start = new Date().getTime() + const findings: Finding[] = [] + + const [rolesChangingFindings] = await Promise.all([this.handleRolesChanging(blockDto.number)]) + + findings.push(...rolesChangingFindings) + + this.logger.info(elapsedTime(CSModuleSrv.name + '.' + this.handleBlock.name, start)) + + return findings + } + // to be implemented + handleRolesChanging(blockNumber: number): Promise { + const out: Finding = new Finding() + this.logger.info(`${blockNumber}`) + return Promise.resolve([out]) + } + + handleTransaction(txEvent: TransactionDto): Finding[] { + const out: Finding[] = [] + + const moduleShareIsCloseToTargetShareFindings = this.handleModuleShareIsCloseToTargetShare(txEvent) + + out.push(...moduleShareIsCloseToTargetShareFindings) + + return out + } + + // to be implemented + public handleModuleShareIsCloseToTargetShare(txEvent: TransactionDto): Finding[] { + const out: Finding[] = [] + this.logger.info(`${txEvent.block.timestamp}`) + return out + } +} diff --git a/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.spec.ts b/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.spec.ts new file mode 100644 index 000000000..28261a6e8 --- /dev/null +++ b/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.spec.ts @@ -0,0 +1,168 @@ +import { + CONTRACTS_WITH_ASSET_RECOVERER, + CSM_PROXY_CONTRACTS, + DeploymentAddress, + DeploymentAddresses, + PAUSABLE_CONTRACTS, +} from '../../utils/constants.holesky' +import { expect } from '@jest/globals' +import { TransactionDto } from '../../entity/events' +import { + CSModule__factory, + CSAccounting__factory, + CSFeeDistributor__factory, + CSFeeOracle__factory, +} from '../../generated/typechain' +import { getOssifiedProxyEvents } from '../../utils/events/ossified_proxy_events' +import { getPausableEvents } from '../../utils/events/pausable_events' +import { getAssetRecovererEvents } from '../../utils/events/asset_recoverer_events' +import { ProxyWatcherSrv, IProxyWatcherClient } from './ProxyWatcher.srv' +import * as Winston from 'winston' +import { ETHProvider } from '../../clients/eth_provider' +import { ethers } from 'forta-agent' +import { getFortaConfig } from 'forta-agent/dist/sdk/utils' +import promClient from 'prom-client' +import { Metrics } from '../../utils/metrics/metrics' + +const TEST_TIMEOUT = 120_000 // ms + +describe('ProxyWatcher event tests', () => { + const chainId = 17000 + + const logger: Winston.Logger = Winston.createLogger({ + format: Winston.format.simple(), + transports: [new Winston.transports.Console()], + }) + + const address: DeploymentAddress = DeploymentAddresses + + const fortaEthersProvider = new ethers.providers.JsonRpcProvider(getFortaConfig().jsonRpcUrl, chainId) + const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) + const csAccountingRunner = CSAccounting__factory.connect(address.CS_ACCOUNTING_ADDRESS, fortaEthersProvider) + const csFeeDistributorRunner = CSFeeDistributor__factory.connect( + address.CS_FEE_DISTRIBUTOR_ADDRESS, + fortaEthersProvider, + ) + const csFeeOracleRunner = CSFeeOracle__factory.connect(address.CS_FEE_ORACLE_ADDRESS, fortaEthersProvider) + + const registry = new promClient.Registry() + const m = new Metrics(registry, 'test_') + + const proxyWatcherClient: IProxyWatcherClient = new ETHProvider( + logger, + m, + fortaEthersProvider, + csModuleRunner, + csAccountingRunner, + csFeeDistributorRunner, + csFeeOracleRunner, + ) + + const proxyWatcherSrv = new ProxyWatcherSrv( + logger, + proxyWatcherClient, + getOssifiedProxyEvents(CSM_PROXY_CONTRACTS), + getPausableEvents(PAUSABLE_CONTRACTS), + getAssetRecovererEvents(CONTRACTS_WITH_ASSET_RECOVERER), + ) + + test( + '🚨 Proxy Watcher: Admin Changed', + async () => { + const txHash = '0x92410350f567757d8f73b2f4b3670454af3899d095103ea0e745c92714673277' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const results = proxyWatcherSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(4) + }, + TEST_TIMEOUT, + ) + + test( + '🚨 Proxy Watcher: Implementation Upgraded', + async () => { + const txHash = '0x262faac95560f7fc0c831580d17e48daa69b17831b798e0b00bc43168a310c52' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const results = proxyWatcherSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(4) + }, + TEST_TIMEOUT, + ) + + test( + '🚨 Proxy Watcher: Paused', + async () => { + const txHash = '0x56a49219b4e40d146c0dc11d795b6d43696947f0ceb63fad7e9b820eab2b3e14' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const results = proxyWatcherSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(3) + }, + TEST_TIMEOUT, + ) + + test( + '🚨 Proxy Watcher: Resumed', + async () => { + const txHash = '0xa44ac96956f254fe1b9d6ff0a60ad2b5b4a7eaff951eb98150c0f7bbe90dc5df' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + } + + const results = proxyWatcherSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(3) + }, + TEST_TIMEOUT, + ) +}) diff --git a/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.ts b/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.ts new file mode 100644 index 000000000..61fb5ccdb --- /dev/null +++ b/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.ts @@ -0,0 +1,72 @@ +import { elapsedTime } from '../../utils/time' +import { either as E } from 'fp-ts' +import { Logger } from 'winston' +import { BlockDto, EventOfNotice, TransactionDto, handleEventsOfNotice } from '../../entity/events' +import { Finding } from '../../generated/proto/alert_pb' + +export abstract class IProxyWatcherClient { + public abstract getBlockByNumber(blockNumber: number): Promise> +} + +export class ProxyWatcherSrv { + private readonly name = 'ProxyWatcherSrv' + private readonly logger: Logger + private readonly proxyWatcherClient: IProxyWatcherClient + + private readonly ossifiedProxyEvents: EventOfNotice[] + private readonly pausableEvents: EventOfNotice[] + private readonly assetRecovererEvents: EventOfNotice[] + + constructor( + logger: Logger, + ethProvider: IProxyWatcherClient, + ossifiedProxyEvents: EventOfNotice[], + pausableEvents: EventOfNotice[], + assetRecovererEvents: EventOfNotice[], + ) { + this.logger = logger + this.proxyWatcherClient = ethProvider + + this.ossifiedProxyEvents = ossifiedProxyEvents + this.pausableEvents = pausableEvents + this.assetRecovererEvents = assetRecovererEvents + } + + public async initialize(currentBlock: number): Promise { + const start = new Date().getTime() + + const currBlock = await this.proxyWatcherClient.getBlockByNumber(currentBlock) + if (E.isLeft(currBlock)) { + this.logger.error(elapsedTime(`Failed [${this.name}.initialize]`, start)) + return currBlock.left + } + this.logger.info(elapsedTime(`[${this.name}.initialize]`, start)) + return null + } + + async handleBlock(blockDto: BlockDto): Promise { + const start = new Date().getTime() + const findings: Finding[] = [] + + this.logger.info(`${blockDto.number}`) + this.logger.info(elapsedTime(ProxyWatcherSrv.name + '.' + this.handleBlock.name, start)) + + return findings + } + + public getName(): string { + return this.name + } + + public handleTransaction(txEvent: TransactionDto): Finding[] { + const out: Finding[] = [] + + const ossifiedProxyFindings = handleEventsOfNotice(txEvent, this.ossifiedProxyEvents) + const pausableEventsFindings = handleEventsOfNotice(txEvent, this.pausableEvents) + const assetRecovererFindings = handleEventsOfNotice(txEvent, this.assetRecovererEvents) + + out.push(...ossifiedProxyFindings, ...pausableEventsFindings, ...assetRecovererFindings) + + return out + } +} diff --git a/csm-alerts/src/services/ProxyWatcher/__snapshots__/ProxyWatcher.srv.spec.ts.snap b/csm-alerts/src/services/ProxyWatcher/__snapshots__/ProxyWatcher.srv.spec.ts.snap new file mode 100644 index 000000000..4224745f9 --- /dev/null +++ b/csm-alerts/src/services/ProxyWatcher/__snapshots__/ProxyWatcher.srv.spec.ts.snap @@ -0,0 +1,511 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ProxyWatcher event tests 🚨 Proxy Watcher: Admin Changed 1`] = ` +[ + { + "array": [ + "ethereum", + 5, + [], + 4, + "PROXY-ADMIN-CHANGED", + "🚨 CSModule: Admin Changed", + "The proxy admin for CSModule(0x4562c3e63c2e586cD1651B958C22F88135aCAd4f) has been changed from [0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164](https://etherscan.io/address/0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164) to [0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d](https://etherscan.io/address/0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d)", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164,0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 5, + [], + 4, + "PROXY-ADMIN-CHANGED", + "🚨 CSAccounting: Admin Changed", + "The proxy admin for CSAccounting(0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1) has been changed from [0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164](https://etherscan.io/address/0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164) to [0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d](https://etherscan.io/address/0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d)", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164,0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 5, + [], + 4, + "PROXY-ADMIN-CHANGED", + "🚨 CSFeeDistributor: Admin Changed", + "The proxy admin for CSFeeDistributor(0xD7ba648C8F72669C6aE649648B516ec03D07c8ED) has been changed from [0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164](https://etherscan.io/address/0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164) to [0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d](https://etherscan.io/address/0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d)", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164,0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 5, + [], + 4, + "PROXY-ADMIN-CHANGED", + "🚨 CSFeeOracle: Admin Changed", + "The proxy admin for CSFeeOracle(0xaF57326C7d513085051b50912D51809ECC5d98Ee) has been changed from [0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164](https://etherscan.io/address/0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164) to [0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d](https://etherscan.io/address/0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d)", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164,0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; + +exports[`ProxyWatcher event tests 🚨 Proxy Watcher: Implementation Upgraded 1`] = ` +[ + { + "array": [ + "ethereum", + 5, + [], + 4, + "PROXY-UPGRADED", + "🚨 CSModule: Implementation Upgraded", + "The proxy implementation has been upgraded to 0x4d70efa74ec0ac3a5f759cc0f714c94cbc5cc4da", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0x4D70efa74ec0Ac3a5f759cC0F714c94CBc5cc4da", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 5, + [], + 4, + "PROXY-UPGRADED", + "🚨 CSAccounting: Implementation Upgraded", + "The proxy implementation has been upgraded to 0x4d70efa74ec0ac3a5f759cc0f714c94cbc5cc4da", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0x4D70efa74ec0Ac3a5f759cC0F714c94CBc5cc4da", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 5, + [], + 4, + "PROXY-UPGRADED", + "🚨 CSFeeDistributor: Implementation Upgraded", + "The proxy implementation has been upgraded to 0x4d70efa74ec0ac3a5f759cc0f714c94cbc5cc4da", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0x4D70efa74ec0Ac3a5f759cC0F714c94CBc5cc4da", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 5, + [], + 4, + "PROXY-UPGRADED", + "🚨 CSFeeOracle: Implementation Upgraded", + "The proxy implementation has been upgraded to 0x4d70efa74ec0ac3a5f759cc0f714c94cbc5cc4da", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "0x4D70efa74ec0Ac3a5f759cC0F714c94CBc5cc4da", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; + +exports[`ProxyWatcher event tests 🚨 Proxy Watcher: Paused 1`] = ` +[ + { + "array": [ + "ethereum", + 5, + [], + 4, + "CSModule-PAUSED", + "🚨 CSModule: contract was paused", + "For 336 hours", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "1209600", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 5, + [], + 4, + "CSAccounting-PAUSED", + "🚨 CSAccounting: contract was paused", + "For 336 hours", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "1209600", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 5, + [], + 4, + "CSFeeOracle-PAUSED", + "🚨 CSFeeOracle: contract was paused", + "For 336 hours", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "1209600", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; + +exports[`ProxyWatcher event tests 🚨 Proxy Watcher: Resumed 1`] = ` +[ + { + "array": [ + "ethereum", + 5, + [], + 4, + "CSModule-UNPAUSED", + "🚨 CSModule: contract was resumed", + "Contract was resumed", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 5, + [], + 4, + "CSAccounting-UNPAUSED", + "🚨 CSAccounting: contract was resumed", + "Contract was resumed", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, + { + "array": [ + "ethereum", + 5, + [], + 4, + "CSFeeOracle-UNPAUSED", + "🚨 CSFeeOracle: contract was resumed", + "Contract was resumed", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; diff --git a/csm-alerts/src/services/health-checker/health-checker.srv.spec.ts b/csm-alerts/src/services/health-checker/health-checker.srv.spec.ts new file mode 100644 index 000000000..977b86c2c --- /dev/null +++ b/csm-alerts/src/services/health-checker/health-checker.srv.spec.ts @@ -0,0 +1,69 @@ +import { networkAlert } from '../../utils/errors' +import { HealthChecker } from './health-checker.srv' +import promClient from 'prom-client' +import * as Winston from 'winston' +import { Metrics } from '../../utils/metrics/metrics' + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)) +} + +describe('HealthChecker', () => { + const networkFindings = [networkAlert(new Error('Some err'), 'err name', 'err desc')] + const borderTime = 1_000 + const timeForNextCheck = 250 + + const registry = new promClient.Registry() + const m = new Metrics(registry, 'test_') + const logger: Winston.Logger = Winston.createLogger({ + format: Winston.format.simple(), + transports: [new Winston.transports.Console()], + }) + + test('should become healthy', async () => { + const maxCountErrors = 6 + const healthChecker = new HealthChecker(logger, m, borderTime, maxCountErrors) + + // 0 250 500 750 1000 1250 1500 1750 2000 2250 + // | <- found 5 errors on 1000-th millisecond + // | found 5 < maxCountErrors = 6 => app is healthy + // 1 2 3 4 [5] 6 7 8 9 10 + for (let i = 1; i <= 10; i++) { + await sleep(timeForNextCheck) + healthChecker.check(networkFindings) + } + + expect(healthChecker.isHealth()).toBe(true) + }) + + test('should become unhealthy', async () => { + const maxCountErrors = 5 + const healthChecker = new HealthChecker(logger, m, borderTime, maxCountErrors) + + // 0 250 500 750 1000 1250 1500 1750 2000 2250 + // | <- found 5 errors on 1000-th millisecond + // | found 5 === maxCountErrors = 5 => app is unhealthy + // 1 2 3 4 [5] 6 7 8 9 10 + for (let i = 1; i <= 10; i++) { + await sleep(timeForNextCheck) + healthChecker.check(networkFindings) + } + + expect(healthChecker.isHealth()).toBe(false) + }) + + test('should become unhealthy', async () => { + const maxCountErrors = 3 + const healthChecker = new HealthChecker(logger, m, borderTime, maxCountErrors) + + // Found per once 3 errors -> app is unhealthy + const findings3 = [ + networkAlert(new Error('Some err'), 'err name', 'err desc'), + networkAlert(new Error('Some err'), 'err name', 'err desc'), + networkAlert(new Error('Some err'), 'err name', 'err desc'), + ] + healthChecker.check(findings3) + + expect(healthChecker.isHealth()).toBe(false) + }) +}) diff --git a/csm-alerts/src/services/health-checker/health-checker.srv.ts b/csm-alerts/src/services/health-checker/health-checker.srv.ts new file mode 100644 index 000000000..5f07ca97a --- /dev/null +++ b/csm-alerts/src/services/health-checker/health-checker.srv.ts @@ -0,0 +1,78 @@ +import { NetworkErrorFinding } from '../../utils/errors' +import { Finding } from '../../generated/proto/alert_pb' +import { Logger } from 'winston' +import { Metrics } from '../../utils/metrics/metrics' + +export const BorderTime = 15 * 60 * 1000 // 15 minutes +export const MaxNumberErrorsPerBorderTime = 25 + +export class HealthChecker { + private errorCount: number + private isAppOk: boolean + private readonly borderTime: number + private readonly maxCountErrors: number + + private errorStartedAt: number | null + private logger: Logger + private metrics: Metrics + + constructor(logger: Logger, metrics: Metrics, borderTime: number, maxCountErrors: number) { + this.logger = logger + this.metrics = metrics + + this.errorCount = 0 + this.errorStartedAt = null + this.isAppOk = true + this.borderTime = borderTime + this.maxCountErrors = maxCountErrors + } + + public check(findings: Finding[]): number { + const currentTime = Date.now() + + let errCount: number = 0 + for (const f of findings) { + if (f.getAlertid() === NetworkErrorFinding) { + this.logger.warn(f.getName(), { + desc: f.getDescription(), + err: { + stack: f.getMetadataMap()['stack'], + msg: f.getMetadataMap()['message'], + err: f.getMetadataMap()['name'], + }, + }) + errCount += 1 + + this.metrics.networkErrors.inc() + } + } + + // if for one iteration we have more than maxCountErrors + // then app is unhealthy + if (errCount >= this.maxCountErrors) { + this.isAppOk = false + return errCount + } + + if (this.errorStartedAt === null && errCount > 0) { + this.errorStartedAt = currentTime + } + + this.errorCount += errCount + + if (this.errorStartedAt !== null && currentTime - this.errorStartedAt >= this.borderTime) { + if (this.errorCount >= this.maxCountErrors) { + this.isAppOk = false + } else { + this.errorCount = 0 + this.errorStartedAt = null + } + } + + return errCount + } + + public isHealth(): boolean { + return this.isAppOk + } +} diff --git a/csm-alerts/src/utils/constants.holesky.ts b/csm-alerts/src/utils/constants.holesky.ts new file mode 100644 index 000000000..7ef5d7406 --- /dev/null +++ b/csm-alerts/src/utils/constants.holesky.ts @@ -0,0 +1,141 @@ +// HOLESKY COMMON ADDRESSES + +export type DeploymentAddress = { + CS_MODULE_ADDRESS: string + CS_ACCOUNTING_ADDRESS: string + CS_FEE_DISTRIBUTOR_ADDRESS: string + CS_FEE_ORACLE_ADDRESS: string + CS_VERIFIER_ADDRESS: string + CS_EARLY_ADOPTION_ADDRESS: string + CSM_GATE_SEAL_ADDRESS: string + LIDO_STETH_ADDRESS: string + BURNER_ADDRESS: string + HASH_CONSENSUS_ADDRESS: string +} + +export const DeploymentAddresses: DeploymentAddress = { + CS_MODULE_ADDRESS: '0x4562c3e63c2e586cD1651B958C22F88135aCAd4f', + CS_ACCOUNTING_ADDRESS: '0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1', + CS_FEE_DISTRIBUTOR_ADDRESS: '0xD7ba648C8F72669C6aE649648B516ec03D07c8ED', + CS_FEE_ORACLE_ADDRESS: '0xaF57326C7d513085051b50912D51809ECC5d98Ee', + CS_VERIFIER_ADDRESS: '0x6DcA479178E6Ae41CCEB72a88FfDaa3e10E83CB7', + CS_EARLY_ADOPTION_ADDRESS: '0x71E92eA77C198a770d9f33A03277DbeB99989660', + CSM_GATE_SEAL_ADDRESS: '0x41F2677fae0222cF1f08Cd1c0AAa607B469654Ce', + LIDO_STETH_ADDRESS: '0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034', + BURNER_ADDRESS: '0x4E46BD7147ccf666E1d73A3A456fC7a68de82eCA', + HASH_CONSENSUS_ADDRESS: '0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37', +} +export interface Proxy { + name: string + address: string + functions: Map +} + +export interface ContractWithAssetRecoverer { + name: string + address: string + functions: Map +} + +export interface PausableContract { + name: string + address: string + functions: Map +} + +export const CSM_PROXY_CONTRACTS: Proxy[] = [ + { + name: 'CSModule', + address: DeploymentAddresses.CS_MODULE_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSAccounting', + address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSFeeDistributor', + address: DeploymentAddresses.CS_FEE_DISTRIBUTOR_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSFeeOracle', + address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, +] + +export const CONTRACTS_WITH_ASSET_RECOVERER: ContractWithAssetRecoverer[] = [ + { + name: 'CSModule', + address: DeploymentAddresses.CS_MODULE_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSAccounting', + address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSFeeDistributor', + address: DeploymentAddresses.CS_FEE_DISTRIBUTOR_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSFeeOracle', + address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, +] + +export const PAUSABLE_CONTRACTS: PausableContract[] = [ + { + name: 'CSModule', + address: DeploymentAddresses.CS_MODULE_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSAccounting', + address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSFeeOracle', + address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, +] diff --git a/csm-alerts/src/utils/constants.mainnet.ts b/csm-alerts/src/utils/constants.mainnet.ts new file mode 100644 index 000000000..55233c671 --- /dev/null +++ b/csm-alerts/src/utils/constants.mainnet.ts @@ -0,0 +1,143 @@ +// ETHEREUM COMMON ADDRESSES + +export type DeploymentAddress = { + CS_MODULE_ADDRESS: string + CS_ACCOUNTING_ADDRESS: string + CS_FEE_DISTRIBUTOR_ADDRESS: string + CS_FEE_ORACLE_ADDRESS: string + CS_VERIFIER_ADDRESS: string + CS_EARLY_ADOPTION_ADDRESS: string + CSM_GATE_SEAL_ADDRESS: string + LIDO_STETH_ADDRESS: string + BURNER_ADDRESS: string + ACCOUNTING_HASH_CONSENSUS_ADDRESS: string + HASH_CONSENSUS_ADDRESS: string +} + +export const DeploymentAddresses: DeploymentAddress = { + CS_MODULE_ADDRESS: '', + CS_ACCOUNTING_ADDRESS: '', + CS_FEE_DISTRIBUTOR_ADDRESS: '', + CS_FEE_ORACLE_ADDRESS: '', + CS_VERIFIER_ADDRESS: '', + CS_EARLY_ADOPTION_ADDRESS: '', + CSM_GATE_SEAL_ADDRESS: '', + LIDO_STETH_ADDRESS: '', + BURNER_ADDRESS: '', + ACCOUNTING_HASH_CONSENSUS_ADDRESS: '', + HASH_CONSENSUS_ADDRESS: '', +} +export interface Proxy { + name: string + address: string + functions: Map +} + +export interface ContractWithAssetRecoverer { + name: string + address: string + functions: Map +} + +export interface PausableContract { + name: string + address: string + functions: Map +} + +export const CSM_PROXY_CONTRACTS: Proxy[] = [ + { + name: 'CSModule', + address: DeploymentAddresses.CS_MODULE_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSAccounting', + address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSFeeDistributor', + address: DeploymentAddresses.CS_FEE_DISTRIBUTOR_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSFeeOracle', + address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, +] + +export const CONTRACTS_WITH_ASSET_RECOVERER: ContractWithAssetRecoverer[] = [ + { + name: 'CSModule', + address: DeploymentAddresses.CS_MODULE_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSAccounting', + address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSFeeDistributor', + address: DeploymentAddresses.CS_FEE_DISTRIBUTOR_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSFeeOracle', + address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, +] + +export const PAUSABLE_CONTRACTS: PausableContract[] = [ + { + name: 'CSModule', + address: DeploymentAddresses.CS_MODULE_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSAccounting', + address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, + { + name: 'CSFeeOracle', + address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, + functions: new Map([ + ['admin', 'proxy__getAdmin'], + ['implementation', 'proxy__getImplementation'], + ]), + }, +] diff --git a/csm-alerts/src/utils/constants.ts b/csm-alerts/src/utils/constants.ts new file mode 100644 index 000000000..8d07b021f --- /dev/null +++ b/csm-alerts/src/utils/constants.ts @@ -0,0 +1,8 @@ +import BigNumber from 'bignumber.js' + +export const ETH_DECIMALS = new BigNumber(10).pow(18) +export const SECONDS_PER_SLOT = 12 +export const ONE_HOUR = 60 * 60 +export const ONE_DAY = 24 * ONE_HOUR +export const ONE_WEEK = 7 * ONE_DAY +export const ONE_MONTH = ONE_WEEK * 4 diff --git a/csm-alerts/src/utils/env/env.ts b/csm-alerts/src/utils/env/env.ts new file mode 100644 index 000000000..80f87ecb9 --- /dev/null +++ b/csm-alerts/src/utils/env/env.ts @@ -0,0 +1,43 @@ +import 'dotenv/config' + +export class Config { + public readonly appName: string + public readonly nodeEnv: string + public readonly instance: string + public readonly ethereumRpcUrl: string + public readonly dataProvider: string + + public readonly grpcPort: number + public readonly httpPort: number + public readonly logFormat: string + public readonly logLevel: string + + public readonly chainId: number + public readonly promPrefix: string + public readonly useFortaProvider: boolean + + constructor() { + this.appName = process.env.APP_NAME || 'csm-alerts' + this.nodeEnv = process.env.NODE_ENV || 'production' + this.instance = process.env.INSTANCE || 'forta' + + this.grpcPort = parseInt(process.env.AGENT_GRPC_PORT!, 10) || 50051 + this.httpPort = parseInt(process.env.HTTP_PORT!, 10) || 3000 + this.logFormat = process.env.LOG_FORMAT || 'simple' + this.logLevel = process.env.LOG_LEVEL || 'info' + + this.chainId = parseInt(process.env.FORTA_CHAIN_ID!, 10) || 17000 + this.ethereumRpcUrl = process.env.ETHEREUM_RPC_URL || 'https://holesky.drpc.org' + + this.promPrefix = this.appName.replace('-', '_') + '_' + this.useFortaProvider = process.env.USE_FORTA_RPC_URL === 'true' + + const urlRegex = /^(?:https?:\/\/)?(?:www\.)?([^/\n]+)/ + + this.dataProvider = '' + const match = this.ethereumRpcUrl.match(urlRegex) + if (match) { + this.dataProvider = match[1] + } + } +} diff --git a/csm-alerts/src/utils/errors.ts b/csm-alerts/src/utils/errors.ts new file mode 100644 index 000000000..d374b1387 --- /dev/null +++ b/csm-alerts/src/utils/errors.ts @@ -0,0 +1,54 @@ +import { Finding } from '../generated/proto/alert_pb' + +export const NetworkErrorFinding = 'NETWORK-ERROR' + +export function networkAlert(err: Error, name: string, desc: string): Finding { + const f: Finding = new Finding() + f.setName(name) + f.setDescription(desc) + f.setAlertid(NetworkErrorFinding) + f.setSeverity(Finding.Severity.UNKNOWN) + f.setType(Finding.FindingType.DEGRADED) + f.setProtocol('ethereum') + + const m = f.getMetadataMap() + m.set('stack', `${err.stack}`) + m.set('message', `${err.message}`) + m.set('name', `${err.name}`) + + return f +} + +export function dbAlert(err: Error, name: string, desc: string): Finding { + const f: Finding = new Finding() + f.setName(name) + f.setDescription(desc) + f.setAlertid('DB-ERROR') + f.setSeverity(Finding.Severity.UNKNOWN) + f.setType(Finding.FindingType.DEGRADED) + f.setProtocol('ethereum') + + const m = f.getMetadataMap() + m.set('stack', `${err.stack}`) + m.set('message', `${err.message}`) + m.set('name', `${err.name}`) + + return f +} + +export class NetworkError extends Error { + constructor(e: unknown, name?: string) { + super() + + if (name !== undefined) { + this.name = name + } + + if (e instanceof Error) { + this.stack = e.stack + this.message = e.message + } else { + this.message = `${e}` + } + } +} diff --git a/csm-alerts/src/utils/events/asset_recoverer_events.ts b/csm-alerts/src/utils/events/asset_recoverer_events.ts new file mode 100644 index 000000000..45969ef4d --- /dev/null +++ b/csm-alerts/src/utils/events/asset_recoverer_events.ts @@ -0,0 +1,81 @@ +import { EventOfNotice } from '../../entity/events' +import { Result } from '@ethersproject/abi/lib' +import { etherscanAddress } from '../string' +import { Finding } from '../../generated/proto/alert_pb' + +interface ContractWithAssetRecoverer { + name: string + address: string + functions: Map +} + +export function getAssetRecovererEvents(CONTRACTS_WITH_ASSET_RECOVERER: ContractWithAssetRecoverer[]): EventOfNotice[] { + return CONTRACTS_WITH_ASSET_RECOVERER.flatMap((ContractWithAssetRecovererInfo: ContractWithAssetRecoverer) => { + return [ + { + address: ContractWithAssetRecovererInfo.address, + abi: 'event ERC20Recovered(address indexed token, address indexed recipient, uint256 amount)', + alertId: 'ASSET-RECOVERER-ERC20-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: ERC20 recovered', + description: (args: Result) => + `ERC20 recovered on ${ContractWithAssetRecovererInfo.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Token: ${etherscanAddress(args.token)}\n` + + `Amount: ${args.amount}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: ContractWithAssetRecovererInfo.address, + abi: 'event ERC721Recovered(address indexed token, uint256 tokenId, address indexed recipient)', + alertId: 'ASSET-RECOVERER-ERC721-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: ERC721 recovered', + description: (args: Result) => + `ERC721 recovered on ${ContractWithAssetRecovererInfo.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Token: ${etherscanAddress(args.token)}\n` + + `Token ID: ${args.tokenId}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: ContractWithAssetRecovererInfo.address, + abi: 'event ERC1155Recovered(address indexed token, uint256 tokenId, address indexed recipient, uint256 amount)', + alertId: 'ASSET-RECOVERER-ERC1155-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: ERC1155 recovered', + description: (args: Result) => + `ERC1155 recovered on ${ContractWithAssetRecovererInfo.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Token: ${etherscanAddress(args.token)}\n` + + `Token ID: ${args.tokenId}\n` + + `Amount: ${args.amount}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: ContractWithAssetRecovererInfo.address, + abi: 'event EtherRecovered(address indexed recipient, uint256 amount)', + alertId: 'ASSET-RECOVERER-ETHER-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: Ether recovered', + description: (args: Result) => + `Ether recovered on ${ContractWithAssetRecovererInfo.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Amount: ${args.amount}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: ContractWithAssetRecovererInfo.address, + abi: 'event StETHSharesRecovered(address indexed recipient, uint256 shares)', + alertId: 'ASSET-RECOVERER-STETH-SHARES-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: StETH Shares recovered', + description: (args: Result) => + `StETH Shares recovered on ${ContractWithAssetRecovererInfo.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Shares: ${args.shares}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + ] + }) +} diff --git a/csm-alerts/src/utils/events/cs_accounting_events.ts b/csm-alerts/src/utils/events/cs_accounting_events.ts new file mode 100644 index 000000000..1dc1cf295 --- /dev/null +++ b/csm-alerts/src/utils/events/cs_accounting_events.ts @@ -0,0 +1,56 @@ +import { EventOfNotice } from '../../entity/events' +import { Result } from '@ethersproject/abi/lib' +import { etherscanAddress, toEthString } from '../string' +import { Finding } from '../../generated/proto/alert_pb' +import BigNumber from 'bignumber.js' + +export const APPROVAL_EVENT = 'event Approval(address indexed owner, address indexed spender, uint256 value)' + +export function getCSAccountingEvents(CS_ACCOUNTING_ADDRESS: string): EventOfNotice[] { + return [ + { + address: CS_ACCOUNTING_ADDRESS, + abi: 'event ChargePenaltyRecipientSet(address chargeRecipient)', + alertId: 'CS-ACCOUNTING-CHARGE-PENALTY-RECIPIENT-SET', + name: '🚨 CSAccounting: Charge penalty recipient set', + description: (args: Result) => + `Charge penalty recipient set to ${etherscanAddress(args.chargeRecipient)} (expecting the treasury)`, + severity: Finding.Severity.CRITICAL, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_ACCOUNTING_ADDRESS, + abi: 'event BondCurveUpdated(uint256 indexed curveId, uint256[] bondCurve)', + alertId: 'CS-ACCOUNTING-BOND-CURVE-UPDATED', + name: '🚨 CSAccounting: Bond curve updated', + description: (args: Result) => { + const bondCurveString = args.bondCurve.map((value: string) => toEthString(BigNumber(Number(value)))).join(', ') + return `Bond curve updated with curve ID ${args.curveId}. Bond curve: [${bondCurveString}]` + }, + severity: Finding.Severity.CRITICAL, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_ACCOUNTING_ADDRESS, + abi: 'event BondCurveAdded(uint256[] bondCurve)', + alertId: 'CS-ACCOUNTING-BOND-CURVE-ADDED', + name: 'πŸ”΄ CSAccounting: Bond curve added', + description: (args: Result) => { + const bondCurveString = args.bondCurve.map((value: string) => toEthString(BigNumber(Number(value)))).join(', ') + return `Bond curve added: [${bondCurveString}]` + }, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_ACCOUNTING_ADDRESS, + abi: 'event BondCurveSet(uint256 indexed nodeOperatorId, uint256 curveId)', + alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', + name: 'πŸ”΄ CSAccounting: Bond curve set', + description: (args: Result) => + `Bond curve set for node operator ID ${args.nodeOperatorId} with curve ID ${args.curveId}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + ] +} diff --git a/csm-alerts/src/utils/events/cs_fee_distributor_events.ts b/csm-alerts/src/utils/events/cs_fee_distributor_events.ts new file mode 100644 index 000000000..1cdebcc43 --- /dev/null +++ b/csm-alerts/src/utils/events/cs_fee_distributor_events.ts @@ -0,0 +1,26 @@ +import { EventOfNotice } from '../../entity/events' +import { Result } from '@ethersproject/abi/lib' +import { Finding } from '../../generated/proto/alert_pb' + +export const TRANSFER_SHARES_EVENT = + 'event TransferShares(address indexed from, address indexed to, uint256 sharesValue)' +export const DISTRIBUTION_DATA_UPDATED_EVENT = + 'event DistributionDataUpdated(uint256 totalClaimableShares, bytes32 treeRoot, string treeCid)' + +export function getCSFeeDistributorEvents(CS_FEE_DISTRIBUTOR_ADDRESS: string): EventOfNotice[] { + return [ + { + address: CS_FEE_DISTRIBUTOR_ADDRESS, + abi: DISTRIBUTION_DATA_UPDATED_EVENT, + alertId: 'CSFEE-DISTRIBUTOR-DISTRIBUTION-DATA-UPDATED', + name: 'πŸ”΅ CSFeeDistributor: Distribution data updated', + description: (args: Result) => + `Distribution data updated:\n` + + `Total Claimable Shares: ${args.totalClaimableShares}\n` + + `Tree Root: ${args.treeRoot}\n` + + `Tree CID: ${args.treeCid}`, + severity: Finding.Severity.INFO, + type: Finding.FindingType.INFORMATION, + }, + ] +} diff --git a/csm-alerts/src/utils/events/cs_fee_oracle_events.ts b/csm-alerts/src/utils/events/cs_fee_oracle_events.ts new file mode 100644 index 000000000..7268dbc13 --- /dev/null +++ b/csm-alerts/src/utils/events/cs_fee_oracle_events.ts @@ -0,0 +1,175 @@ +import { EventOfNotice } from '../../entity/events' +import { Result } from '@ethersproject/abi/lib' +import { etherscanAddress } from '../string' +import { Finding } from '../../generated/proto/alert_pb' + +export const HASH_CONSENSUS_REPORT_RECEIVED_EVENT = + 'event ReportReceived(uint256 indexed refSlot, address indexed member, bytes32 report)' + +export const CS_FEE_ORACLE_REPORT_SUBMITTED_EVENT = + 'event ReportSubmitted(uint256 indexed refSlot, bytes32 hash, uint256 processingDeadlineTime)' + +export function getHashConsensusEvents(HASH_CONSENSUS_ADDRESS: string): EventOfNotice[] { + return [ + { + address: HASH_CONSENSUS_ADDRESS, + abi: 'event MemberAdded(address indexed addr, uint256 newTotalMembers, uint256 newQuorum)', + alertId: 'HASH-CONSENSUS-MEMBER-ADDED', + name: 'πŸ”΄ HashConsensus: Member added', + description: (args: Result) => + `New member ${etherscanAddress(args.addr)} added. Total members: ${args.newTotalMembers}, New quorum: ${args.newQuorum}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: HASH_CONSENSUS_ADDRESS, + abi: 'event MemberRemoved(address indexed addr, uint256 newTotalMembers, uint256 newQuorum)', + alertId: 'HASH-CONSENSUS-MEMBER-REMOVED', + name: 'πŸ”΄ HashConsensus: Member removed', + description: (args: Result) => + `Member ${etherscanAddress(args.addr)} removed. Total members: ${args.newTotalMembers}, New quorum: ${args.newQuorum}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: HASH_CONSENSUS_ADDRESS, + abi: 'event QuorumSet(uint256 newQuorum, uint256 totalMembers, uint256 prevQuorum)', + alertId: 'HASH-CONSENSUS-QUORUM-SET', + name: 'πŸ”΄ HashConsensus: Quorum set', + description: (args: Result) => + `Quorum set to ${args.newQuorum}. Total members: ${args.totalMembers}, Previous quorum: ${args.prevQuorum}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: HASH_CONSENSUS_ADDRESS, + abi: 'event FastLaneConfigSet(uint256 fastLaneLengthSlots)', + alertId: 'HASH-CONSENSUS-FASTLANE-CONFIG-SET', + name: 'πŸ”΄ HashConsensus: Fastlane config set', + description: (args: Result) => `Fastlane configuration set with length slots: ${args.fastLaneLengthSlots}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: HASH_CONSENSUS_ADDRESS, + abi: 'event FrameConfigSet(uint256 newInitialEpoch, uint256 newEpochsPerFrame)', + alertId: 'HASH-CONSENSUS-FRAME-CONFIG-SET', + name: 'πŸ”΄ HashConsensus: Frame config set', + description: (args: Result) => + `Frame configuration set. New initial epoch: ${args.newInitialEpoch}, Epochs per frame: ${args.newEpochsPerFrame}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: HASH_CONSENSUS_ADDRESS, + abi: 'event ReportProcessorSet(address indexed processor, address indexed prevProcessor)', + alertId: 'HASH-CONSENSUS-REPORT-PROCESSOR-SET', + name: 'πŸ”΄ HashConsensus: Report processor set', + description: (args: Result) => + `Report processor set. New processor: ${etherscanAddress(args.processor)}, Previous processor: ${etherscanAddress(args.prevProcessor)}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: HASH_CONSENSUS_ADDRESS, + abi: 'event ConsensusLost(uint256 indexed refSlot)', + alertId: 'HASH-CONSENSUS-LOST', + name: 'πŸ”΄ HashConsensus: Consensus lost', + description: (args: Result) => `Consensus lost for slot ${args.refSlot}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: HASH_CONSENSUS_ADDRESS, + abi: 'event ConsensusReached(uint256 indexed refSlot, bytes32 report, uint256 support)', + alertId: 'HASH-CONSENSUS-REACHED', + name: 'πŸ”΅ HashConsensus: Consensus reached, report received', + description: (args: Result) => + `Consensus reached for slot ${args.refSlot}. Report hash: ${args.report}, Support: ${args.support}`, + severity: Finding.Severity.INFO, + type: Finding.FindingType.INFORMATION, + }, + ] +} + +export function getCSFeeOracleEvents(CS_FEE_ORACLE_ADDRESS: string): EventOfNotice[] { + return [ + { + address: CS_FEE_ORACLE_ADDRESS, + abi: 'event ConsensusHashContractSet(address indexed addr, address indexed prevAddr)', + alertId: 'CSFEE-ORACLE-CONSENSUS-HASH-CONTRACT-SET', + name: '🚨 CSFeeOracle: Consensus hash contract set', + description: (args: Result) => + `Consensus hash contract set to ${etherscanAddress(args.addr)}, previous contract was ${etherscanAddress(args.prevAddr)}`, + severity: Finding.Severity.CRITICAL, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_FEE_ORACLE_ADDRESS, + abi: 'event PerfLeewaySet(uint256 valueBP)', + alertId: 'CSFEE-ORACLE-PERF-LEEWAY-SET', + name: 'πŸ”΄ CSFeeOracle: Performance leeway updated', + description: (args: Result) => `Performance leeway set to ${args.valueBP} basis points`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_FEE_ORACLE_ADDRESS, + abi: 'event FeeDistributorContractSet(address feeDistributorContract)', + alertId: 'CSFEE-ORACLE-FEE-DISTRIBUTOR-CONTRACT-SET', + name: 'πŸ”΄ CSFeeOracle: New CSFeeDistributor set', + description: (args: Result) => + `New CSFeeDistributor contract set to ${etherscanAddress(args.feeDistributorContract)}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_FEE_ORACLE_ADDRESS, + abi: 'event ConsensusVersionSet(uint256 indexed version, uint256 indexed prevVersion)', + alertId: 'CSFEE-ORACLE-CONSENSUS-VERSION-SET', + name: 'πŸ”΄ CSFeeOracle: Consensus version set', + description: (args: Result) => + `Consensus version set to ${args.version}, previous version was ${args.prevVersion}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_FEE_ORACLE_ADDRESS, + abi: 'event WarnProcessingMissed(uint256 indexed refSlot)', + alertId: 'CSFEE-ORACLE-PROCESSING-MISSED', + name: 'πŸ”΄ CSFeeOracle: Processing missed', + description: (args: Result) => `Processing missed for slot ${args.refSlot}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_FEE_ORACLE_ADDRESS, + abi: CS_FEE_ORACLE_REPORT_SUBMITTED_EVENT, + alertId: 'CSFEE-ORACLE-REPORT-SUBMITTED', + name: 'πŸ”΅ CSFeeOracle: Report submitted', + description: (args: Result) => + `Report submitted for slot ${args.refSlot}. Hash: ${args.hash}, Processing deadline time: ${args.processingDeadlineTime}`, + severity: Finding.Severity.INFO, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_FEE_ORACLE_ADDRESS, + abi: 'event ProcessingStarted(uint256 indexed refSlot, bytes32 hash)', + alertId: 'CSFEE-ORACLE-PROCESSING-STARTED', + name: 'πŸ”΅ CSFeeOracle: Processing started', + description: (args: Result) => `Processing started for slot ${args.refSlot}. Hash: ${args.hash}`, + severity: Finding.Severity.INFO, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_FEE_ORACLE_ADDRESS, + abi: 'event ReportSettled(uint256 indexed refSlot, uint256 distributed, bytes32 treeRoot, string treeCid)', + alertId: 'CSFEE-ORACLE-REPORT-SETTLED', + name: 'πŸ”΅ CSFeeOracle: Report settled', + description: (args: Result) => + `Report settled for slot ${args.refSlot}. Distributed: ${args.distributed}, Tree root: ${args.treeRoot}, Tree CID: ${args.treeCid}`, + severity: Finding.Severity.INFO, + type: Finding.FindingType.INFORMATION, + }, + ] +} diff --git a/csm-alerts/src/utils/events/mocks/events.mock.ts b/csm-alerts/src/utils/events/mocks/events.mock.ts new file mode 100644 index 000000000..30ab8867d --- /dev/null +++ b/csm-alerts/src/utils/events/mocks/events.mock.ts @@ -0,0 +1,19 @@ +import { Result } from '@ethersproject/abi' +import { LogDescription } from 'forta-agent' +import { faker } from '@faker-js/faker' + +export function createLogDescriptionMock(args?: Result): jest.Mocked { + return { + address: faker.finance.ethereumAddress(), + // eslint-disable-next-line + // @ts-expect-error + args: args ?? {}, + // eslint-disable-next-line + // @ts-expect-error + eventFragment: jest.fn(), + logIndex: faker.number.int(), + name: faker.string.uuid(), + signature: faker.finance.ethereumAddress(), + topic: faker.finance.ethereumAddress(), + } +} diff --git a/csm-alerts/src/utils/events/ossified_proxy_events.ts b/csm-alerts/src/utils/events/ossified_proxy_events.ts new file mode 100644 index 000000000..47a00632b --- /dev/null +++ b/csm-alerts/src/utils/events/ossified_proxy_events.ts @@ -0,0 +1,55 @@ +import { EventOfNotice } from '../../entity/events' +import { Result } from '@ethersproject/abi/lib' +import { etherscanAddress } from '../string' +import { Finding } from '../../generated/proto/alert_pb' + +interface Proxy { + name: string + address: string + functions: Map +} + +export function getOssifiedProxyEvents(CSM_PROXY_CONTRACTS: Proxy[]): EventOfNotice[] { + return CSM_PROXY_CONTRACTS.flatMap((proxyInfo: Proxy) => { + return [ + { + address: proxyInfo.address, + abi: 'event ProxyOssified()', + alertId: 'PROXY-OSSIFIED', + name: `🚨 ${proxyInfo.name}: Proxy Ossified`, + description: () => `Proxy for ${proxyInfo.name}(${etherscanAddress(proxyInfo.address)}) was ossified`, + severity: Finding.Severity.CRITICAL, + type: Finding.FindingType.INFORMATION, + }, + { + address: proxyInfo.address, + abi: 'event Upgraded(address indexed implementation)', + alertId: 'PROXY-UPGRADED', + name: `🚨 ${proxyInfo.name}: Implementation Upgraded`, + description: (args: Result) => + `The proxy implementation has been upgraded to ${args.implementation.toLowerCase()}`, + severity: Finding.Severity.CRITICAL, + type: Finding.FindingType.INFORMATION, + }, + { + address: proxyInfo.address, + abi: 'event AdminChanged(address previousAdmin, address newAdmin)', + alertId: 'PROXY-ADMIN-CHANGED', + name: `🚨 ${proxyInfo.name}: Admin Changed`, + description: (args: Result) => + `The proxy admin for ${proxyInfo.name}(${proxyInfo.address}) has been changed from ${etherscanAddress(args.previousAdmin)} to ${etherscanAddress(args.newAdmin)}`, + severity: Finding.Severity.CRITICAL, + type: Finding.FindingType.INFORMATION, + }, + { + address: proxyInfo.address, + abi: 'event BeaconUpgraded(address indexed beacon)', + alertId: 'PROXY-BEACON-UPGRADED', + name: `🚨 ${proxyInfo.address}: Beacon Upgraded`, + description: (args: Result) => `The proxy beacon has been upgraded to ${etherscanAddress(args.beacon)}`, + severity: Finding.Severity.CRITICAL, + type: Finding.FindingType.INFORMATION, + }, + ] + }) +} diff --git a/csm-alerts/src/utils/events/pausable_events.ts b/csm-alerts/src/utils/events/pausable_events.ts new file mode 100644 index 000000000..877ff644a --- /dev/null +++ b/csm-alerts/src/utils/events/pausable_events.ts @@ -0,0 +1,36 @@ +import { Result } from '@ethersproject/abi/lib' +import { EventOfNotice } from '../../entity/events' +import { Finding } from '../../generated/proto/alert_pb' +import { toKebabCase } from '../string' +import { ONE_HOUR } from '../constants' + +interface PausableContract { + name: string + address: string + functions: Map +} + +export function getPausableEvents(PAUSABLE_CONTRACTS: PausableContract[]): EventOfNotice[] { + return PAUSABLE_CONTRACTS.flatMap((pausableContractInfo: PausableContract) => { + return [ + { + address: pausableContractInfo.address, + abi: 'event Paused(uint256 duration)', + alertId: `${toKebabCase(pausableContractInfo.name)}-PAUSED`, + name: `🚨 ${pausableContractInfo.name}: contract was paused`, + description: (args: Result) => `For ${args.duration / ONE_HOUR} hours`, + severity: Finding.Severity.CRITICAL, + type: Finding.FindingType.INFORMATION, + }, + { + address: pausableContractInfo.address, + abi: 'event Resumed()', + alertId: `${toKebabCase(pausableContractInfo.name)}-UNPAUSED`, + name: `🚨 ${pausableContractInfo.name}: contract was resumed`, + description: () => 'Contract was resumed', + severity: Finding.Severity.CRITICAL, + type: Finding.FindingType.INFORMATION, + }, + ] + }) +} diff --git a/csm-alerts/src/utils/metrics/metrics.ts b/csm-alerts/src/utils/metrics/metrics.ts new file mode 100644 index 000000000..743e4e790 --- /dev/null +++ b/csm-alerts/src/utils/metrics/metrics.ts @@ -0,0 +1,88 @@ +import { Counter, Gauge, Histogram, Registry, Summary } from 'prom-client' + +export const StatusOK = 'ok' +export const StatusFail = 'fail' +export const HandleBlockLabel = 'handleBlock' +export const HandleTxLabel = 'handleTx' + +export class Metrics { + private readonly registry: Registry + private readonly prefix: string + + public readonly healthStatus: Gauge + public readonly buildInfo: Gauge + + public readonly etherJsRequest: Counter + public readonly networkErrors: Counter + public readonly lastBlockNumber: Gauge + public readonly etherJsDurationHistogram: Histogram + public readonly lastAgentTouch: Gauge + public readonly processedIterations: Counter + public readonly summaryHandlers: Summary + + constructor(registry: Registry, prefix: string) { + this.registry = registry + this.prefix = prefix + + this.buildInfo = new Gauge({ + name: this.prefix + 'build_info', + help: 'Build information', + labelNames: ['commitHash' as const], + registers: [this.registry], + }) + + this.healthStatus = new Gauge({ + name: this.prefix + 'health_status', + help: 'Bot health status', + labelNames: ['instance'] as const, + registers: [this.registry], + }) + + this.etherJsRequest = new Counter({ + name: this.prefix + 'etherjs_request_total', + help: 'Total number of requests via ether.js library', + labelNames: ['method' as const, 'status' as const] as const, + registers: [this.registry], + }) + + this.etherJsDurationHistogram = new Histogram({ + name: this.prefix + 'ether_requests_duration_seconds', + help: 'Histogram of the duration of requests in seconds', + labelNames: ['method', 'status'], + buckets: [0.001, 0.01, 0.1, 0.5, 1, 2.5, 5, 10], + }) + + this.lastAgentTouch = new Gauge({ + name: this.prefix + 'block_timestamp', + help: 'The last agent iteration', + labelNames: ['method' as const] as const, + registers: [this.registry], + }) + + this.lastBlockNumber = new Gauge({ + name: this.prefix + 'last_block_number', + help: 'The last agent block number', + registers: [this.registry], + }) + + this.networkErrors = new Counter({ + name: this.prefix + 'network_errors_total', + help: 'Total number of network errors', + registers: [this.registry], + }) + + this.processedIterations = new Counter({ + name: this.prefix + 'processed_iterations_total', + help: 'Total number of finding iterations', + labelNames: ['method', 'status'], + registers: [this.registry], + }) + + this.summaryHandlers = new Summary({ + name: this.prefix + 'request_processing_seconds', + help: 'Time spent processing request (block or transaction)', + labelNames: ['method'], + registers: [this.registry], + }) + } +} diff --git a/csm-alerts/src/utils/mutex.ts b/csm-alerts/src/utils/mutex.ts new file mode 100644 index 000000000..377f148fe --- /dev/null +++ b/csm-alerts/src/utils/mutex.ts @@ -0,0 +1,32 @@ +import { Mutex, MutexInterface, withTimeout } from 'async-mutex' + +export class DataRW { + private mutex: MutexInterface + private value: T[] + + constructor(initialValue: T[]) { + this.mutex = withTimeout(new Mutex(), 100) + this.value = initialValue + } + + async read(): Promise { + await this.mutex.acquire() + try { + const out = this.value + this.value = [] + + return out + } finally { + this.mutex.release() + } + } + + async write(newValue: T[]): Promise { + await this.mutex.acquire() + try { + this.value.push(...newValue) + } finally { + this.mutex.release() + } + } +} diff --git a/csm-alerts/src/utils/string.ts b/csm-alerts/src/utils/string.ts new file mode 100644 index 000000000..3c441dc12 --- /dev/null +++ b/csm-alerts/src/utils/string.ts @@ -0,0 +1,15 @@ +import { ETH_DECIMALS } from './constants' +import BigNumber from 'bignumber.js' + +export function etherscanAddress(address: string): string { + const subpath = process.env.FORTA_AGENT_RUN_TIER == 'testnet' ? 'holesky.' : '' + return `[${address}](https://${subpath}etherscan.io/address/${address})` +} + +export function toEthString(wei: BigNumber): string { + return wei.dividedBy(ETH_DECIMALS).toFixed(3) + ' ETH' +} + +export function toKebabCase(str: string): string { + return str.replace(/_/g, '-') +} diff --git a/csm-alerts/src/utils/time.ts b/csm-alerts/src/utils/time.ts new file mode 100644 index 000000000..2b2433be3 --- /dev/null +++ b/csm-alerts/src/utils/time.ts @@ -0,0 +1,32 @@ +export function formatTime(timeInMillis: number): string { + const seconds = (timeInMillis / 1000).toFixed(3) + return `${seconds} seconds` +} + +export function elapsedTime(methodName: string, startTime: number): string { + const elapsedTime = new Date().getTime() - startTime + return `${methodName} started at ${formatTimeToHumanReadable(new Date(startTime))}. Elapsed: ${formatTime( + elapsedTime, + )}` +} + +function formatTimeToHumanReadable(date: Date): string { + return `${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}` +} + +export function formatDelay(fullDelaySec: number): string { + const sign = fullDelaySec >= 0 ? 1 : -1 + let delayHours = 0 + let delayMin = Math.floor((sign * fullDelaySec) / 60) + const delaySec = sign * fullDelaySec - delayMin * 60 + if (delayMin >= 60) { + delayHours = Math.floor(delayMin / 60) + delayMin -= delayHours * 60 + } + return ( + (sign == 1 ? '' : '-') + + (delayHours > 0 ? `${delayHours} hrs ` : '') + + (delayMin > 0 ? `${delayMin} min ` : '') + + `${delaySec} sec` + ) +} diff --git a/csm-alerts/src/utils/utils.ts b/csm-alerts/src/utils/utils.ts new file mode 100644 index 000000000..25d6713fe --- /dev/null +++ b/csm-alerts/src/utils/utils.ts @@ -0,0 +1,17 @@ +import { Contract, EventFilter, Event } from 'ethers' + +const LOG_FILTER_CHUNK = 2000 + +export async function getLogsByChunks(contract: Contract, filter: EventFilter, startblock: number, endBlock: number) { + const events: Event[] = [] + let endBlockChunk + let startBlockChunk = startblock + do { + endBlockChunk = + endBlock > startBlockChunk + LOG_FILTER_CHUNK - 1 ? startBlockChunk + LOG_FILTER_CHUNK - 1 : endBlock + const eventsChunk = await contract.queryFilter(filter, startBlockChunk, endBlockChunk) + events.push(...eventsChunk) + startBlockChunk = endBlockChunk + 1 + } while (endBlockChunk < endBlock) + return events +} diff --git a/csm-alerts/src/utils/version.ts b/csm-alerts/src/utils/version.ts new file mode 100644 index 000000000..34c3048c8 --- /dev/null +++ b/csm-alerts/src/utils/version.ts @@ -0,0 +1,27 @@ +import path from 'path' + +export interface Version { + desc: string + commitHash: string + commitHashShort: string + commitMsg: string + commitMsgShort: string + isWdClean: boolean +} + +export default readVersion(path.join(__dirname, '..', './version.json')) + +function readVersion(versionFilePath: string): Version { + try { + return require(versionFilePath) + } catch (e) { + return { + desc: 'unknown', + commitHash: 'unknown', + commitHashShort: 'unknown', + commitMsg: 'unknown', + commitMsgShort: 'unknown', + isWdClean: false, + } + } +} diff --git a/csm-alerts/tools/go.mod b/csm-alerts/tools/go.mod new file mode 100644 index 000000000..4e1f44367 --- /dev/null +++ b/csm-alerts/tools/go.mod @@ -0,0 +1,173 @@ +module tools + +go 1.22.3 + +require github.com/prometheus/prometheus v0.52.1 + +require ( + cloud.google.com/go/auth v0.2.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.0 // indirect + cloud.google.com/go/compute/metadata v0.3.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.6.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + github.com/Code-Hex/go-generics-cache v1.5.1 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/alecthomas/kingpin/v2 v2.4.0 // indirect + github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect + github.com/armon/go-metrics v0.4.1 // indirect + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect + github.com/aws/aws-sdk-go v1.51.25 // indirect + github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dennwc/varint v1.0.0 // indirect + github.com/digitalocean/godo v1.113.0 // indirect + github.com/distribution/reference v0.5.0 // indirect + github.com/docker/docker v26.0.1+incompatible // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/edsrzf/mmap-go v1.1.0 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/envoyproxy/go-control-plane v0.12.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect + github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect + github.com/fatih/color v1.15.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/analysis v0.22.2 // indirect + github.com/go-openapi/errors v0.22.0 // indirect + github.com/go-openapi/jsonpointer v0.20.2 // indirect + github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/loads v0.21.5 // indirect + github.com/go-openapi/spec v0.20.14 // indirect + github.com/go-openapi/strfmt v0.23.0 // indirect + github.com/go-openapi/swag v0.22.9 // indirect + github.com/go-openapi/validate v0.23.0 // indirect + github.com/go-resty/resty/v2 v2.12.0 // indirect + github.com/go-zookeeper/zk v1.0.3 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20240416155748-26353dc0451f // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.3 // indirect + github.com/gophercloud/gophercloud v1.11.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect + github.com/hashicorp/consul/api v1.28.2 // indirect + github.com/hashicorp/cronexpr v1.1.2 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.4 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect + github.com/hashicorp/golang-lru v0.6.0 // indirect + github.com/hashicorp/nomad/api v0.0.0-20240418183417-ea5f2f6748c7 // indirect + github.com/hashicorp/serf v0.10.1 // indirect + github.com/hetznercloud/hcloud-go/v2 v2.7.2 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.8 // indirect + github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect + github.com/kylelemons/godebug v1.1.0 // indirect + github.com/linode/linodego v1.32.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/miekg/dns v1.1.59 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1 // indirect + github.com/oklog/ulid v1.3.1 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/ovh/go-ovh v1.4.3 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/alertmanager v0.27.0 // indirect + github.com/prometheus/client_golang v1.19.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.53.0 // indirect + github.com/prometheus/common/sigv4 v0.1.0 // indirect + github.com/prometheus/exporter-toolkit v0.11.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.26 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/vultr/govultr/v2 v2.17.2 // indirect + github.com/xhit/go-str2duration/v2 v2.1.0 // indirect + go.mongodb.org/mongo-driver v1.14.0 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/collector/featuregate v1.5.0 // indirect + go.opentelemetry.io/collector/pdata v1.5.0 // indirect + go.opentelemetry.io/collector/semconv v0.98.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect + go.opentelemetry.io/otel v1.25.0 // indirect + go.opentelemetry.io/otel/metric v1.25.0 // indirect + go.opentelemetry.io/otel/trace v1.25.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/goleak v1.3.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.24.0 // indirect + golang.org/x/oauth2 v0.19.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.19.0 // indirect + golang.org/x/term v0.19.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.20.0 // indirect + google.golang.org/api v0.174.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be // indirect + google.golang.org/grpc v1.63.2 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.29.3 // indirect + k8s.io/apimachinery v0.29.3 // indirect + k8s.io/client-go v0.29.3 // indirect + k8s.io/klog/v2 v2.120.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect +) diff --git a/csm-alerts/tools/go.sum b/csm-alerts/tools/go.sum new file mode 100644 index 000000000..a072fec9b --- /dev/null +++ b/csm-alerts/tools/go.sum @@ -0,0 +1,969 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/auth v0.2.0 h1:y6oTcpMSbOcXbwYgUUrvI+mrQ2xbrcdpPgtVbCGTLTk= +cloud.google.com/go/auth v0.2.0/go.mod h1:+yb+oy3/P0geX6DLKlqiGHARGR6EX2GRtYCzWOCQSbU= +cloud.google.com/go/auth/oauth2adapt v0.2.0 h1:FR8zevgQwu+8CqiOT5r6xCmJa3pJC/wdXEEPF1OkNhA= +cloud.google.com/go/auth/oauth2adapt v0.2.0/go.mod h1:AfqujpDAlTfLfeCIl/HJZZlIxD8+nJoZ5e0x1IxGq5k= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.6.0 h1:ui3YNbxfW7J3tTFIZMH6LIGRjCngp+J+nIFlnizfNTE= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.6.0/go.mod h1:gZmgV+qBqygoznvqo2J9oKZAFziqhLZ2xE/WVUmzkHA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1 h1:7CBQ+Ei8SP2c6ydQTGCCrS35bDxgTMfoP2miAwK++OU= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= +github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= +github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.51.25 h1:DjTT8mtmsachhV6yrXR8+yhnG6120dazr720nopRsls= +github.com/aws/aws-sdk-go v1.51.25/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= +github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= +github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= +github.com/digitalocean/godo v1.113.0 h1:CLtCxlP4wDAjKIQ+Hshht/UNbgAp8/J/XBH1ZtDCF9Y= +github.com/digitalocean/godo v1.113.0/go.mod h1:Z2mTP848Vi3IXXl5YbPekUgr4j4tOePomA+OE1Ag98w= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/docker v26.0.1+incompatible h1:t39Hm6lpXuXtgkF0dm1t9a5HkbUfdGy6XbWexmGr+hA= +github.com/docker/docker v26.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= +github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= +github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1SCxNI1/Tieq/NFvh6dzLdgi7eu0tM= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= +github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= +github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= +github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= +github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= +github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= +github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= +github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= +github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= +github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= +github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= +github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= +github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= +github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= +github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= +github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= +github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= +github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= +github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= +github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20240416155748-26353dc0451f h1:WpZiq8iqvGjJ3m3wzAVKL6+0vz7VkE79iSy9GII00II= +github.com/google/pprof v0.0.0-20240416155748-26353dc0451f/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= +github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= +github.com/gophercloud/gophercloud v1.11.0 h1:ls0O747DIq1D8SUHc7r2vI8BFbMLeLFuENaAIfEx7OM= +github.com/gophercloud/gophercloud v1.11.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= +github.com/hashicorp/consul/api v1.28.2 h1:mXfkRHrpHN4YY3RqL09nXU1eHKLNiuAN4kHvDQ16k/8= +github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= +github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8= +github.com/hashicorp/consul/sdk v0.16.0/go.mod h1:7pxqqhqoaPqnBnzXD1StKed62LqJeClzVsUEy85Zr0A= +github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= +github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= +github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.6 h1:RSG8rKU28VTUTvEKghe5gIhIQpv8evvNpnDEyqO4u9I= +github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= +github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/nomad/api v0.0.0-20240418183417-ea5f2f6748c7 h1:pjE59CS2C9Bg+Xby0ROrnZSSBWtKwx3Sf9gqsrvIFSA= +github.com/hashicorp/nomad/api v0.0.0-20240418183417-ea5f2f6748c7/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hetznercloud/hcloud-go/v2 v2.7.2 h1:UlE7n1GQZacCfyjv9tDVUN7HZfOXErPIfM/M039u9A0= +github.com/hetznercloud/hcloud-go/v2 v2.7.2/go.mod h1:49tIV+pXRJTUC7fbFZ03s45LKqSQdOPP5y91eOnJo/k= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= +github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= +github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= +github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= +github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/linode/linodego v1.32.0 h1:OmZzB3iON6uu84VtLFf64uKmAQqJJarvmsVguroioPI= +github.com/linode/linodego v1.32.0/go.mod h1:y8GDP9uLVH4jTB9qyrgw79qfKdYJmNCGUOJmfuiOcmI= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= +github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= +github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1 h1:dOYG7LS/WK00RWZc8XGgcUTlTxpp3mKhdR2Q9z9HbXM= +github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= +github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= +github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/prometheus/alertmanager v0.27.0 h1:V6nTa2J5V4s8TG4C4HtrBP/WNSebCCTYGGv4qecA/+I= +github.com/prometheus/alertmanager v0.27.0/go.mod h1:8Ia/R3urPmbzJ8OsdvmZvIprDwvwmYCmUbwBL+jlPOE= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= +github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= +github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= +github.com/prometheus/exporter-toolkit v0.11.0 h1:yNTsuZ0aNCNFQ3aFTD2uhPOvr4iD7fdBvKPAEGkNf+g= +github.com/prometheus/exporter-toolkit v0.11.0/go.mod h1:BVnENhnNecpwoTLiABx7mrPB/OLRIgN74qlQbV+FK1Q= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/prometheus v0.52.1 h1:BrQ29YG+mzdGh8DgHPirHbeMGNqtL+INe0rqg7ttBJ4= +github.com/prometheus/prometheus v0.52.1/go.mod h1:3z74cVsmVH0iXOR5QBjB7Pa6A0KJeEAK5A6UsmAFb1g= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.26 h1:F+GIVtGqCFxPxO46ujf8cEOP574MBoRm3gNbPXECbxs= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.26/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= +github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= +github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= +go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/collector/featuregate v1.5.0 h1:uK8qnYQKz1TMkK+FDTFsywg/EybW/gbnOUaPNUkRznM= +go.opentelemetry.io/collector/featuregate v1.5.0/go.mod h1:w7nUODKxEi3FLf1HslCiE6YWtMtOOrMnSwsDam8Mg9w= +go.opentelemetry.io/collector/pdata v1.5.0 h1:1fKTmUpr0xCOhP/B0VEvtz7bYPQ45luQ8XFyA07j8LE= +go.opentelemetry.io/collector/pdata v1.5.0/go.mod h1:TYj8aKRWZyT/KuKQXKyqSEvK/GV+slFaDMEI+Ke64Yw= +go.opentelemetry.io/collector/semconv v0.98.0 h1:zO4L4TmlxXoYu8UgPeYElGY19BW7wPjM+quL5CzoOoY= +go.opentelemetry.io/collector/semconv v0.98.0/go.mod h1:8ElcRZ8Cdw5JnvhTOQOdYizkJaQ10Z2fS+R6djOnj6A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= +go.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k= +go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0 h1:Mbi5PKN7u322woPa85d7ebZ+SOvEoPvoiBu+ryHWgfA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0/go.mod h1:e7ciERRhZaOZXVjx5MiL8TK5+Xv7G5Gv5PA2ZDEJdL8= +go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA= +go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= +go.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo= +go.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw= +go.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM= +go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= +go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= +go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= +golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= +golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.174.0 h1:zB1BWl7ocxfTea2aQ9mgdzXjnfPySllpPOskdnO+q34= +google.golang.org/api v0.174.0/go.mod h1:aC7tB6j0HR1Nl0ni5ghpx6iLasmAX78Zkh/wgxAAjLg= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be h1:Zz7rLWqp0ApfsR/l7+zSHhY3PMiH2xqgxlfYfAfNpoU= +google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be/go.mod h1:dvdCTIoAGbkWbcIKBniID56/7XHTt6WfxXNMxuziJ+w= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be h1:LG9vZxsWGOmUKieR8wPAUR3u3MpnYFQZROPIMaXh7/A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= +google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= +k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= +k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= +k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/csm-alerts/tools/tools.go b/csm-alerts/tools/tools.go new file mode 100644 index 000000000..9898c8df0 --- /dev/null +++ b/csm-alerts/tools/tools.go @@ -0,0 +1,10 @@ +//go:build tools +// +build tools + +//go:generate go build -o ../bin/promtool github.com/prometheus/prometheus/cmd/promtool + +package tools + +import ( + _ "github.com/prometheus/prometheus/cmd/promtool" +) \ No newline at end of file diff --git a/csm-alerts/tsconfig.json b/csm-alerts/tsconfig.json new file mode 100644 index 000000000..54a278c10 --- /dev/null +++ b/csm-alerts/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "@tsconfig/node20/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "esModuleInterop": true, + "resolveJsonModule": true + }, + "exclude": [ + "node_modules", + "tests", + "dist", + "**/*spec.ts", + "**/*mock.ts" + ] +} diff --git a/csm-alerts/yarn.lock b/csm-alerts/yarn.lock new file mode 100644 index 000000000..92595e99a --- /dev/null +++ b/csm-alerts/yarn.lock @@ -0,0 +1,5723 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + +"@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== + dependencies: + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + +"@babel/helpers@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== + dependencies: + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz" + integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/template@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/template@^7.3.3": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@danieldietrich/copy@^0.4.2": + version "0.4.2" + resolved "https://registry.npmjs.org/@danieldietrich/copy/-/copy-0.4.2.tgz" + integrity sha512-ZVNZIrgb2KeomfNahP77rL445ho6aQj0HHqU6hNlQ61o4rhvca+NS+ePj0d82zQDq2UPk1mjVZBTXgP+ErsDgw== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.0.0": + version "5.7.2" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@faker-js/faker@^8.3.1": + version "8.4.1" + resolved "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz" + integrity sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg== + +"@fortanetwork/forta-bot@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@fortanetwork/forta-bot/-/forta-bot-0.2.3.tgz" + integrity sha512-kGPAYZFyAFzB9IvZ+jn6OQ3+ASDeKWEyL1Ltzi8wNL57kfVF+C+WiKXhDk77BA1GwP8qyYBRztCxF73k8kA7vQ== + dependencies: + awilix "^9.0.0" + axios "^1.6.2" + base64-arraybuffer "^1.0.2" + ethers "^6.9.0" + flat-cache "^3.2.0" + jsonc "^2.0.0" + lodash "^4.17.21" + lru-cache "^10.2.0" + murmurhash3js "^3.0.1" + sha3 "^2.1.4" + +"@grpc/grpc-js@^1.10.2", "@grpc/grpc-js@^1.3.6": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.11.1.tgz#a92f33e98f1959feffcd1b25a33b113d2c977b70" + integrity sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw== + dependencies: + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" + +"@grpc/proto-loader@^0.6.4": + version "0.6.13" + resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz" + integrity sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g== + dependencies: + "@types/long" "^4.0.1" + lodash.camelcase "^4.3.0" + long "^4.0.0" + protobufjs "^6.11.3" + yargs "^16.2.0" + +"@grpc/proto-loader@^0.7.13": + version "0.7.13" + resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz" + integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== + +"@mapbox/node-pre-gyp@^1.0.5": + version "1.0.11" + resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@opentelemetry/api@^1.4.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" + integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== + +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@tsconfig/node20@^20.1.4": + version "20.1.4" + resolved "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz" + integrity sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg== + +"@typechain/ethers-v5@^11.1.2": + version "11.1.2" + resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-11.1.2.tgz" + integrity sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.6" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@^4.17.33": + version "4.19.5" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" + integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^4.17.21": + version "4.17.21" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.5.11": + version "29.5.12" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/lodash@^4.14.202": + version "4.17.7" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612" + integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== + +"@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/mkdirp@^0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz" + integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@>=13.7.0": + version "22.5.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.1.tgz#de01dce265f6b99ed32b295962045d10b5b99560" + integrity sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw== + dependencies: + undici-types "~6.19.2" + +"@types/node@18.15.13": + version "18.15.13" + resolved "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== + +"@types/node@^20.14.2": + version "20.16.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.2.tgz#9e388f503a5af306e8c63319334887390966a11e" + integrity sha512-91s/n4qUPV/wg8eE9KHYW1kouTfDk2FPGjXbBMfRWP/2vg1rCXNQL1OCabwGs0XSdukuK+MwCDXE30QpSeMUhQ== + dependencies: + undici-types "~6.19.2" + +"@types/nodemon@^1.19.0": + version "1.19.6" + resolved "https://registry.npmjs.org/@types/nodemon/-/nodemon-1.19.6.tgz" + integrity sha512-vjKuaQOLUA5EY2zkUmWG1ipXbKt9Wd+H/0SiIuHVeH4cHtt6509iRUGH9ZR0iqgUrtj3BrP9KqoTuV3ZCbQcYA== + dependencies: + "@types/node" "*" + +"@types/prettier@^2.1.1": + version "2.7.3" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/qs@*": + version "6.9.15" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz" + integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/resolve@^0.0.8": + version "0.0.8" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + +"@types/semver@^7.3.12", "@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.7" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + +"@types/ws@^8.5.10": + version "8.5.12" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^6.12.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.12.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== + dependencies: + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + +"@typescript-eslint/utils@^5.10.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.3.3" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1, acorn@^8.9.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asn1.js@^4.10.1: + version "4.10.1" + resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +async-mutex@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz" + integrity sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA== + dependencies: + tslib "^2.4.0" + +async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + +async@^3.2.3: + version "3.2.5" + resolved "https://registry.npmjs.org/async/-/async-3.2.5.tgz" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +awilix@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/awilix/-/awilix-4.3.4.tgz" + integrity sha512-NgRwUPxUnoK+OTRa2fXcRQVFPOPQXlwCN1FJPkhO3IHKQJHokhdVpDfgz9L3VZTcA1iSaOFE3N/Q/5P7lIDqig== + dependencies: + camel-case "^4.1.2" + glob "^7.1.6" + +awilix@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/awilix/-/awilix-9.0.0.tgz" + integrity sha512-DVhdT1sbCCjGBvJbNKJaPSh+JVvgzUV0Rbdq3r3/MqxDgm7e/zs8aAhWI8O8nFNFvUYFtJPqWsFldyzC2rpMnA== + dependencies: + camel-case "^4.1.2" + fast-glob "^3.3.1" + +axios@^1.6.2: + version "1.7.2" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz" + integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-arraybuffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz" + integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +bignumber.js@^9.1.2: + version "9.1.2" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bintrees@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz" + integrity sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +body-parser@1.20.2: + version "1.20.2" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browserify-aes@^1.0.4, browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.3" + resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz" + integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== + dependencies: + bn.js "^5.2.1" + browserify-rsa "^4.1.0" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.5" + hash-base "~3.0" + inherits "^2.0.4" + parse-asn1 "^5.1.7" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + +browserslist@^4.23.1: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + dependencies: + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + +bs-logger@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001646: + version "1.0.30001655" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz#0ce881f5a19a2dcfda2ecd927df4d5c1684b982f" + integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg== + +chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chokidar@^3.5.2: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^1.0.0: + version "1.3.1" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz" + integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorette@2.0.19: + version "2.0.19" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@3.12.0: + version "3.12.0" + resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.5" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + +debug@4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +dedent@^1.0.0: + version "1.5.3" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.5.4: + version "1.5.13" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" + integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== + +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +elliptic@^6.5.5: + version "6.5.5" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +escalade@^3.1.1, escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== + +eslint-plugin-jest@^27.6.0: + version "27.9.0" + resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz" + integrity sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug== + dependencies: + "@typescript-eslint/utils" "^5.10.0" + +eslint-plugin-prettier@^5.0.1: + version "5.1.3" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz" + integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.8.6" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.54.0: + version "8.57.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +ethers@^5.5.1, ethers@^5.7.2: + version "5.7.2" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethers@^6.9.0: + version "6.13.1" + resolved "https://registry.npmjs.org/ethers/-/ethers-6.13.1.tgz" + integrity sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.17.1" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +express@^4.19.2: + version "4.19.2" + resolved "https://registry.npmjs.org/express/-/express-4.19.2.tgz" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.2" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.6.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.9, fast-glob@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-safe-stringify@^2.0.6: + version "2.1.1" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4, flat-cache@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forta-agent@^0.1.48: + version "0.1.48" + resolved "https://registry.npmjs.org/forta-agent/-/forta-agent-0.1.48.tgz" + integrity sha512-fk3mar7/Avqg/4OHFmgv01ww/azr1XM+g5KcSnwvNxZy3KDMi7aFp1jAjPCsBjs8ZyVcR03ITUlbtFpRVgZB4Q== + dependencies: + "@grpc/grpc-js" "^1.3.6" + "@grpc/proto-loader" "^0.6.4" + "@types/uuid" "^8.3.4" + async-retry "^1.3.3" + awilix "^4.3.4" + axios "^1.6.2" + base64-arraybuffer "^1.0.2" + ethers "^5.5.1" + flat-cache "^3.0.4" + form-data "^4.0.0" + jsonc "^2.0.0" + keythereum "^1.2.0" + lodash "^4.17.21" + murmurhash3js "^3.0.1" + n-readlines "^1.0.1" + prompts "^2.4.1" + python-shell "^3.0.0" + sha3 "^2.1.4" + shelljs "^0.8.4" + uuid "^8.3.2" + yargs "^17.0.1" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fp-ts@^2.16.1: + version "2.16.9" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.16.9.tgz#99628fc5e0bb3b432c4a16d8f4455247380bae8a" + integrity sha512-+I2+FnVB+tVaxcYyQkHUq7ZdKScaBlX53A41mxQtpIccsfyv8PzdzP7fzp2AY832T4aoK6UZ5WRX/ebGd8uZuQ== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +getopts@2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz" + integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +google-protobuf@3.15.8: + version "3.15.8" + resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.15.8.tgz" + integrity sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +grpc-tools@^1.12.4: + version "1.12.4" + resolved "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz" + integrity sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.5" + +grpc_tools_node_protoc_ts@^5.3.3: + version "5.3.3" + resolved "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz" + integrity sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww== + dependencies: + google-protobuf "3.15.8" + handlebars "4.7.7" + +handlebars@4.7.7: + version "4.7.7" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +hash-base@^3.0.0, hash-base@~3.0: + version "3.0.4" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz" + integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.0, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.13.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz" + integrity sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw== + dependencies: + fast-safe-stringify "^2.0.6" + graceful-fs "^4.1.15" + mkdirp "^0.5.1" + parse-json "^4.0.0" + strip-bom "^4.0.0" + strip-json-comments "^3.0.1" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +keccak@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz" + integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +keythereum@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/keythereum/-/keythereum-1.2.0.tgz" + integrity sha512-u3XnjIruOmjIvJ4tH1Wdr2y0X8+z8BZTQ+dqJuDMyLvNWw6VnH9XKtt0yauSE+96Bq97h6CPm4w5LbW3i28x0g== + dependencies: + crypto-browserify "3.12.0" + keccak "3.0.1" + scrypt-js "3.0.1" + secp256k1 "4.0.2" + sjcl "1.0.6" + uuid "3.0.0" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +knex@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz" + integrity sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw== + dependencies: + colorette "2.0.19" + commander "^10.0.0" + debug "4.3.4" + escalade "^3.1.1" + esm "^3.2.25" + get-package-type "^0.1.0" + getopts "2.3.0" + interpret "^2.2.0" + lodash "^4.17.21" + pg-connection-string "2.6.2" + rechoir "^0.8.0" + resolve-from "^5.0.0" + tarn "^3.0.2" + tildify "2.0.0" + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +logform@^2.6.0, logform@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" + integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +long@^5.0.0: + version "5.2.3" + resolved "https://registry.npmjs.org/long/-/long-5.2.3.tgz" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@^1.1.1, make-error@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.4: + version "4.0.7" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +murmurhash3js@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/murmurhash3js/-/murmurhash3js-3.0.1.tgz" + integrity sha512-KL8QYUaxq7kUbcl0Yto51rMcYt7E/4N4BG3/c96Iqw1PQrTRspu8Cpx4TZ4Nunib1d4bEkIH3gjCYlP2RLBdow== + +n-readlines@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/n-readlines/-/n-readlines-1.0.1.tgz" + integrity sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0: + version "4.8.1" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz" + integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + +nodemon@^3.0.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.4.tgz#c34dcd8eb46a05723ccde60cbdd25addcc8725e4" + integrity sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ== + dependencies: + chokidar "^3.5.2" + debug "^4" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^7.5.3" + simple-update-notifier "^2.0.0" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.7: + version "5.1.7" + resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz" + integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== + dependencies: + asn1.js "^4.10.1" + browserify-aes "^1.2.0" + evp_bytestokey "^1.0.3" + hash-base "~3.0" + pbkdf2 "^3.1.2" + safe-buffer "^5.2.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3, pbkdf2@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pg-connection-string@2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz" + integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== + +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +postinstall@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/postinstall/-/postinstall-0.8.0.tgz" + integrity sha512-onh5cnUw4ue+iBzwoyHZNfih1iopqm5abfc/0vK/A9QyYVPxCbLW0DxwrRpHFZ2/Fs5Uo7j4TiaVDNWriq0HIg== + dependencies: + "@danieldietrich/copy" "^0.4.2" + glob "^8.0.3" + minimist "^1.2.6" + resolve-from "^5.0.0" + resolve-pkg "^2.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.1.2, prettier@^2.3.1: + version "2.8.8" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +prettier@^3.1.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prom-client@^15.1.2: + version "15.1.3" + resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-15.1.3.tgz#69fa8de93a88bc9783173db5f758dc1c69fa8fc2" + integrity sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g== + dependencies: + "@opentelemetry/api" "^1.4.0" + tdigest "^0.1.1" + +prompts@^2.0.1, prompts@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +protobufjs@^6.11.3: + version "6.11.4" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz" + integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + +protobufjs@^7.2.5: + version "7.4.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + +python-shell@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/python-shell/-/python-shell-3.0.1.tgz" + integrity sha512-TWeotuxe1auhXa5bGRScxnc2J+0r41NBntSa6RYZtMBLtAEsvCboKrEbW6DvASosWQepVkhZZlT3B5Ei766G+Q== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-is@^18.0.0: + version "18.3.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +readable-stream@^2.3.8: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz" + integrity sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ== + dependencies: + resolve-from "^5.0.0" + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.1.6, resolve@^1.20.0, resolve@^1.8.1: + version "1.22.8" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz" + integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== + dependencies: + elliptic "^6.5.2" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: + version "7.6.2" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + +semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +sha3@^2.1.4: + version "2.1.4" + resolved "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz" + integrity sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg== + dependencies: + buffer "6.0.3" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shelljs@^0.8.4: + version "0.8.5" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.0, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sjcl@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/sjcl/-/sjcl-1.0.6.tgz" + integrity sha512-oUVs+hzMSWEZ3rdeDL461QilvvEU2OL9q6T42lpVi2C5Proej9obVZ1nQeY9T96NxoMy/dqw82m33MfNNEmYJg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.0.1, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +synckit@^0.8.6: + version "0.8.8" + resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz" + integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== + dependencies: + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" + +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + +tar@^6.1.11: + version "6.2.1" + resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +tarn@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz" + integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== + +tdigest@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz" + integrity sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA== + dependencies: + bintrees "1.0.2" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +tildify@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz" + integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +touch@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz" + integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-command-line-args@^2.2.0: + version "2.5.1" + resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + +ts-essentials@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz" + integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + +ts-generator@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz" + integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== + dependencies: + "@types/mkdirp" "^0.5.2" + "@types/prettier" "^2.1.1" + "@types/resolve" "^0.0.8" + chalk "^2.4.1" + glob "^7.1.2" + mkdirp "^0.5.1" + prettier "^2.1.2" + resolve "^1.8.1" + ts-essentials "^1.0.0" + +ts-jest@^29.1.2: + version "29.2.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== + dependencies: + bs-logger "^0.2.6" + ejs "^3.1.10" + fast-json-stable-stringify "^2.1.0" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.6.3" + yargs-parser "^21.1.1" + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +ts-retry@^4.2.4: + version "4.2.5" + resolved "https://registry.npmjs.org/ts-retry/-/ts-retry-4.2.5.tgz" + integrity sha512-dFBa4pxMBkt/bjzdBio8EwYfbAdycEAwe0KZgzlUKKwU9Wr1WErK7Hg9QLqJuDDYJXTW4KYZyXAyqYKOdO/ehA== + +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.2: + version "2.6.3" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typechain@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz" + integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== + dependencies: + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" + +typescript@^5.3.2: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + +uglify-js@^3.1.4: + version "3.18.0" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz" + integrity sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A== + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz" + integrity sha512-rqE1LoOVLv3QrZMjb4NkF5UWlkurCfPyItVnFPNKDDGkHw4dQUdE4zMcLqx28+0Kcf3+bnUk4PisaiRJT4aiaQ== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-to-istanbul@^9.0.1: + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +winston-transport@^4.7.0: + version "4.7.1" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.1.tgz#52ff1bcfe452ad89991a0aaff9c3b18e7f392569" + integrity sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA== + dependencies: + logform "^2.6.1" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + +winston@^3.11.0: + version "3.14.2" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.14.2.tgz#94ce5fd26d374f563c969d12f0cd9c641065adab" + integrity sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.6.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.7.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@8.17.1: + version "8.17.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.0.1, yargs@^17.3.1, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From bcdf918ad6bcda8202949b7e46757b2e121e15e0 Mon Sep 17 00:00:00 2001 From: Ivan Gusakov <74269317+larmork@users.noreply.github.com> Date: Thu, 26 Sep 2024 11:48:40 +0300 Subject: [PATCH 02/45] feat: Add `CSModule.srv` alerts (#614) --- csm-alerts/README.md | 84 +- csm-alerts/src/brief/abi/StakingRouter.json | 2307 +++++++++++++++++ csm-alerts/src/entity/events.ts | 2 + csm-alerts/src/handlers/tx.handler.ts | 4 +- csm-alerts/src/main.ts | 26 +- .../CSAccounting/CSAccounting.srv.spec.ts | 13 +- .../services/CSAccounting/CSAccounting.srv.ts | 148 +- .../CSFeeDistributor.srv.spec.ts | 1 + .../CSFeeDistributor/CSFeeDistributor.srv.ts | 104 +- .../CSFeeOracle/CSFeeOracle.srv.spec.ts | 6 + .../services/CSModule/CSModule.srv.spec.ts | 138 + .../src/services/CSModule/CSModule.srv.ts | 412 ++- .../__snapshots__/CSModule.srv.spec.ts.snap | 108 + .../ProxyWatcher/ProxyWatcher.srv.spec.ts | 7 + .../services/ProxyWatcher/ProxyWatcher.srv.ts | 6 +- csm-alerts/src/utils/constants.holesky.ts | 66 + csm-alerts/src/utils/constants.mainnet.ts | 64 + csm-alerts/src/utils/constants.ts | 13 + csm-alerts/src/utils/env/env.ts | 2 + .../src/utils/events/cs_module_events.ts | 76 + .../utils/events/roles_monitoring_events.ts | 36 + csm-alerts/src/utils/utils.ts | 15 + 22 files changed, 3555 insertions(+), 83 deletions(-) create mode 100644 csm-alerts/src/brief/abi/StakingRouter.json create mode 100644 csm-alerts/src/services/CSModule/CSModule.srv.spec.ts create mode 100644 csm-alerts/src/services/CSModule/__snapshots__/CSModule.srv.spec.ts.snap create mode 100644 csm-alerts/src/utils/events/cs_module_events.ts create mode 100644 csm-alerts/src/utils/events/roles_monitoring_events.ts diff --git a/csm-alerts/README.md b/csm-alerts/README.md index 49b26fae6..ee0d36309 100644 --- a/csm-alerts/README.md +++ b/csm-alerts/README.md @@ -8,12 +8,31 @@ 1. **CSModule** 1. General - - _To be added_ + 1. πŸ”΄ HIGH: EL rewards stealing penalty reported/settled/cancelled for an operator. + 2. 🟠 MEDIUM: targetLimitMode was set for an operator. + 3. 🟒 LOW: More than 3 operators have the same manager or reward address. + 4. 🟒 LOW: Module's share is close to the targetShare. + 5. 🟒 LOW: More than N "empty" batches in the queue. (N = 30) + 6. 🟒 LOW: More than N validators in the queue. (N = 200) + 7. πŸ”΅ INFO: Operator X was unvetted. + 8. πŸ”΅ INFO: Public release is activated. + 9. πŸ”΅ INFO: Every 100 new operators created (69th as well). 2. Roles monitoring - - _To be added_ + 1. 🚨 CRITICAL: role change: DEFAULT_ADMIN_ROLE + 2. 🚨 CRITICAL: role change: PAUSE_ROLE + 3. 🚨 CRITICAL: role change: RESUME_ROLE + 4. 🚨 CRITICAL: role change: MODULE_MANAGER_ROLE + 5. 🚨 CRITICAL: role change: STAKING_ROUTER_ROLE + 6. 🚨 CRITICAL: role change: REPORT_EL_REWARDS_STEALING_PENALTY_ROLE + 7. 🚨 CRITICAL: role change: SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE + 8. 🚨 CRITICAL: role change: VERIFIER_ROLE + 9. 🚨 CRITICAL: role change: RECOVERER_ROLE 2. **CSAccounting** 1. General - - _To be added_ + 1. 🟒 LOW: Average bond value for a validator is below some threshold. + 2. 🟒 LOW: Node operator has X unbonded validators since last block. + 3. 🟒 LOW: Total bond lock more than some value. + 4. 🟒 LOW: sharesOf(CSAccounting.address) - CSBondCoreStorage.totalBondShares > 100 wei 2. Events monitoring 1. 🚨 CRITICAL: ChargePenaltyRecipientSet(address chargeRecipient) 2. 🚨 CRITICAL: BondCurveUpdated(uint256 indexed curveId, uint256[] bondCurve) @@ -21,7 +40,14 @@ 4. πŸ”΄ HIGH: BondCurveSet(uint256 indexed nodeOperatorId, uint256 curveId) 5. πŸ”΅ INFO: Approval(address owner, address spender, uint256 value) (stETH contract) 3. Roles monitoring - - _To be added_ + 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE + 2. 🚨 CRITICAL: PAUSE_ROLE + 3. 🚨 CRITICAL: RESUME_ROLE + 4. 🚨 CRITICAL: ACCOUNTING_MANAGER_ROLE + 5. 🚨 CRITICAL: MANAGE_BOND_CURVES_ROLE + 6. 🚨 CRITICAL: SET_BOND_CURVE_ROLE + 7. 🚨 CRITICAL: RESET_BOND_CURVE_ROLE + 8. 🚨 CRITICAL: RECOVERER_ROLE 3. **CSFeeOracle** 1. General 1. 🚨 CRITICAL: ConsensusHashContractSet(address indexed addr, address indexed prevAddr) @@ -34,7 +60,12 @@ 8. πŸ”΅ INFO: ProcessingStarted(uint256 indexed refSlot, bytes32 hash) 9. πŸ”΅ INFO: ReportSettled(uint256 indexed refSlot, uint256 distributed, bytes32 treeRoot, string treeCid) 2. Roles monitoring - - _To be added_ + 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE + 2. 🚨 CRITICAL: CONTRACT_MANAGER_ROLE + 3. 🚨 CRITICAL: SUBMIT_DATA_ROLE + 4. 🚨 CRITICAL: PAUSE_ROLE + 5. 🚨 CRITICAL: RESUME_ROLE + 6. 🚨 CRITICAL: RECOVERER_ROLE 3. HashConsensus (for CSFeeOracle) 1. Events monitoring 1. πŸ”΄ HIGH: MemberAdded(address indexed addr, uint256 newTotalMembers, uint256 newQuorum) @@ -47,16 +78,24 @@ 8. πŸ”΄ HIGH: ConsensusLost(uint256 indexed refSlot) 9. πŸ”΅ INFO: ConsensusReached(uint256 indexed refSlot, bytes32 report, uint256 support) 2. Roles monitoring - - _To be added_ + 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE + 2. 🚨 CRITICAL: DISABLE_CONSENSUS_ROLE + 3. 🚨 CRITICAL: MANAGE_MEMBERS_AND_QUORUM_ROLE + 4. 🚨 CRITICAL: MANAGE_FRAME_CONFIG_ROLE + 5. 🚨 CRITICAL: MANAGE_FAST_LANE_CONFIG_ROLE + 6. 🚨 CRITICAL: MANAGE_REPORT_PROCESSOR_ROLE 4. **CSFeeDistributor** 1. Alerting for failed transactions - - _To be added_ + 1. 🚨 CRITICAL: transaction reverted with InvalidShares -> CSFeeOracle reports incorrect amount of shares to distribute. + 2. 🚨 CRITICAL: transaction reverted with NotEnoughShares -> CSFeeDistributor internal accounting error. + 3. 🚨 CRITICAL: transaction reverted with InvalidTreeRoot or InvalidTreeCID -> CSFeeOracle built incorrect report. 2. Events monitoring 1. 🚨 CRITICAL: Receiver of TransferShares is NOT CSAccounting, if from is CSFeeDistributor 2. πŸ”΄ HIGH: No fees distributed for X days (repeat every 1 day). 3. πŸ”΅ INFO: DistributionDataUpdated -> Oracle settled a new report. 3. Roles monitoring - - _To be added_ + 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE + 2. 🚨 CRITICAL: RECOVERER_ROLE 5. **CSEarlyAdoption** - _To be added_ @@ -69,22 +108,22 @@ - CSFeeOracle - CSFeeDistributor -1. 🚨 CRITICAL: event ProxyOssified() -2. 🚨 CRITICAL: event Upgraded(address indexed implementation) -3. 🚨 CRITICAL: event AdminChanged(address previousAdmin, address newAdmin) -4. 🚨 CRITICAL: event BeaconUpgraded(address indexed beacon) + 1. 🚨 CRITICAL: event ProxyOssified() + 2. 🚨 CRITICAL: event Upgraded(address indexed implementation) + 3. 🚨 CRITICAL: event AdminChanged(address previousAdmin, address newAdmin) + 4. 🚨 CRITICAL: event BeaconUpgraded(address indexed beacon) -7. **PausableUntil** +7. **PausableUntil** For the following contracts: - CSModule - CSAccounting - CSFeeOracle - 1. 🚨 CRITICAL: Paused(uint256 duration); - 2. 🚨 CRITICAL: Resumed(); + 1. 🚨 CRITICAL: Paused(uint256 duration); + 2. 🚨 CRITICAL: Resumed(); -8. **AssetRecoverer** +8. **AssetRecoverer** For the following contracts: - CSModule @@ -92,11 +131,11 @@ - CSFeeOracle - CSFeeDistributor - 1. πŸ”΄ HIGH: EtherRecovered() - 2. πŸ”΄ HIGH: ERC20Recovered() - 3. πŸ”΄ HIGH: StETHSharesRecovered() - 4. πŸ”΄ HIGH: ERC721Recovered() - 5. πŸ”΄ HIGH: ERC1155Recovered() + 1. πŸ”΄ HIGH: EtherRecovered() + 2. πŸ”΄ HIGH: ERC20Recovered() + 3. πŸ”΄ HIGH: StETHSharesRecovered() + 4. πŸ”΄ HIGH: ERC721Recovered() + 5. πŸ”΄ HIGH: ERC1155Recovered() ## Development (Forta specific) @@ -117,10 +156,13 @@ docker-compose up -d ## Testing alerts 1. For testing alerts you have to install promtool on your machine. + ``` make tools ``` + 2. Check alerts + ``` make test_alerts ``` diff --git a/csm-alerts/src/brief/abi/StakingRouter.json b/csm-alerts/src/brief/abi/StakingRouter.json new file mode 100644 index 000000000..9e6f892fb --- /dev/null +++ b/csm-alerts/src/brief/abi/StakingRouter.json @@ -0,0 +1,2307 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_depositContract", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AppAuthLidoFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "firstArrayLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "secondArrayLength", + "type": "uint256" + } + ], + "name": "ArraysLengthMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "DepositContractZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "DirectETHTransfer", + "type": "error" + }, + { + "inputs": [], + "name": "EmptyWithdrawalsCredentials", + "type": "error" + }, + { + "inputs": [], + "name": "ExitedValidatorsCountCannotDecrease", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidContractVersionIncrement", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "etherValue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositsCount", + "type": "uint256" + } + ], + "name": "InvalidDepositsValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidPublicKeysBatchLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256" + } + ], + "name": "InvalidReportData", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidSignaturesBatchLength", + "type": "error" + }, + { + "inputs": [], + "name": "NonZeroContractVersionOnInit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "reportedExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositedValidatorsCount", + "type": "uint256" + } + ], + "name": "ReportedExitedValidatorsExceedDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModuleAddressExists", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModuleNotActive", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModuleNotPaused", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModuleStatusTheSame", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModuleUnregistered", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModuleWrongName", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModulesLimitExceeded", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "received", + "type": "uint256" + } + ], + "name": "UnexpectedContractVersion", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentModuleExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "currentNodeOpExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "currentNodeOpStuckValidatorsCount", + "type": "uint256" + } + ], + "name": "UnexpectedCurrentValidatorsCount", + "type": "error" + }, + { + "inputs": [], + "name": "UnrecoverableModuleError", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "field", + "type": "string" + } + ], + "name": "ValueOver100Percent", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "field", + "type": "string" + } + ], + "name": "ZeroAddress", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "ContractVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "lowLevelRevertData", + "type": "bytes" + } + ], + "name": "ExitedAndStuckValidatorsCountsUpdateFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "lowLevelRevertData", + "type": "bytes" + } + ], + "name": "RewardsMintedReportFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "stakingModule", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "address", + "name": "createdBy", + "type": "address" + } + ], + "name": "StakingModuleAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unreportedExitedValidatorsCount", + "type": "uint256" + } + ], + "name": "StakingModuleExitedValidatorsIncompleteReporting", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakingModuleFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "treasuryFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "setBy", + "type": "address" + } + ], + "name": "StakingModuleFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum StakingRouter.StakingModuleStatus", + "name": "status", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "address", + "name": "setBy", + "type": "address" + } + ], + "name": "StakingModuleStatusSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "targetShare", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "setBy", + "type": "address" + } + ], + "name": "StakingModuleTargetShareSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "StakingRouterETHDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "withdrawalCredentials", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "setBy", + "type": "address" + } + ], + "name": "WithdrawalCredentialsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "lowLevelRevertData", + "type": "bytes" + } + ], + "name": "WithdrawalsCredentialsChangeFailed", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEPOSIT_CONTRACT", + "outputs": [ + { + "internalType": "contract IDepositContract", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "FEE_PRECISION_POINTS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_WITHDRAWAL_CREDENTIALS_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_STAKING_MODULES_COUNT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_STAKING_MODULE_NAME_LENGTH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_EXITED_VALIDATORS_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_REWARDS_MINTED_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_MODULE_MANAGE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_MODULE_PAUSE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_MODULE_RESUME_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TOTAL_BASIS_POINTS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNSAFE_SET_EXITED_VALIDATORS_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "address", + "name": "_stakingModuleAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_targetShare", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_stakingModuleFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_treasuryFee", + "type": "uint256" + } + ], + "name": "addStakingModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_depositCalldata", + "type": "bytes" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getAllNodeOperatorDigests", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "components": [ + { + "internalType": "bool", + "name": "isTargetLimitActive", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "targetValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refundedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckPenaltyEndTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.NodeOperatorSummary", + "name": "summary", + "type": "tuple" + } + ], + "internalType": "struct StakingRouter.NodeOperatorDigest[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAllStakingModuleDigests", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "nodeOperatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "activeNodeOperatorsCount", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint24", + "name": "id", + "type": "uint24" + }, + { + "internalType": "address", + "name": "stakingModuleAddress", + "type": "address" + }, + { + "internalType": "uint16", + "name": "stakingModuleFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "treasuryFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "targetShare", + "type": "uint16" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint64", + "name": "lastDepositAt", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastDepositBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitedValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.StakingModule", + "name": "state", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.StakingModuleSummary", + "name": "summary", + "type": "tuple" + } + ], + "internalType": "struct StakingRouter.StakingModuleDigest[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getContractVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositsCount", + "type": "uint256" + } + ], + "name": "getDepositsAllocation", + "outputs": [ + { + "internalType": "uint256", + "name": "allocated", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "allocations", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLido", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "_nodeOperatorIds", + "type": "uint256[]" + } + ], + "name": "getNodeOperatorDigests", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "components": [ + { + "internalType": "bool", + "name": "isTargetLimitActive", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "targetValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refundedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckPenaltyEndTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.NodeOperatorSummary", + "name": "summary", + "type": "tuple" + } + ], + "internalType": "struct StakingRouter.NodeOperatorDigest[]", + "name": "digests", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_offset", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_limit", + "type": "uint256" + } + ], + "name": "getNodeOperatorDigests", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "components": [ + { + "internalType": "bool", + "name": "isTargetLimitActive", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "targetValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refundedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckPenaltyEndTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.NodeOperatorSummary", + "name": "summary", + "type": "tuple" + } + ], + "internalType": "struct StakingRouter.NodeOperatorDigest[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_nodeOperatorId", + "type": "uint256" + } + ], + "name": "getNodeOperatorSummary", + "outputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "isTargetLimitActive", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "targetValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refundedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckPenaltyEndTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.NodeOperatorSummary", + "name": "summary", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingFeeAggregateDistribution", + "outputs": [ + { + "internalType": "uint96", + "name": "modulesFee", + "type": "uint96" + }, + { + "internalType": "uint96", + "name": "treasuryFee", + "type": "uint96" + }, + { + "internalType": "uint256", + "name": "basePrecision", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingFeeAggregateDistributionE4Precision", + "outputs": [ + { + "internalType": "uint16", + "name": "modulesFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "treasuryFee", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModule", + "outputs": [ + { + "components": [ + { + "internalType": "uint24", + "name": "id", + "type": "uint24" + }, + { + "internalType": "address", + "name": "stakingModuleAddress", + "type": "address" + }, + { + "internalType": "uint16", + "name": "stakingModuleFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "treasuryFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "targetShare", + "type": "uint16" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint64", + "name": "lastDepositAt", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastDepositBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitedValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.StakingModule", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleActiveValidatorsCount", + "outputs": [ + { + "internalType": "uint256", + "name": "activeValidatorsCount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_stakingModuleIds", + "type": "uint256[]" + } + ], + "name": "getStakingModuleDigests", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "nodeOperatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "activeNodeOperatorsCount", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint24", + "name": "id", + "type": "uint24" + }, + { + "internalType": "address", + "name": "stakingModuleAddress", + "type": "address" + }, + { + "internalType": "uint16", + "name": "stakingModuleFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "treasuryFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "targetShare", + "type": "uint16" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint64", + "name": "lastDepositAt", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastDepositBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitedValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.StakingModule", + "name": "state", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.StakingModuleSummary", + "name": "summary", + "type": "tuple" + } + ], + "internalType": "struct StakingRouter.StakingModuleDigest[]", + "name": "digests", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingModuleIds", + "outputs": [ + { + "internalType": "uint256[]", + "name": "stakingModuleIds", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleIsActive", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleIsDepositsPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleIsStopped", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleLastDepositBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxDepositsValue", + "type": "uint256" + } + ], + "name": "getStakingModuleMaxDepositsCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleStatus", + "outputs": [ + { + "internalType": "enum StakingRouter.StakingModuleStatus", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleSummary", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.StakingModuleSummary", + "name": "summary", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingModules", + "outputs": [ + { + "components": [ + { + "internalType": "uint24", + "name": "id", + "type": "uint24" + }, + { + "internalType": "address", + "name": "stakingModuleAddress", + "type": "address" + }, + { + "internalType": "uint16", + "name": "stakingModuleFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "treasuryFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "targetShare", + "type": "uint16" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint64", + "name": "lastDepositAt", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastDepositBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitedValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.StakingModule[]", + "name": "res", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingModulesCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingRewardsDistribution", + "outputs": [ + { + "internalType": "address[]", + "name": "recipients", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "stakingModuleIds", + "type": "uint256[]" + }, + { + "internalType": "uint96[]", + "name": "stakingModuleFees", + "type": "uint96[]" + }, + { + "internalType": "uint96", + "name": "totalFee", + "type": "uint96" + }, + { + "internalType": "uint256", + "name": "precisionPoints", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalFeeE4Precision", + "outputs": [ + { + "internalType": "uint16", + "name": "totalFee", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWithdrawalCredentials", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "hasStakingModule", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "address", + "name": "_lido", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_withdrawalCredentials", + "type": "bytes32" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "onValidatorsCountsByNodeOperatorReportingFinished", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "pauseStakingModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_stakingModuleIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_totalShares", + "type": "uint256[]" + } + ], + "name": "reportRewardsMinted", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_nodeOperatorIds", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_exitedValidatorsCounts", + "type": "bytes" + } + ], + "name": "reportStakingModuleExitedValidatorsCountByNodeOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_nodeOperatorIds", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_stuckValidatorsCounts", + "type": "bytes" + } + ], + "name": "reportStakingModuleStuckValidatorsCountByNodeOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "resumeStakingModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "enum StakingRouter.StakingModuleStatus", + "name": "_status", + "type": "uint8" + } + ], + "name": "setStakingModuleStatus", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_withdrawalCredentials", + "type": "bytes32" + } + ], + "name": "setWithdrawalCredentials", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_triggerUpdateFinish", + "type": "bool" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "currentModuleExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "currentNodeOperatorExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "currentNodeOperatorStuckValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newModuleExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newNodeOperatorExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newNodeOperatorStuckValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.ValidatorsCountsCorrection", + "name": "_correction", + "type": "tuple" + } + ], + "name": "unsafeSetExitedValidatorsCount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_stakingModuleIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_exitedValidatorsCounts", + "type": "uint256[]" + } + ], + "name": "updateExitedValidatorsCountByStakingModule", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_refundedValidatorsCount", + "type": "uint256" + } + ], + "name": "updateRefundedValidatorsCount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_targetShare", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_stakingModuleFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_treasuryFee", + "type": "uint256" + } + ], + "name": "updateStakingModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_isTargetLimitActive", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "_targetLimit", + "type": "uint256" + } + ], + "name": "updateTargetValidatorsLimits", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] \ No newline at end of file diff --git a/csm-alerts/src/entity/events.ts b/csm-alerts/src/entity/events.ts index 3a074646b..76b120f67 100644 --- a/csm-alerts/src/entity/events.ts +++ b/csm-alerts/src/entity/events.ts @@ -30,6 +30,7 @@ export type TransactionDto = { timestamp: number number: number } + hash: string } export function newTransactionDto(request: agent_pb.EvaluateTxRequest): TransactionDto { @@ -60,6 +61,7 @@ export function newTransactionDto(request: agent_pb.EvaluateTxRequest): Transact number: new BigNumber(block.getBlocknumber(), 10).toNumber(), timestamp: new BigNumber(block.getBlocktimestamp(), 10).toNumber(), }, + hash: transaction.getHash(), } } diff --git a/csm-alerts/src/handlers/tx.handler.ts b/csm-alerts/src/handlers/tx.handler.ts index 3806682df..bc8ae1625 100644 --- a/csm-alerts/src/handlers/tx.handler.ts +++ b/csm-alerts/src/handlers/tx.handler.ts @@ -56,9 +56,9 @@ export class TxHandler { const proxyWatcherFindings = this.proxyWatcherSrv.handleTransaction(txEvent) findings.push( - ...csModuleFindings, + ...(await csModuleFindings), ...csFeeDistributorFindings, - ...csAccountingFindings, + ...(await csAccountingFindings), ...csFeeOracleFindings, ...proxyWatcherFindings, ) diff --git a/csm-alerts/src/main.ts b/csm-alerts/src/main.ts index 8326c1533..3d3bb21a5 100644 --- a/csm-alerts/src/main.ts +++ b/csm-alerts/src/main.ts @@ -21,10 +21,12 @@ import { ethers } from 'ethers' import { ETHProvider } from './clients/eth_provider' import { getCSFeeDistributorEvents } from './utils/events/cs_fee_distributor_events' import { getCSFeeOracleEvents, getHashConsensusEvents } from './utils/events/cs_fee_oracle_events' +import { getCSModuleEvents } from './utils/events/cs_module_events' import { getOssifiedProxyEvents } from './utils/events/ossified_proxy_events' import { getPausableEvents } from './utils/events/pausable_events' import { getCSAccountingEvents } from './utils/events/cs_accounting_events' import { getAssetRecovererEvents } from './utils/events/asset_recoverer_events' +import { getRolesMonitoringEvents } from './utils/events/roles_monitoring_events' import * as promClient from 'prom-client' import { Metrics } from './utils/metrics/metrics' import { CSModuleSrv } from './services/CSModule/CSModule.srv' @@ -40,12 +42,14 @@ import { CSM_PROXY_CONTRACTS, PAUSABLE_CONTRACTS, DeploymentAddresses, + ROLES_MONITORING_CONTRACTS, } from './utils/constants.mainnet' import { CONTRACTS_WITH_ASSET_RECOVERER as HOLESKY_CONTRACTS_WITH_ASSET_RECOVERER, CSM_PROXY_CONTRACTS as HOLESKY_CSM_PROXY_CONTRACTS, PAUSABLE_CONTRACTS as HOLESKY_PAUSABLE_CONTRACTS, DeploymentAddresses as HoleskyDeploymentAddresses, + ROLES_MONITORING_CONTRACTS as HOLESKY_ROLES_MONITORING_CONTRACTS, } from './utils/constants.holesky' const loadDeploymentData = (chainId: number) => { @@ -56,6 +60,7 @@ const loadDeploymentData = (chainId: number) => { contractsWithAssetRecoverer: CONTRACTS_WITH_ASSET_RECOVERER, csmProxyContracts: CSM_PROXY_CONTRACTS, pausableContracts: PAUSABLE_CONTRACTS, + rolesMonitoringContracts: ROLES_MONITORING_CONTRACTS, } case 17000: return { @@ -63,6 +68,7 @@ const loadDeploymentData = (chainId: number) => { contractsWithAssetRecoverer: HOLESKY_CONTRACTS_WITH_ASSET_RECOVERER, csmProxyContracts: HOLESKY_CSM_PROXY_CONTRACTS, pausableContracts: HOLESKY_PAUSABLE_CONTRACTS, + rolesMonitoringContracts: HOLESKY_ROLES_MONITORING_CONTRACTS, } default: throw new Error(`Unsupported chain ID: ${chainId}`) @@ -98,9 +104,13 @@ const main = async () => { fortaEthersProvider = ethProvider } - const { deploymentAddresses, contractsWithAssetRecoverer, csmProxyContracts, pausableContracts } = loadDeploymentData( - config.chainId, - ) + const { + deploymentAddresses, + contractsWithAssetRecoverer, + csmProxyContracts, + pausableContracts, + rolesMonitoringContracts, + } = loadDeploymentData(config.chainId) const address = deploymentAddresses @@ -122,7 +132,13 @@ const main = async () => { csFeeOracleRunner, ) - const csModuleSrv = new CSModuleSrv(logger, ethClient) + const csModuleSrv = new CSModuleSrv( + logger, + ethClient, + address.CS_MODULE_ADDRESS, + address.STAKING_ROUTER_ADDRESS, + getCSModuleEvents(address.CS_MODULE_ADDRESS), + ) const csFeeDistributorSrv = new CSFeeDistributorSrv( logger, @@ -140,6 +156,7 @@ const main = async () => { getCSAccountingEvents(address.CS_ACCOUNTING_ADDRESS), address.CS_ACCOUNTING_ADDRESS, address.LIDO_STETH_ADDRESS, + address.CS_MODULE_ADDRESS, ) const csFeeOracleSrv = new CSFeeOracleSrv( @@ -157,6 +174,7 @@ const main = async () => { getOssifiedProxyEvents(csmProxyContracts), getPausableEvents(pausableContracts), getAssetRecovererEvents(contractsWithAssetRecoverer), + getRolesMonitoringEvents(rolesMonitoringContracts), ) const onAppFindings: Finding[] = [] diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts index 6c80064be..bbe138902 100644 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts @@ -56,6 +56,7 @@ describe('CSAccounting event tests', () => { getCSAccountingEvents(address.CS_ACCOUNTING_ADDRESS), address.CS_ACCOUNTING_ADDRESS, address.LIDO_STETH_ADDRESS, + address.CS_MODULE_ADDRESS, ) test( @@ -73,9 +74,10 @@ describe('CSAccounting event tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } - const results = csAccountingSrv.handleTransaction(transactionDto) + const results = await csAccountingSrv.handleTransaction(transactionDto) expect(results).toMatchSnapshot() expect(results.length).toBe(1) @@ -98,9 +100,10 @@ describe('CSAccounting event tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } - const results = csAccountingSrv.handleTransaction(transactionDto) + const results = await csAccountingSrv.handleTransaction(transactionDto) expect(results).toMatchSnapshot() expect(results.length).toBe(4) @@ -123,9 +126,10 @@ describe('CSAccounting event tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } - const results = csAccountingSrv.handleTransaction(transactionDto) + const results = await csAccountingSrv.handleTransaction(transactionDto) expect(results).toMatchSnapshot() expect(results.length).toBe(1) @@ -148,9 +152,10 @@ describe('CSAccounting event tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } - const results = csAccountingSrv.handleTransaction(transactionDto) + const results = await csAccountingSrv.handleTransaction(transactionDto) expect(results).toMatchSnapshot() expect(results.length).toBe(1) diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts index e643fc892..dc21a84b7 100644 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts @@ -3,8 +3,13 @@ import { either as E } from 'fp-ts' import { Logger } from 'winston' import { BlockDto, EventOfNotice, TransactionDto, handleEventsOfNotice } from '../../entity/events' import { Finding } from '../../generated/proto/alert_pb' -import { filterLog } from 'forta-agent' +import { ethers, filterLog, getEthersProvider } from 'forta-agent' import { APPROVAL_EVENT } from '../../utils/events/cs_accounting_events' +import CS_MODULE_ABI from '../../brief/abi/CSModule.json' +import CS_ACCOUNTING_ABI from '../../brief/abi/CSAccounting.json' +import { getLogsByChunks } from '../../utils/utils' +import { Config } from '../../utils/env/env' +import { AVERAGE_BOND_TRESHOLD, ONE_DAY, UNBONDED_KEYS_TRESHOLD } from '../../utils/constants' export abstract class ICSAccountingClient { public abstract getBlockByNumber(blockNumber: number): Promise> @@ -18,6 +23,10 @@ export class CSAccountingSrv { private readonly csAccountingEvents: EventOfNotice[] private readonly csAccountingAddress: string private readonly stETHAddress: string + private readonly csModuleAddress: string + + private nodeOperatorAddedEvents: ethers.Event[] = [] + private lastAverageBondValueAlertTimestamp: number = 0 constructor( logger: Logger, @@ -25,6 +34,7 @@ export class CSAccountingSrv { csAccountingEvents: EventOfNotice[], csAccountingAddress: string, stETHAddress: string, + csModuleAddress: string, ) { this.logger = logger this.csAccountingClient = ethProvider @@ -32,17 +42,30 @@ export class CSAccountingSrv { this.csAccountingEvents = csAccountingEvents this.csAccountingAddress = csAccountingAddress this.stETHAddress = stETHAddress + this.csModuleAddress = csModuleAddress } public async initialize(currentBlock: number): Promise { const start = new Date().getTime() + const config = new Config() + const currBlock = await this.csAccountingClient.getBlockByNumber(currentBlock) if (E.isLeft(currBlock)) { this.logger.error(elapsedTime(`Failed [${this.name}.initialize]`, start)) return currBlock.left } + const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) + const startBlock = config.csModuleInitBlock + const csModuleNodeOperatorAddedFilter = csModule.filters.NodeOperatorAdded() + this.nodeOperatorAddedEvents = await getLogsByChunks( + csModule, + csModuleNodeOperatorAddedFilter, + startBlock, + currentBlock, + ) + this.logger.info(elapsedTime(`[${this.name}.initialize]`, start)) return null } @@ -55,19 +78,114 @@ export class CSAccountingSrv { const start = new Date().getTime() const findings: Finding[] = [] - const [rolesChangingFindings] = await Promise.all([this.handleRolesChanging(blockDto.number)]) + const averageBondValueFindings = this.handleAverageBondValue(blockDto) + const unbondedValidatorsFindings = this.handleUnbondedValidators(blockDto) - findings.push(...rolesChangingFindings) + findings.push(...averageBondValueFindings, ...unbondedValidatorsFindings) this.logger.info(elapsedTime(CSAccountingSrv.name + '.' + this.handleBlock.name, start)) + this.logger.info(blockDto.timestamp) return findings } - // to be implemented - handleRolesChanging(blockNumber: number): Promise { - const out: Finding = new Finding() - this.logger.info(`${blockNumber}`) - return Promise.resolve([out]) + + public handleAverageBondValue(blockDto: BlockDto): Finding[] { + const out: Finding[] = [] + const now = blockDto.timestamp + + const csAccounting = new ethers.Contract(this.csAccountingAddress, CS_ACCOUNTING_ABI, getEthersProvider()) + let bondValueTotal = 0 + + this.nodeOperatorAddedEvents.forEach(async (event) => { + const noId = event.args?.nodeOperatorId + const bondValue = await csAccounting.getBondSummary(noId).current + bondValueTotal += bondValue + }) + const averageBondValue = bondValueTotal / this.nodeOperatorAddedEvents.length + + const timeSinceLastAlert = now - this.lastAverageBondValueAlertTimestamp + + if (timeSinceLastAlert > ONE_DAY) { + if (averageBondValue >= AVERAGE_BOND_TRESHOLD) { + const f: Finding = new Finding() + f.setName(`🟒 CSAccounting: Average bond value for a validator is below threshold.`) + f.setDescription(`Average bond value for a validator is below ${AVERAGE_BOND_TRESHOLD}`) + f.setAlertid('CS-ACCOUNTING-AVERAGE-BOND-VALUE') + f.setSeverity(Finding.Severity.LOW) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + out.push(f) + + this.lastAverageBondValueAlertTimestamp = now + } + + // * unfinished implementation + const totalBondLock = bondValueTotal + const SOME_VALUE = 1000 // ! Replace with actual value + if (totalBondLock > SOME_VALUE) { + const f: Finding = new Finding() + f.setName(`🟒 LOW: Total bond lock exceeds threshold.`) + f.setDescription(`Total bond lock is more than ${SOME_VALUE}`) + f.setAlertid('CS-ACCOUNTING-TOTAL-BOND-LOCK') + f.setSeverity(Finding.Severity.LOW) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + out.push(f) + } + } + + return out + } + + public handleUnbondedValidators(blockDto: BlockDto): Finding[] { + const out: Finding[] = [] + + const csAccounting = new ethers.Contract(this.csAccountingAddress, CS_ACCOUNTING_ABI, getEthersProvider()) + + this.nodeOperatorAddedEvents.forEach(async (event) => { + const noId = event.args?.nodeOperatorId + const unbondedKeysCount = await csAccounting.getUnbondedKeysCount(noId) + if (unbondedKeysCount >= UNBONDED_KEYS_TRESHOLD) { + const f: Finding = new Finding() + f.setName(`🟒 CSAccounting: Too many unbonded validators since last block.`) + f.setDescription( + `Node Operator #${noId} has ${unbondedKeysCount} unbonded validators since ${blockDto.number} block.`, + ) + f.setAlertid('CS-ACCOUNTING-TOO-MANY-UNBONDED-KEYS') + f.setSeverity(Finding.Severity.LOW) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + out.push(f) + } + }) + + return out + } + + // * unfinished implementation + public async handleBondShareDiscrepancy(): Promise { + const out: Finding[] = [] + + const csAccounting = new ethers.Contract(this.csAccountingAddress, CS_ACCOUNTING_ABI, getEthersProvider()) + const totalBondShares = await csAccounting.totalBondShares() + const sharesOf = await csAccounting.sharesOf(this.csAccountingAddress) + + if (sharesOf.sub(totalBondShares).gt(ethers.BigNumber.from('100'))) { + const f: Finding = new Finding() + f.setName(`🟒 LOW: Bond share discrepancy detected.`) + f.setDescription(`Difference between sharesOf(${this.csAccountingAddress}) and totalBondShares exceeds 100 wei.`) + f.setAlertid('CS-ACCOUNTING-BOND-SHARE-DISCREPANCY') + f.setSeverity(Finding.Severity.LOW) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + out.push(f) + } + + return out } public handleStETHApprovalEvents(txEvent: TransactionDto): Finding[] { @@ -94,12 +212,24 @@ export class CSAccountingSrv { return out } - public handleTransaction(txEvent: TransactionDto): Finding[] { + public async handleTransaction(txEvent: TransactionDto): Promise { const out: Finding[] = [] const csAccountingFindings = handleEventsOfNotice(txEvent, this.csAccountingEvents) const stETHApprovalFindings = this.handleStETHApprovalEvents(txEvent) + const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) + const csModuleNodeOperatorAddedFilter = csModule.filters.NodeOperatorAdded() + const [events] = await getLogsByChunks( + csModule, + csModuleNodeOperatorAddedFilter, + txEvent.block.number, // start block, + txEvent.block.number, // end block, + ) + if (events) { + this.nodeOperatorAddedEvents.push(events) + } + out.push(...csAccountingFindings, ...stETHApprovalFindings) return out diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts index 7e39e59ff..b8f31a995 100644 --- a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts @@ -75,6 +75,7 @@ describe('CsFeeDistributor event tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } const results = await csFeeDistributorSrv.handleTransaction(transactionDto) diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts index b2b8abfea..f64085819 100644 --- a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts @@ -9,6 +9,7 @@ import { ONE_DAY, SECONDS_PER_SLOT } from '../../utils/constants' import { ethers, filterLog, getEthersProvider } from 'forta-agent' import { DISTRIBUTION_DATA_UPDATED_EVENT, TRANSFER_SHARES_EVENT } from '../../utils/events/cs_fee_distributor_events' import { getLogsByChunks } from '../../utils/utils' +import { toKebabCase } from '../../utils/string' export abstract class ICSFeeDistributorClient { public abstract getBlockByNumber(blockNumber: number): Promise> @@ -87,35 +88,95 @@ export class CSFeeDistributorSrv { async handleBlock(blockDto: BlockDto): Promise { const start = new Date().getTime() - const out: Finding[] = [] - - const [revertedTxFindings, rolesChangingFindings] = await Promise.all([ - this.handleRevertedTx(blockDto.number), - this.handleRolesChanging(blockDto.number), - ]) + const findings: Finding[] = [] + + // * Invariants + // const csFeeDistributor = new ethers.Contract( + // this.csFeeDistributorAddress, + // CS_FEE_DISTRIBUTOR_ABI, + // getEthersProvider(), + // ) + //Check that total distributed shares do not exceed total shares distributed by oracle + // assertInvariant( + // totalDistributedShares.lte(treeValues.reduce((acc, val) => acc.add(val), BigNumber.from(0))), + // 'Claimed more than distributed by oracle.', + // findings, + // ) + // assertInvariant(!(treeRoot === ZERO_HASH && treeCid !== ''), 'Tree exists, but no CID.', findings) if (blockDto.number % 10 === 0) { const distributionDataUpdatedFindings = await this.handleDistributionDataUpdated(blockDto) - out.push(...distributionDataUpdatedFindings) + findings.push(...distributionDataUpdatedFindings) } - out.push(...revertedTxFindings, ...rolesChangingFindings) - this.logger.info(elapsedTime(CSFeeDistributorSrv.name + '.' + this.handleBlock.name, start)) - return out + return findings } - // to be implemented - handleRolesChanging(blockNumber: number): Promise { - const out: Finding = new Finding() - this.logger.info(`${blockNumber}`) - return Promise.resolve([out]) + + private async handleRevertedTx(txEvent: TransactionDto): Promise { + const out: Finding[] = [] + + const txReceipt = await getEthersProvider().getTransactionReceipt(txEvent.hash) + + // Checks if transaction reverted + if (txReceipt.status === 0) { + for (const log of txReceipt.logs) { + try { + const decodedLog = ethers.utils.defaultAbiCoder.decode(['string'], log.data) + const reason = decodedLog[0] + + if (reason) { + switch (reason) { + case 'InvalidShares': + out.push( + this.createCriticalFindingForRevertedTx( + 'CSFeeOracle reports incorrect amount of shares to distribute', + 'InvalidShares', + ), + ) + break + case 'NotEnoughShares': + out.push( + this.createCriticalFindingForRevertedTx( + 'CSFeeDistributor internal accounting error', + 'NotEnoughShares', + ), + ) + break + case 'InvalidTreeRoot': + out.push( + this.createCriticalFindingForRevertedTx('CSFeeOracle built incorrect report', 'InvalidTreeRoot'), + ) + break + case 'InvalidTreeCID': + out.push( + this.createCriticalFindingForRevertedTx('CSFeeOracle built incorrect report', 'InvalidTreeCID'), + ) + break + default: + this.logger.warn(`Unrecognized revert reason: ${reason}`) + break + } + } + } catch (error) { + this.logger.error(`Failed to decode log data: ${error}`) + } + } + } + + return out } - // to be implemented - handleRevertedTx(blockNumber: number): Promise { - const out: Finding = new Finding() - this.logger.info(`${blockNumber}`) - return Promise.resolve([out]) + + private createCriticalFindingForRevertedTx(description: string, reason: string): Finding { + const f = new Finding() + f.setName(`🟣 CRITICAL: ${reason}`) + f.setDescription(`Transaction reverted. ${description}`) + f.setAlertid(`CSFEE-${toKebabCase(reason)}`) + f.setSeverity(Finding.Severity.CRITICAL) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + return f } private async handleDistributionDataUpdated(blockDto: BlockDto): Promise { @@ -171,8 +232,9 @@ export class CSFeeDistributorSrv { const csFeeDistributorFindings = handleEventsOfNotice(txEvent, this.csFeeDistributorEvents) const transferSharesInvalidReceiverFindings = this.handleTransferSharesInvalidReceiver(txEvent) + const revertedTxFindings = await this.handleRevertedTx(txEvent) - out.push(...csFeeDistributorFindings, ...transferSharesInvalidReceiverFindings) + out.push(...csFeeDistributorFindings, ...transferSharesInvalidReceiverFindings, ...revertedTxFindings) return out } diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts index 852eab89e..b8c20c6a4 100644 --- a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts +++ b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts @@ -73,6 +73,7 @@ describe('CSFeeOracle and HashConsensus events tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } const results = csFeeOracleSrv.handleTransaction(transactionDto) @@ -97,6 +98,7 @@ describe('CSFeeOracle and HashConsensus events tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } const result = csFeeOracleSrv.handleTransaction(transactionDto) @@ -122,6 +124,7 @@ describe('CSFeeOracle and HashConsensus events tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } const results = csFeeOracleSrv.handleTransaction(transactionDto) @@ -146,6 +149,7 @@ describe('CSFeeOracle and HashConsensus events tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } const result = csFeeOracleSrv.handleTransaction(transactionDto) @@ -170,6 +174,7 @@ describe('CSFeeOracle and HashConsensus events tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } const result = csFeeOracleSrv.handleTransaction(transactionDto) @@ -193,6 +198,7 @@ describe('CSFeeOracle and HashConsensus events tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } const result = csFeeOracleSrv.handleTransaction(transactionDto) diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts b/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts new file mode 100644 index 000000000..80474ee20 --- /dev/null +++ b/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts @@ -0,0 +1,138 @@ +import { DeploymentAddress, DeploymentAddresses } from '../../utils/constants.holesky' +import { expect } from '@jest/globals' +import { TransactionDto } from '../../entity/events' +import { + CSModule__factory, + CSAccounting__factory, + CSFeeDistributor__factory, + CSFeeOracle__factory, +} from '../../generated/typechain' +import { CSModuleSrv, ICSModuleClient } from './CSModule.srv' +import { getCSModuleEvents } from '../../utils/events/cs_module_events' +import * as Winston from 'winston' +import { ETHProvider } from '../../clients/eth_provider' +import { ethers } from 'forta-agent' +import { getFortaConfig } from 'forta-agent/dist/sdk/utils' +import promClient from 'prom-client' +import { Metrics } from '../../utils/metrics/metrics' + +const TEST_TIMEOUT = 120_000 // ms + +describe('CSModule event tests', () => { + const chainId = 17000 + + const logger: Winston.Logger = Winston.createLogger({ + format: Winston.format.simple(), + transports: [new Winston.transports.Console()], + }) + + const address: DeploymentAddress = DeploymentAddresses + + const fortaEthersProvider = new ethers.providers.JsonRpcProvider(getFortaConfig().jsonRpcUrl, chainId) + const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) + const csAccountingRunner = CSAccounting__factory.connect(address.CS_ACCOUNTING_ADDRESS, fortaEthersProvider) + const csFeeDistributorRunner = CSFeeDistributor__factory.connect( + address.CS_FEE_DISTRIBUTOR_ADDRESS, + fortaEthersProvider, + ) + const csFeeOracleRunner = CSFeeOracle__factory.connect(address.CS_FEE_ORACLE_ADDRESS, fortaEthersProvider) + + const registry = new promClient.Registry() + const m = new Metrics(registry, 'test_') + + const csModuleClient: ICSModuleClient = new ETHProvider( + logger, + m, + fortaEthersProvider, + csModuleRunner, + csAccountingRunner, + csFeeDistributorRunner, + csFeeOracleRunner, + ) + + const csModuleSrv = new CSModuleSrv( + logger, + csModuleClient, + address.CS_MODULE_ADDRESS, + address.STAKING_ROUTER_ADDRESS, + getCSModuleEvents(address.CS_MODULE_ADDRESS), + ) + + test( + '🟠 CSModule: Target limit mode changed', + async () => { + const txHash = '0xd8bb4389a056be70fe20e3b6b903c3e7cdbf053610bd8d647c4e2fe49c94f8b6' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = await csModuleSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) + }, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ CSModule: EL Rewards stealing penalty reported', + async () => { + const txHash = '0x45d08822a9e025d374ab182612a119d837a0869b0c343379025303f53c4c63be' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = await csModuleSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) + }, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΅ CSModule: Notable Node Operator creation', + async () => { + const txHash = '0x87ece6668905293fd00c7eeff15ff685ed1d10810bc5cbba204f0881ab877be6' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = await csModuleSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) + }, + TEST_TIMEOUT, + ) +}) diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.ts b/csm-alerts/src/services/CSModule/CSModule.srv.ts index 36fda6fd6..c72b7db42 100644 --- a/csm-alerts/src/services/CSModule/CSModule.srv.ts +++ b/csm-alerts/src/services/CSModule/CSModule.srv.ts @@ -1,33 +1,102 @@ import { either as E } from 'fp-ts' -import { TransactionDto } from '../../entity/events' +import { EventOfNotice, TransactionDto, handleEventsOfNotice, BlockDto } from '../../entity/events' import { elapsedTime } from '../../utils/time' import { Logger } from 'winston' -import { BlockDto } from '../../entity/events' import { Finding } from '../../generated/proto/alert_pb' +import { ethers, filterLog, getEthersProvider } from 'forta-agent' +import CS_MODULE_ABI from '../../brief/abi/CSModule.json' +import BigNumber from 'bignumber.js' +import { + BASIS_POINTS_DIVIDER, + MAX_EMPTY_BATCHES_IN_THE_QUEUE, + MAX_OPERATORS_WITH_SAME_MANAGER_OR_REWARD_ADDRESS, + MAX_TARGET_SHARE_PERCENT_USED, + MAX_VALIDATORS_IN_THE_QUEUE, + ONE_DAY, +} from '../../utils/constants' +import { assertInvariant, getLogsByChunks } from '../../utils/utils' +import STAKING_ROUTER_ABI from '../../brief/abi/StakingRouter.json' +import { Config } from '../../utils/env/env' +import { NODE_OPERATOR_ADDED_EVENT_ABI } from '../../utils/events/cs_module_events' export abstract class ICSModuleClient { public abstract getBlockByNumber(blockNumber: number): Promise> } +class Batch { + value: BigNumber + + constructor(v: BigNumber) { + this.value = v + } + + noId(): bigint { + return BigInt(this.value.toString()) >> BigInt(192) + } + + keys(): bigint { + return (BigInt(this.value.toString()) >> BigInt(128)) & BigInt('0xFFFFFFFFFFFFFFFF') + } + + next(): bigint { + return BigInt(this.value.toString()) & BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF') + } +} + +interface StakingModule { + stakingModuleAddress: string + targetShare: number // in basis points +} + export class CSModuleSrv { private readonly name = 'CSModuleSrv' private readonly logger: Logger private readonly csModuleClient: ICSModuleClient + private readonly csModuleAddress: string + private readonly stakingRouterAddress: string + private readonly csModuleEvents: EventOfNotice[] + private lastDuplicateAddressesAlertTimestamp: number = 0 + private lastModuleShareIsCloseToTargetShareAlertTimestamp: number = 0 + private lastTooManyEmptyBatchesAlertTimestamp: number = 0 + private lastTooManyValidatorsAlertTimestamp: number = 0 + private addressCounts: { [address: string]: number } = {} + private nodeOperatorAddedEvents: ethers.Event[] = [] - constructor(logger: Logger, csModuleClient: ICSModuleClient) { + constructor( + logger: Logger, + csModuleClient: ICSModuleClient, + csModuleAddress: string, + stakingRouterAddress: string, + csModuleEvents: EventOfNotice[], + ) { this.logger = logger this.csModuleClient = csModuleClient + this.csModuleAddress = csModuleAddress + this.stakingRouterAddress = stakingRouterAddress + this.csModuleEvents = csModuleEvents } public async initialize(currentBlock: number): Promise { const start = new Date().getTime() + const config = new Config() + const currBlock = await this.csModuleClient.getBlockByNumber(currentBlock) if (E.isLeft(currBlock)) { this.logger.error(elapsedTime(`Failed [${this.name}.initialize]`, start)) return currBlock.left } + const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) + const startBlock = config.csModuleInitBlock + const csModuleNodeOperatorAddedFilter = csModule.filters.NodeOperatorAdded() + this.nodeOperatorAddedEvents = await getLogsByChunks( + csModule, + csModuleNodeOperatorAddedFilter, + startBlock, + currentBlock, + ) + this.logger.info(elapsedTime(`[${this.name}.initialize]`, start)) return null } @@ -36,39 +105,340 @@ export class CSModuleSrv { return this.name } - async handleBlock(blockDto: BlockDto): Promise { - const start = new Date().getTime() - const findings: Finding[] = [] + public handleEveryHundredOperatorsCreated(txEvent: TransactionDto) { + const out: Finding[] = [] - const [rolesChangingFindings] = await Promise.all([this.handleRolesChanging(blockDto.number)]) + const nodeOperatorAddedEvents = filterLog(txEvent.logs, NODE_OPERATOR_ADDED_EVENT_ABI, this.csModuleAddress) + nodeOperatorAddedEvents.forEach((event) => { + if (Number(event.args.nodeOperatorId) % 100 === 0 || Number(event.args.nodeOperatorId) === 69) { + const f: Finding = new Finding() + f.setName(`πŸ”΅ CSModule: Notable Node Operator creation`) + f.setDescription(`Operator #${event.args.nodeOperatorId} was created.`) + f.setAlertid('CS-MODULE-NOTABLE-NODE-OPERATOR-CREATION') + f.setSeverity(Finding.Severity.INFO) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') - findings.push(...rolesChangingFindings) + out.push(f) + } + }) - this.logger.info(elapsedTime(CSModuleSrv.name + '.' + this.handleBlock.name, start)) + return out + } - return findings + async handleTransaction(txEvent: TransactionDto): Promise { + const out: Finding[] = [] + + const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) + // Important to get events of type ethers.Event specificly + // therefore fetching current block + const csModuleNodeOperatorAddedFilter = csModule.filters.NodeOperatorAdded() + const [events] = await getLogsByChunks( + csModule, + csModuleNodeOperatorAddedFilter, + txEvent.block.number, // start block, + txEvent.block.number, // end block, + ) + if (events) { + this.nodeOperatorAddedEvents.push(events) + } + + const csModuleFindings = handleEventsOfNotice(txEvent, this.csModuleEvents) + const everyHundredOperatorsCreatedFindings = this.handleEveryHundredOperatorsCreated(txEvent) + + out.push(...csModuleFindings, ...everyHundredOperatorsCreatedFindings) + + return out } - // to be implemented - handleRolesChanging(blockNumber: number): Promise { - const out: Finding = new Finding() - this.logger.info(`${blockNumber}`) - return Promise.resolve([out]) + + async getTotalActiveValidators(blockDto: BlockDto) { + const stakingRouter = new ethers.Contract(this.stakingRouterAddress, STAKING_ROUTER_ABI, getEthersProvider()) + const [smDigests] = await stakingRouter.functions.getAllStakingModuleDigests({ + blockTag: blockDto.number, + }) + let totalActiveValidators = 0 + for (const smDigest of smDigests) { + const summary = smDigest.summary + const totalDepositedValidators = (summary.totalDepositedValidators as BigNumber).toNumber() + const totalExitedValidators = (summary.totalExitedValidators as BigNumber).toNumber() + totalActiveValidators += totalDepositedValidators - totalExitedValidators + } + + return totalActiveValidators } - handleTransaction(txEvent: TransactionDto): Finding[] { + public async handleModuleShareIsCloseToTargetShare( + blockDto: BlockDto, + totalActiveValidators: number, + ): Promise { const out: Finding[] = [] + const now = blockDto.timestamp + + const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) + const stakingRouter = new ethers.Contract(this.stakingRouterAddress, STAKING_ROUTER_ABI, getEthersProvider()) - const moduleShareIsCloseToTargetShareFindings = this.handleModuleShareIsCloseToTargetShare(txEvent) + const summary = await csModule.functions.getStakingModuleSummary() + const csTotalDepositedValidators = (summary.totalDepositedValidators as BigNumber).toNumber() + const csTotalExitedValidators = (summary.totalExitedValidators as BigNumber).toNumber() + const csTotalActiveValidators = csTotalDepositedValidators - csTotalExitedValidators - out.push(...moduleShareIsCloseToTargetShareFindings) + const stakingModules = await stakingRouter.functions.getStakingModules() + const csModuleInfo = stakingModules.find( + (module: StakingModule) => module.stakingModuleAddress === this.csModuleAddress, + ) + const currentShare = Math.ceil((csTotalActiveValidators / totalActiveValidators) * 100) + const targetShare = Math.ceil(csModuleInfo.targetShare / BASIS_POINTS_DIVIDER) + const percentUsed = Math.ceil((currentShare / targetShare) * 100) + + const timeSinceLastAlert = now - this.lastModuleShareIsCloseToTargetShareAlertTimestamp + + if (timeSinceLastAlert > ONE_DAY) { + if (percentUsed >= MAX_TARGET_SHARE_PERCENT_USED) { + const f: Finding = new Finding() + f.setName(`🟒 CSModule: Module's share is close to the targetShare.`) + f.setDescription( + `The module's share is close to the target share (${percentUsed}% used). The module has ${csTotalActiveValidators} validators against ${totalActiveValidators} total. Target share: ${csModule.targetShare}`, + ) + f.setAlertid('CS-MODULE-CLOSE-TO-TARGET-SHARE') + f.setSeverity(Finding.Severity.LOW) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + out.push(f) + + this.lastModuleShareIsCloseToTargetShareAlertTimestamp = now + } + } return out } - // to be implemented - public handleModuleShareIsCloseToTargetShare(txEvent: TransactionDto): Finding[] { + public async handleDuplicateAddresses(blockDto: BlockDto) { const out: Finding[] = [] - this.logger.info(`${txEvent.block.timestamp}`) + const now = blockDto.timestamp + + this.nodeOperatorAddedEvents.forEach((event) => { + const addresses = [event.args?.managerAddress, event.args?.rewardAddress] + addresses.forEach((address) => { + if (address) { + this.addressCounts[address] = (this.addressCounts[address] ?? 0) + 1 + } + }) + }) + + const timeSinceLastAlert = now - this.lastDuplicateAddressesAlertTimestamp + + if (timeSinceLastAlert > ONE_DAY) { + Object.entries(this.addressCounts).forEach(([address, count]) => { + if (count > MAX_OPERATORS_WITH_SAME_MANAGER_OR_REWARD_ADDRESS) { + const f: Finding = new Finding() + f.setName( + `🟒 CSModule: More than ${MAX_OPERATORS_WITH_SAME_MANAGER_OR_REWARD_ADDRESS} operators have the same manager or reward address.`, + ) + f.setDescription(`${count} operators have ${address} as manager or reward address.`) + f.setAlertid('CS-MODULE-DUPLICATE-MANAGER-OR-REWARD-ADDRESS') + f.setSeverity(Finding.Severity.LOW) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + out.push(f) + + this.lastDuplicateAddressesAlertTimestamp = now + } + }) + } return out } + + public async handleDepositQueueAlerts(blockDto: BlockDto) { + const out: Finding[] = [] + const now = blockDto.timestamp + + const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) + const queueLookup: Map = new Map() + let emptyBatchCount = 0 + const queue = await csModule.depositQueue() + let validatorsInQueue = 0 + let index = queue.head + + while (index < queue.tail) { + const batchValue: BigNumber = await csModule.depositQueueItem(index) + const batch = new Batch(batchValue) + if (batch.next() === BigInt(0)) { + break + } + const nodeOperatorId = batch.noId() + const keysInBatch = batch.keys() + const nodeOperator = await csModule.getNodeOperator(nodeOperatorId, { blockTag: blockDto.number }) + const depositableKeys = nodeOperator.depositableValidatorsCount + + const keysSeenForOperator = queueLookup.get(nodeOperatorId) || 0 + + if (BigInt(keysSeenForOperator) >= depositableKeys) { + emptyBatchCount++ + } else { + queueLookup.set(nodeOperatorId, BigInt(keysSeenForOperator) + keysInBatch) + validatorsInQueue += Number(keysInBatch) + } + + index = batch.next() + } + + const timeSinceLastEmptyBatchesAlert = now - this.lastTooManyEmptyBatchesAlertTimestamp + + if (timeSinceLastEmptyBatchesAlert > ONE_DAY) { + if (emptyBatchCount > MAX_EMPTY_BATCHES_IN_THE_QUEUE) { + const f: Finding = new Finding() + f.setName(`🟒 CSModule: Too many empty batces in the deposit queue.`) + f.setDescription(`${emptyBatchCount} empty batces in the deposit queue.`) + f.setAlertid('CS-MODULE-TOO-MANY-EMPTY-BATCHES-IN-THE-QUEUE') + f.setSeverity(Finding.Severity.LOW) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + out.push(f) + + this.lastTooManyEmptyBatchesAlertTimestamp = now + } + } + + const timeSinceLastMaxValidatorsAlert = now - this.lastTooManyValidatorsAlertTimestamp + + if (timeSinceLastMaxValidatorsAlert > ONE_DAY) { + if (validatorsInQueue > MAX_VALIDATORS_IN_THE_QUEUE) { + const f: Finding = new Finding() + f.setName('🟒 CSModule: Too many validators in the queue.') + f.setDescription(`CSModule has ${validatorsInQueue} keys in the deposit queue.`) + f.setAlertid('CS-MODULE-TOO-MANY-VALIDATORS-IN-THE-QUEUE') + f.setSeverity(Finding.Severity.LOW) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + out.push(f) + + this.lastTooManyValidatorsAlertTimestamp = now + } + } + + return out + } + + async handleBlock(blockDto: BlockDto): Promise { + const start = new Date().getTime() + const findings: Finding[] = [] + + const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) + + // Invariants + let totalDepositedValidators = 0 + let totalExitedValidators = 0 + let depositableValidatorsCount = 0 + + for (let noId = 0; noId < csModule.getNodeOperatorsCount(); noId++) { + const noSummary = csModule.getNodeOperatorSummary(noId) + + if (!csModule.publicRelease) { + assertInvariant( + noSummary.totalAddedKeys > csModule.MAX_SIGNING_KEYS_PER_OPERATOR_BEFORE_PUBLIC_RELEASE, + `Invariant failed: Node Operator ${noId} has more keys than allowed before public release.`, + findings, + ) + } + + const no = await csModule.getNodeOperator(noId) + + assertInvariant( + !(no.totalAddedKeys >= no.totalDepositedKeys && no.totalDepositedKeys >= no.totalWithdrawnKeys), + `Invariant failed: totalAddedKeys >= totalDepositedKeys >= totalWithdrawnKeys for Node Operator ${noId}`, + findings, + ) + assertInvariant( + !(no.totalDepositedKeys <= no.totalVettedKeys && no.totalVettedKeys <= no.totalAddedKeys), + `Invariant failed: totalDepositedKeys <= totalVettedKeys <= totalAddedKeys for Node Operator ${noId}`, + findings, + ) + assertInvariant( + !(no.stuckValidatorsCount + no.totalWithdrawnKeys <= no.totalDepositedKeys), + `Invariant failed: stuckValidatorsCount + totalWithdrawnKeys <= totalDepositedKeys for Node Operator ${noId}`, + findings, + ) + assertInvariant( + !(no.depositableValidatorsCount + no.totalExitedKeys <= no.totalAddedKeys), + `Invariant failed: depositableValidatorsCount + totalExitedKeys <= totalAddedKeys for Node Operator ${noId}`, + findings, + ) + assertInvariant( + no.proposedManagerAddress === no.managerAddress, + `Invariant failed: proposedManagerAddress should not equal managerAddress for Node Operator ${noId}`, + findings, + ) + assertInvariant( + no.proposedRewardAddress === no.rewardAddress, + `Invariant failed: proposedRewardAddress should not equal rewardAddress for Node Operator ${noId}`, + findings, + ) + assertInvariant( + no.managerAddress === ethers.constants.AddressZero, + `Invariant failed: managerAddress should not be zero address for Node Operator ${noId}`, + findings, + ) + assertInvariant( + no.rewardAddress === ethers.constants.AddressZero, + `Invariant failed: rewardAddress should not be zero address for Node Operator ${noId}`, + findings, + ) + + const queue = await csModule.depositQueue() + let index = queue.head + const tail = queue.tail + let enqueuedCount = BigInt(0) + while (index < tail) { + const batchValue: BigNumber = await csModule.depositQueueItem(index) + const batch = new Batch(batchValue) + if (batch.noId() === BigInt(noId)) { + enqueuedCount += batch.keys() + } + index = batch.next() + if (index === BigInt(0)) { + break + } + } + + assertInvariant( + no.enqueuedCount !== enqueuedCount, + `Invariant failed: enqueuedCount mismatch for Node Operator ${noId}`, + findings, + ) + + totalDepositedValidators += new BigNumber(noSummary.totalDepositedKeys.toString()).toNumber() + totalExitedValidators += new BigNumber(noSummary.totalExitedKeys.toString()).toNumber() + depositableValidatorsCount += new BigNumber(noSummary.depositableValidatorsCount.toString()).toNumber() + } + + const smSummary = await csModule.functions.getStakingModuleSummary() + assertInvariant( + smSummary.totalDepositedValidators !== totalDepositedValidators || + smSummary.totalExitedValidators !== totalExitedValidators || + smSummary.depositableValidatorsCount !== depositableValidatorsCount, + `Invariant failed: Global summary values do not match the accumulated node operator summaries.`, + findings, + ) + + const moduleShareIsCloseToTargetShareFindings = this.handleModuleShareIsCloseToTargetShare( + blockDto, + await this.getTotalActiveValidators(blockDto), + ) + const duplicateAddressesFindings = this.handleDuplicateAddresses(blockDto) + const depositQueueFindings = this.handleDepositQueueAlerts(blockDto) + + findings.push( + ...(await moduleShareIsCloseToTargetShareFindings), + ...(await duplicateAddressesFindings), + ...(await depositQueueFindings), + ) + + this.logger.info(elapsedTime(CSModuleSrv.name + '.' + this.handleBlock.name, start)) + + return findings + } } diff --git a/csm-alerts/src/services/CSModule/__snapshots__/CSModule.srv.spec.ts.snap b/csm-alerts/src/services/CSModule/__snapshots__/CSModule.srv.spec.ts.snap new file mode 100644 index 000000000..b17943876 --- /dev/null +++ b/csm-alerts/src/services/CSModule/__snapshots__/CSModule.srv.spec.ts.snap @@ -0,0 +1,108 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CSModule event tests πŸ”΄ CSModule: EL Rewards stealing penalty reported 1`] = ` +[ + { + "array": [ + "ethereum", + 4, + [], + 4, + "CS-MODULE-EL-REWARDS-STEALING-PENALTY-REPORTED", + "πŸ”΄ CSModule: EL Rewards stealing penalty reported", + "EL Rewards stealing penalty reported for Node Operator #37 with 0.004 ETH potentially stolen", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "37,0x9abf3544139d770248221e34fc90b40d9d2d526c7ae1638dc482bbcfae213c3b,3570000000000000", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; + +exports[`CSModule event tests πŸ”΅ CSModule: Notable Node Operator creation 1`] = ` +[ + { + "array": [ + "ethereum", + 1, + , + 4, + "CS-MODULE-NOTABLE-NODE-OPERATOR-CREATION", + "πŸ”΅ CSModule: Notable Node Operator creation", + "Operator #69 was created.", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": null, + }, +] +`; + +exports[`CSModule event tests 🟠 CSModule: Target limit mode changed 1`] = ` +[ + { + "array": [ + "ethereum", + 3, + [], + 4, + "CS-MODULE-TARGET-LIMIT-MODE-CHANGED", + "🟠 CSModule: Target limit mode changed", + "Target limit mode: 2 (forced mode)", + , + , + [], + , + [], + [], + ], + "arrayIndexOffset_": -1, + "convertedPrimitiveFields_": {}, + "messageId_": undefined, + "pivot_": 1.7976931348623157e+308, + "wrappers_": { + "3": { + "arrClean": false, + "arr_": [], + "map_": { + "args": { + "key": "args", + "value": "3,2,5", + "valueWrapper": undefined, + }, + }, + "valueCtor_": null, + }, + }, + }, +] +`; diff --git a/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.spec.ts b/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.spec.ts index 28261a6e8..46bd8fff3 100644 --- a/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.spec.ts +++ b/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.spec.ts @@ -4,6 +4,7 @@ import { DeploymentAddress, DeploymentAddresses, PAUSABLE_CONTRACTS, + ROLES_MONITORING_CONTRACTS, } from '../../utils/constants.holesky' import { expect } from '@jest/globals' import { TransactionDto } from '../../entity/events' @@ -16,6 +17,7 @@ import { import { getOssifiedProxyEvents } from '../../utils/events/ossified_proxy_events' import { getPausableEvents } from '../../utils/events/pausable_events' import { getAssetRecovererEvents } from '../../utils/events/asset_recoverer_events' +import { getRolesMonitoringEvents } from '../../utils/events/roles_monitoring_events' import { ProxyWatcherSrv, IProxyWatcherClient } from './ProxyWatcher.srv' import * as Winston from 'winston' import { ETHProvider } from '../../clients/eth_provider' @@ -64,6 +66,7 @@ describe('ProxyWatcher event tests', () => { getOssifiedProxyEvents(CSM_PROXY_CONTRACTS), getPausableEvents(PAUSABLE_CONTRACTS), getAssetRecovererEvents(CONTRACTS_WITH_ASSET_RECOVERER), + getRolesMonitoringEvents(ROLES_MONITORING_CONTRACTS), ) test( @@ -81,6 +84,7 @@ describe('ProxyWatcher event tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } const results = proxyWatcherSrv.handleTransaction(transactionDto) @@ -106,6 +110,7 @@ describe('ProxyWatcher event tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } const results = proxyWatcherSrv.handleTransaction(transactionDto) @@ -131,6 +136,7 @@ describe('ProxyWatcher event tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } const results = proxyWatcherSrv.handleTransaction(transactionDto) @@ -156,6 +162,7 @@ describe('ProxyWatcher event tests', () => { timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), number: trx.blockNumber ? trx.blockNumber : 1, }, + hash: trx.hash, } const results = proxyWatcherSrv.handleTransaction(transactionDto) diff --git a/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.ts b/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.ts index 61fb5ccdb..083b8822f 100644 --- a/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.ts +++ b/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.ts @@ -16,6 +16,7 @@ export class ProxyWatcherSrv { private readonly ossifiedProxyEvents: EventOfNotice[] private readonly pausableEvents: EventOfNotice[] private readonly assetRecovererEvents: EventOfNotice[] + private readonly rolesMonitoringEvents: EventOfNotice[] constructor( logger: Logger, @@ -23,6 +24,7 @@ export class ProxyWatcherSrv { ossifiedProxyEvents: EventOfNotice[], pausableEvents: EventOfNotice[], assetRecovererEvents: EventOfNotice[], + rolesMonitoringEvents: EventOfNotice[], ) { this.logger = logger this.proxyWatcherClient = ethProvider @@ -30,6 +32,7 @@ export class ProxyWatcherSrv { this.ossifiedProxyEvents = ossifiedProxyEvents this.pausableEvents = pausableEvents this.assetRecovererEvents = assetRecovererEvents + this.rolesMonitoringEvents = rolesMonitoringEvents } public async initialize(currentBlock: number): Promise { @@ -64,8 +67,9 @@ export class ProxyWatcherSrv { const ossifiedProxyFindings = handleEventsOfNotice(txEvent, this.ossifiedProxyEvents) const pausableEventsFindings = handleEventsOfNotice(txEvent, this.pausableEvents) const assetRecovererFindings = handleEventsOfNotice(txEvent, this.assetRecovererEvents) + const rolesMonitoringFindings = handleEventsOfNotice(txEvent, this.rolesMonitoringEvents) - out.push(...ossifiedProxyFindings, ...pausableEventsFindings, ...assetRecovererFindings) + out.push(...ossifiedProxyFindings, ...pausableEventsFindings, ...assetRecovererFindings, ...rolesMonitoringFindings) return out } diff --git a/csm-alerts/src/utils/constants.holesky.ts b/csm-alerts/src/utils/constants.holesky.ts index 7ef5d7406..38511c639 100644 --- a/csm-alerts/src/utils/constants.holesky.ts +++ b/csm-alerts/src/utils/constants.holesky.ts @@ -11,8 +11,28 @@ export type DeploymentAddress = { LIDO_STETH_ADDRESS: string BURNER_ADDRESS: string HASH_CONSENSUS_ADDRESS: string + STAKING_ROUTER_ADDRESS: string + RolesMap: Map } +const DEFAULT_ADMIN_ROLE_HASH: string = '0x0000000000000000000000000000000000000000000000000000000000000000' +const PAUSE_ROLE_HASH: string = '0x139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d' +const RESUME_ROLE_HASH: string = '0x2fc10cc8ae19568712f7a176fb4978616a610650813c9d05326c34abb62749c7' +const STAKING_ROUTER_ROLE_HASH: string = '0xbb75b874360e0bfd87f964eadd8276d8efb7c942134fc329b513032d0803e0c6' +const MODULE_MANAGER_ROLE_HASH: string = '0x79dfcec784e591aafcf60db7db7b029a5c8b12aac4afd4e8c4eb740430405fa6' +const REPORT_EL_REWARDS_STEALING_PENALTY_ROLE_HASH: string = + '0x59911a6aa08a72fe3824aec4500dc42335c6d0702b6d5c5c72ceb265a0de9302' +const SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE_HASH: string = + '0xe85fdec10fe0f93d0792364051df7c3d73e37c17b3a954bffe593960e3cd3012' +const VERIFIER_ROLE_HASH: string = '0x0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea09' +const RECOVERER_ROLE_HASH: string = '0xb3e25b5404b87e5a838579cb5d7481d61ad96ee284d38ec1e97c07ba64e7f6fc' +const ACCOUNTING_MANAGER_ROLE_HASH: string = '0x40579467dba486691cc62fd8536d22c6d4dc9cdc7bc716ef2518422aa554c098' +const MANAGE_BOND_CURVES_ROLE_HASH: string = '0xd35e4a788498271198ec69c34f1dc762a1eee8200c111f598da1b3dde946783d' +const SET_BOND_CURVE_ROLE_HASH: string = '0x645c9e6d2a86805cb5a28b1e4751c0dab493df7cf935070ce405489ba1a7bf72' +const RESET_BOND_CURVE_ROLE_HASH: string = '0xb5dffea014b759c493d63b1edaceb942631d6468998125e1b4fe427c99082134' +const CONTRACT_MANAGER_ROLE_HASH: string = '0x8135f02737a6b32709c1f229001b55183df0d6abcb3022e8bae091ad43fd9e6d' +const SUBMIT_DATA_ROLE_HASH: string = '0x65fa0c17458517c727737e4153dd477fa3e328cf706640b0f68b1a285c5990da' + export const DeploymentAddresses: DeploymentAddress = { CS_MODULE_ADDRESS: '0x4562c3e63c2e586cD1651B958C22F88135aCAd4f', CS_ACCOUNTING_ADDRESS: '0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1', @@ -24,6 +44,24 @@ export const DeploymentAddresses: DeploymentAddress = { LIDO_STETH_ADDRESS: '0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034', BURNER_ADDRESS: '0x4E46BD7147ccf666E1d73A3A456fC7a68de82eCA', HASH_CONSENSUS_ADDRESS: '0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37', + STAKING_ROUTER_ADDRESS: '0xd6EbF043D30A7fe46D1Db32BA90a0A51207FE229', + RolesMap: new Map([ + [DEFAULT_ADMIN_ROLE_HASH, 'DEFAULT ADMIN ROLE'], + [PAUSE_ROLE_HASH, 'PAUSE ROLE'], + [RESUME_ROLE_HASH, 'RESUME ROLE'], + [MODULE_MANAGER_ROLE_HASH, 'MODULE MANAGER ROLE'], + [STAKING_ROUTER_ROLE_HASH, 'STAKING ROUTER ROLE'], + [REPORT_EL_REWARDS_STEALING_PENALTY_ROLE_HASH, 'REPORT EL REWARDS STEALING PENALTY ROLE'], + [SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE_HASH, 'SETTLE EL REWARDS STEALING PENALTY ROLE'], + [VERIFIER_ROLE_HASH, 'VERIFIER ROLE'], + [RECOVERER_ROLE_HASH, 'RECOVERER ROLE'], + [ACCOUNTING_MANAGER_ROLE_HASH, 'ACCOUNTING MANAGER ROLE'], + [MANAGE_BOND_CURVES_ROLE_HASH, 'MANAGE BOND CURVES ROLE'], + [SET_BOND_CURVE_ROLE_HASH, 'SET BOND CURVE ROLE'], + [RESET_BOND_CURVE_ROLE_HASH, 'RESET BOND CURVE ROLE'], + [CONTRACT_MANAGER_ROLE_HASH, 'CONTRACT MANAGER ROLE'], + [SUBMIT_DATA_ROLE_HASH, 'SUBMIT DATA ROLE'], + ]), } export interface Proxy { name: string @@ -43,6 +81,11 @@ export interface PausableContract { functions: Map } +export interface RolesMonitoringContract { + name: string + address: string +} + export const CSM_PROXY_CONTRACTS: Proxy[] = [ { name: 'CSModule', @@ -139,3 +182,26 @@ export const PAUSABLE_CONTRACTS: PausableContract[] = [ ]), }, ] + +export const ROLES_MONITORING_CONTRACTS: RolesMonitoringContract[] = [ + { + name: 'CSModule', + address: DeploymentAddresses.CS_MODULE_ADDRESS, + }, + { + name: 'CSAccounting', + address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, + }, + { + name: 'CSFeeDistributor', + address: DeploymentAddresses.CS_FEE_DISTRIBUTOR_ADDRESS, + }, + { + name: 'CSFeeOracle', + address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, + }, + { + name: 'HashConsensus', + address: DeploymentAddresses.HASH_CONSENSUS_ADDRESS, + }, +] diff --git a/csm-alerts/src/utils/constants.mainnet.ts b/csm-alerts/src/utils/constants.mainnet.ts index 55233c671..179e2e1c0 100644 --- a/csm-alerts/src/utils/constants.mainnet.ts +++ b/csm-alerts/src/utils/constants.mainnet.ts @@ -12,8 +12,26 @@ export type DeploymentAddress = { BURNER_ADDRESS: string ACCOUNTING_HASH_CONSENSUS_ADDRESS: string HASH_CONSENSUS_ADDRESS: string + STAKING_ROUTER_ADDRESS: string + RolesMap: Map } +const DEFAULT_ADMIN_ROLE_HASH: string = '' +const PAUSE_ROLE_HASH: string = '' +const RESUME_ROLE_HASH: string = '' +const STAKING_ROUTER_ROLE_HASH: string = '' +const MODULE_MANAGER_ROLE_HASH: string = '' +const REPORT_EL_REWARDS_STEALING_PENALTY_ROLE_HASH: string = '' +const SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE_HASH: string = '' +const VERIFIER_ROLE_HASH: string = '' +const RECOVERER_ROLE_HASH: string = '' +const ACCOUNTING_MANAGER_ROLE_HASH: string = '' +const MANAGE_BOND_CURVES_ROLE_HASH: string = '' +const SET_BOND_CURVE_ROLE_HASH: string = '' +const RESET_BOND_CURVE_ROLE_HASH: string = '' +const CONTRACT_MANAGER_ROLE_HASH: string = '' +const SUBMIT_DATA_ROLE_HASH: string = '' + export const DeploymentAddresses: DeploymentAddress = { CS_MODULE_ADDRESS: '', CS_ACCOUNTING_ADDRESS: '', @@ -26,6 +44,24 @@ export const DeploymentAddresses: DeploymentAddress = { BURNER_ADDRESS: '', ACCOUNTING_HASH_CONSENSUS_ADDRESS: '', HASH_CONSENSUS_ADDRESS: '', + STAKING_ROUTER_ADDRESS: '', + RolesMap: new Map([ + [DEFAULT_ADMIN_ROLE_HASH, 'DEFAULT ADMIN ROLE'], + [PAUSE_ROLE_HASH, 'PAUSE ROLE'], + [RESUME_ROLE_HASH, 'RESUME ROLE'], + [MODULE_MANAGER_ROLE_HASH, 'MODULE MANAGER ROLE'], + [STAKING_ROUTER_ROLE_HASH, 'STAKING ROUTER ROLE'], + [REPORT_EL_REWARDS_STEALING_PENALTY_ROLE_HASH, 'REPORT EL REWARDS STEALING PENALTY ROLE'], + [SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE_HASH, 'SETTLE EL REWARDS STEALING PENALTY ROLE'], + [VERIFIER_ROLE_HASH, 'VERIFIER ROLE'], + [RECOVERER_ROLE_HASH, 'RECOVERER ROLE'], + [ACCOUNTING_MANAGER_ROLE_HASH, 'ACCOUNTING MANAGER ROLE'], + [MANAGE_BOND_CURVES_ROLE_HASH, 'MANAGE BOND CURVES ROLE'], + [SET_BOND_CURVE_ROLE_HASH, 'SET BOND CURVE ROLE'], + [RESET_BOND_CURVE_ROLE_HASH, 'RESET BOND CURVE ROLE'], + [CONTRACT_MANAGER_ROLE_HASH, 'CONTRACT MANAGER ROLE'], + [SUBMIT_DATA_ROLE_HASH, 'SUBMIT DATA ROLE'], + ]), } export interface Proxy { name: string @@ -45,6 +81,11 @@ export interface PausableContract { functions: Map } +export interface RolesMonitoringContract { + name: string + address: string +} + export const CSM_PROXY_CONTRACTS: Proxy[] = [ { name: 'CSModule', @@ -141,3 +182,26 @@ export const PAUSABLE_CONTRACTS: PausableContract[] = [ ]), }, ] + +export const ROLES_MONITORING_CONTRACTS: RolesMonitoringContract[] = [ + { + name: 'CSModule', + address: DeploymentAddresses.CS_MODULE_ADDRESS, + }, + { + name: 'CSAccounting', + address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, + }, + { + name: 'CSFeeDistributor', + address: DeploymentAddresses.CS_FEE_DISTRIBUTOR_ADDRESS, + }, + { + name: 'CSFeeOracle', + address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, + }, + { + name: 'HashConsensus', + address: DeploymentAddresses.HASH_CONSENSUS_ADDRESS, + }, +] diff --git a/csm-alerts/src/utils/constants.ts b/csm-alerts/src/utils/constants.ts index 8d07b021f..a4453b18a 100644 --- a/csm-alerts/src/utils/constants.ts +++ b/csm-alerts/src/utils/constants.ts @@ -6,3 +6,16 @@ export const ONE_HOUR = 60 * 60 export const ONE_DAY = 24 * ONE_HOUR export const ONE_WEEK = 7 * ONE_DAY export const ONE_MONTH = ONE_WEEK * 4 + +// CSModule.srv thresholds +export const MAX_TARGET_SHARE_PERCENT_USED = 95 +export const MAX_EMPTY_BATCHES_IN_THE_QUEUE = 30 +export const MAX_VALIDATORS_IN_THE_QUEUE = 200 +export const MAX_OPERATORS_WITH_SAME_MANAGER_OR_REWARD_ADDRESS = 3 + +export const BASIS_POINTS_DIVIDER = 100 + +// CSAccountinf.srv thresholds +// ! example values, consider to change +export const AVERAGE_BOND_TRESHOLD = 1000 +export const UNBONDED_KEYS_TRESHOLD = 20 diff --git a/csm-alerts/src/utils/env/env.ts b/csm-alerts/src/utils/env/env.ts index 80f87ecb9..18a73c7b6 100644 --- a/csm-alerts/src/utils/env/env.ts +++ b/csm-alerts/src/utils/env/env.ts @@ -13,6 +13,7 @@ export class Config { public readonly logLevel: string public readonly chainId: number + public readonly csModuleInitBlock: number public readonly promPrefix: string public readonly useFortaProvider: boolean @@ -27,6 +28,7 @@ export class Config { this.logLevel = process.env.LOG_LEVEL || 'info' this.chainId = parseInt(process.env.FORTA_CHAIN_ID!, 10) || 17000 + this.csModuleInitBlock = 1774651 this.ethereumRpcUrl = process.env.ETHEREUM_RPC_URL || 'https://holesky.drpc.org' this.promPrefix = this.appName.replace('-', '_') + '_' diff --git a/csm-alerts/src/utils/events/cs_module_events.ts b/csm-alerts/src/utils/events/cs_module_events.ts new file mode 100644 index 000000000..eddbe98cf --- /dev/null +++ b/csm-alerts/src/utils/events/cs_module_events.ts @@ -0,0 +1,76 @@ +import { EventOfNotice } from '../../entity/events' +import { Result } from '@ethersproject/abi/lib' +import { Finding } from '../../generated/proto/alert_pb' +import { toEthString } from '../string' +import BigNumber from 'bignumber.js' + +export const NODE_OPERATOR_ADDED_EVENT_ABI = + 'event NodeOperatorAdded(uint256 indexed nodeOperatorId, address indexed managerAddress, address indexed rewardAddress)' + +export function getCSModuleEvents(CS_MODULE_ADDRESS: string): EventOfNotice[] { + return [ + { + address: CS_MODULE_ADDRESS, + abi: 'event PublicRelease()', + alertId: 'CS-MODULE-PUBLIC-RELEASE', + name: 'πŸ”΅ CSModule: Public release', + description: () => `Public release is activated on ${CS_MODULE_ADDRESS}`, + severity: Finding.Severity.INFO, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_MODULE_ADDRESS, + abi: 'event VettedSigningKeysCountDecreased(uint256 indexed nodeOperatorId)', + alertId: 'CS-MODULE-VETTED-SIGNING-KEYS-DECREASED', + name: 'πŸ”΅ CSModule: Node Operator vetted signing keys decreased', + description: (args: Result) => `Vetted signing keys decreased for Node Operator #${args.nodeOperatorId}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_MODULE_ADDRESS, + abi: 'event TargetValidatorsCountChanged(uint256 indexed nodeOperatorId, uint256 targetLimitMode, uint256 targetValidatorsCount)', + alertId: 'CS-MODULE-TARGET-LIMIT-MODE-CHANGED', + name: '🟠 CSModule: Target limit mode changed', + description: (args: Result) => + `Target limit mode: ${args.targetLimitMode} (${ + Number(args.targetLimitMode) === 0 + ? 'disabled' + : Number(args.targetLimitMode) === 1 + ? 'soft mode' + : 'forced mode' + })`, + severity: Finding.Severity.MEDIUM, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_MODULE_ADDRESS, + abi: 'event ELRewardsStealingPenaltyReported(uint256 indexed nodeOperatorId, bytes32 proposedBlockHash, uint256 stolenAmount)', + alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-REPORTED', + name: 'πŸ”΄ CSModule: EL Rewards stealing penalty reported', + description: (args: Result) => + `EL Rewards stealing penalty reported for Node Operator #${args.nodeOperatorId} with ${toEthString(BigNumber(Number(args.stolenAmount)))} potentially stolen`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_MODULE_ADDRESS, + abi: 'event ELRewardsStealingPenaltyCancelled(uint256 indexed nodeOperatorId, uint256 amount)', + alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-CANCELLED', + name: 'πŸ”΄ CSModule: EL Rewards stealing penalty cancelled', + description: (args: Result) => + `EL Rewards stealing penalty (${toEthString(args.amount)}) cancelled for Node Operator #${args.nodeOperatorId}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + { + address: CS_MODULE_ADDRESS, + abi: 'event ELRewardsStealingPenaltySettled(uint256 indexed nodeOperatorId)', + alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-SETTLED', + name: 'πŸ”΄ CSModule: EL Rewards stealing penalty settled', + description: (args: Result) => `EL Rewards stealing penalty settled for Node Operator #${args.nodeOperatorId}`, + severity: Finding.Severity.HIGH, + type: Finding.FindingType.INFORMATION, + }, + ] +} diff --git a/csm-alerts/src/utils/events/roles_monitoring_events.ts b/csm-alerts/src/utils/events/roles_monitoring_events.ts new file mode 100644 index 000000000..8ad567da6 --- /dev/null +++ b/csm-alerts/src/utils/events/roles_monitoring_events.ts @@ -0,0 +1,36 @@ +import { EventOfNotice } from '../../entity/events' +import { Finding } from '../../generated/proto/alert_pb' +import { Result } from '@ethersproject/abi/lib' +import { DeploymentAddresses } from '../constants.holesky' + +interface RolesMonitoringContract { + name: string + address: string +} + +export function getRolesMonitoringEvents(ROLES_MONITORING_CONTRACTS: RolesMonitoringContract[]): EventOfNotice[] { + return ROLES_MONITORING_CONTRACTS.flatMap((contractInfo: RolesMonitoringContract) => { + return [ + { + address: contractInfo.address, + abi: 'event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)', + alertId: `ROLE-GRANTED`, + name: `🚨 ${contractInfo.name}: Role granted`, + description: (args: Result) => + `Role ${args.role}(${DeploymentAddresses.RolesMap.get(args.role) || 'unknown'}) was granted to ${args.account} by ${args.sender}`, + severity: Finding.Severity.CRITICAL, + type: Finding.FindingType.INFORMATION, + }, + { + address: contractInfo.address, + abi: 'event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)', + alertId: `ROLE-REVOKED`, + name: `🚨 ${contractInfo.name}: Role revoked`, + description: (args: Result) => + `Role ${args.role}(${DeploymentAddresses.RolesMap.get(args.role) || 'unknown'}) was revoked to ${args.account} by ${args.sender}`, + severity: Finding.Severity.CRITICAL, + type: Finding.FindingType.INFORMATION, + }, + ] + }) +} diff --git a/csm-alerts/src/utils/utils.ts b/csm-alerts/src/utils/utils.ts index 25d6713fe..e1cc0a3c9 100644 --- a/csm-alerts/src/utils/utils.ts +++ b/csm-alerts/src/utils/utils.ts @@ -1,4 +1,5 @@ import { Contract, EventFilter, Event } from 'ethers' +import { Finding } from '../generated/proto/alert_pb' const LOG_FILTER_CHUNK = 2000 @@ -15,3 +16,17 @@ export async function getLogsByChunks(contract: Contract, filter: EventFilter, s } while (endBlockChunk < endBlock) return events } + +export function assertInvariant(condition: boolean, message: string, findings: Finding[]) { + if (condition) { + const f = new Finding() + f.setName('🚨 Assert invariant failed') + f.setDescription(`${message}`) + f.setAlertid('ASSERT-FAILED') + f.setSeverity(Finding.Severity.CRITICAL) + f.setType(Finding.FindingType.INFORMATION) + f.setProtocol('ethereum') + + findings.push(f) + } +} From f445d6d92ba2bf4c21b63291d7b9efc747ccb7fc Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 2 Oct 2024 20:43:42 +0200 Subject: [PATCH 03/45] feat: move to SDKv2 --- csm-alerts/.env.sample | 5 +- csm-alerts/.eslintignore | 1 - csm-alerts/.eslintrc.js | 66 + csm-alerts/.eslintrc.json | 14 - csm-alerts/.gitignore | 15 +- csm-alerts/.nvmrc | 1 + csm-alerts/.prettierignore | 2 +- csm-alerts/Dockerfile | 10 +- csm-alerts/Makefile | 42 - csm-alerts/README.md | 73 +- csm-alerts/alerts.yml | 10 - csm-alerts/alerts_tests.yml | 30 - csm-alerts/package-lock.json | 10501 ---------------- csm-alerts/package.json | 29 +- csm-alerts/src/abis/AssetRecoverer.json | 1 + csm-alerts/src/abis/CSAccounting.json | 1 + csm-alerts/src/abis/CSFeeDistributor.json | 1 + csm-alerts/src/abis/CSFeeOracle.json | 1 + csm-alerts/src/abis/CSModule.json | 1 + csm-alerts/src/abis/HashConsensus.json | 1 + csm-alerts/src/abis/Lido.json | 1 + csm-alerts/src/abis/OssifiableProxy.json | 1 + csm-alerts/src/abis/PausableUntil.json | 1 + csm-alerts/src/abis/StakingRouter.json | 1 + csm-alerts/src/brief/abi/CSAccounting.json | 2293 ---- .../src/brief/abi/CSFeeDistributor.json | 849 -- csm-alerts/src/brief/abi/CSFeeOracle.json | 1397 -- csm-alerts/src/brief/abi/CSModule.json | 2996 ----- csm-alerts/src/brief/abi/HashConsensus.json | 1 - csm-alerts/src/brief/abi/Lido.json | 871 -- csm-alerts/src/brief/abi/ProxyShortABI.json | 28 - csm-alerts/src/brief/abi/StakingRouter.json | 2307 ---- csm-alerts/src/brief/proto/agent.proto | 348 - csm-alerts/src/brief/proto/alert.proto | 179 - csm-alerts/src/clients/eth_provider.ts | 160 - csm-alerts/src/clients/mocks/mock.ts | 5 - csm-alerts/src/config.ts | 7 + csm-alerts/src/entity/events.ts | 114 +- csm-alerts/src/entity/metadata.ts | 1 - csm-alerts/src/handlers/alert.handler.ts | 18 - csm-alerts/src/handlers/block.handler.ts | 103 - csm-alerts/src/handlers/health.handler.ts | 78 - csm-alerts/src/handlers/init.handler.ts | 93 - csm-alerts/src/handlers/tx.handler.ts | 82 - csm-alerts/src/logger.ts | 14 + csm-alerts/src/main.ts | 354 +- .../CSAccounting/CSAccounting.srv.spec.ts | 2 +- .../services/CSAccounting/CSAccounting.srv.ts | 369 +- .../CSFeeDistributor.srv.spec.ts | 2 +- .../CSFeeDistributor/CSFeeDistributor.srv.ts | 409 +- .../CSFeeOracle/CSFeeOracle.srv.spec.ts | 2 +- .../services/CSFeeOracle/CSFeeOracle.srv.ts | 272 +- .../services/CSModule/CSModule.srv.spec.ts | 2 +- .../src/services/CSModule/CSModule.srv.ts | 515 +- .../EventsWatcher.srv.spec.ts} | 2 +- .../EventsWatcher/EventsWatcher.srv.ts | 68 + .../ProxyWatcher.srv.spec.ts.snap | 0 .../EventsWatcher/events/accounting.ts | 46 + .../EventsWatcher/events/assetRecoverer.ts | 78 + .../EventsWatcher/events/distributor.ts | 32 + .../services/EventsWatcher/events/index.ts | 8 + .../services/EventsWatcher/events/module.ts | 82 + .../services/EventsWatcher/events/oracle.ts | 176 + .../services/EventsWatcher/events/pausable.ts | 34 + .../services/EventsWatcher/events/proxies.ts | 42 + .../services/EventsWatcher/events/roles.ts | 32 + .../services/ProxyWatcher/ProxyWatcher.srv.ts | 76 - csm-alerts/src/services/constants.holesky.ts | 28 + csm-alerts/src/services/constants.ts | 41 + .../health-checker/health-checker.srv.spec.ts | 69 - .../health-checker/health-checker.srv.ts | 78 - csm-alerts/src/shared/constants.ts | 11 + csm-alerts/src/shared/roles.ts | 26 + csm-alerts/src/shared/types.ts | 25 + csm-alerts/src/utils/constants.holesky.ts | 207 - csm-alerts/src/utils/constants.mainnet.ts | 207 - csm-alerts/src/utils/constants.ts | 21 - csm-alerts/src/utils/env/env.ts | 45 - csm-alerts/src/utils/epochs.ts | 18 + csm-alerts/src/utils/errors.ts | 54 - .../utils/events/asset_recoverer_events.ts | 81 - .../src/utils/events/cs_accounting_events.ts | 56 - .../utils/events/cs_fee_distributor_events.ts | 26 - .../src/utils/events/cs_fee_oracle_events.ts | 175 - .../src/utils/events/cs_module_events.ts | 76 - .../src/utils/events/mocks/events.mock.ts | 19 - .../src/utils/events/ossified_proxy_events.ts | 55 - .../src/utils/events/pausable_events.ts | 36 - .../utils/events/roles_monitoring_events.ts | 36 - csm-alerts/src/utils/findings.ts | 115 + csm-alerts/src/utils/logs.ts | 22 + csm-alerts/src/utils/mutex.ts | 32 - csm-alerts/src/utils/require.ts | 51 + csm-alerts/src/utils/string.ts | 22 +- csm-alerts/src/utils/time.ts | 42 +- csm-alerts/src/utils/utils.ts | 32 - csm-alerts/src/utils/version.ts | 2 +- csm-alerts/tools/go.mod | 173 - csm-alerts/tools/go.sum | 969 -- csm-alerts/tools/tools.go | 10 - csm-alerts/tsconfig.json | 2 +- csm-alerts/yarn.lock | 2195 ++-- 102 files changed, 3011 insertions(+), 27402 deletions(-) create mode 100644 csm-alerts/.eslintrc.js delete mode 100644 csm-alerts/.eslintrc.json create mode 100644 csm-alerts/.nvmrc delete mode 100644 csm-alerts/Makefile delete mode 100644 csm-alerts/alerts.yml delete mode 100644 csm-alerts/alerts_tests.yml delete mode 100644 csm-alerts/package-lock.json create mode 100644 csm-alerts/src/abis/AssetRecoverer.json create mode 100644 csm-alerts/src/abis/CSAccounting.json create mode 100644 csm-alerts/src/abis/CSFeeDistributor.json create mode 100644 csm-alerts/src/abis/CSFeeOracle.json create mode 100644 csm-alerts/src/abis/CSModule.json create mode 100644 csm-alerts/src/abis/HashConsensus.json create mode 100644 csm-alerts/src/abis/Lido.json create mode 100644 csm-alerts/src/abis/OssifiableProxy.json create mode 100644 csm-alerts/src/abis/PausableUntil.json create mode 100644 csm-alerts/src/abis/StakingRouter.json delete mode 100644 csm-alerts/src/brief/abi/CSAccounting.json delete mode 100644 csm-alerts/src/brief/abi/CSFeeDistributor.json delete mode 100644 csm-alerts/src/brief/abi/CSFeeOracle.json delete mode 100644 csm-alerts/src/brief/abi/CSModule.json delete mode 100644 csm-alerts/src/brief/abi/HashConsensus.json delete mode 100644 csm-alerts/src/brief/abi/Lido.json delete mode 100644 csm-alerts/src/brief/abi/ProxyShortABI.json delete mode 100644 csm-alerts/src/brief/abi/StakingRouter.json delete mode 100644 csm-alerts/src/brief/proto/agent.proto delete mode 100644 csm-alerts/src/brief/proto/alert.proto delete mode 100644 csm-alerts/src/clients/eth_provider.ts delete mode 100644 csm-alerts/src/clients/mocks/mock.ts create mode 100644 csm-alerts/src/config.ts delete mode 100644 csm-alerts/src/entity/metadata.ts delete mode 100644 csm-alerts/src/handlers/alert.handler.ts delete mode 100644 csm-alerts/src/handlers/block.handler.ts delete mode 100644 csm-alerts/src/handlers/health.handler.ts delete mode 100644 csm-alerts/src/handlers/init.handler.ts delete mode 100644 csm-alerts/src/handlers/tx.handler.ts create mode 100644 csm-alerts/src/logger.ts rename csm-alerts/src/services/{ProxyWatcher/ProxyWatcher.srv.spec.ts => EventsWatcher/EventsWatcher.srv.spec.ts} (99%) create mode 100644 csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts rename csm-alerts/src/services/{ProxyWatcher => EventsWatcher}/__snapshots__/ProxyWatcher.srv.spec.ts.snap (100%) create mode 100644 csm-alerts/src/services/EventsWatcher/events/accounting.ts create mode 100644 csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts create mode 100644 csm-alerts/src/services/EventsWatcher/events/distributor.ts create mode 100644 csm-alerts/src/services/EventsWatcher/events/index.ts create mode 100644 csm-alerts/src/services/EventsWatcher/events/module.ts create mode 100644 csm-alerts/src/services/EventsWatcher/events/oracle.ts create mode 100644 csm-alerts/src/services/EventsWatcher/events/pausable.ts create mode 100644 csm-alerts/src/services/EventsWatcher/events/proxies.ts create mode 100644 csm-alerts/src/services/EventsWatcher/events/roles.ts delete mode 100644 csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.ts create mode 100644 csm-alerts/src/services/constants.holesky.ts create mode 100644 csm-alerts/src/services/constants.ts delete mode 100644 csm-alerts/src/services/health-checker/health-checker.srv.spec.ts delete mode 100644 csm-alerts/src/services/health-checker/health-checker.srv.ts create mode 100644 csm-alerts/src/shared/constants.ts create mode 100644 csm-alerts/src/shared/roles.ts create mode 100644 csm-alerts/src/shared/types.ts delete mode 100644 csm-alerts/src/utils/constants.holesky.ts delete mode 100644 csm-alerts/src/utils/constants.mainnet.ts delete mode 100644 csm-alerts/src/utils/constants.ts delete mode 100644 csm-alerts/src/utils/env/env.ts create mode 100644 csm-alerts/src/utils/epochs.ts delete mode 100644 csm-alerts/src/utils/errors.ts delete mode 100644 csm-alerts/src/utils/events/asset_recoverer_events.ts delete mode 100644 csm-alerts/src/utils/events/cs_accounting_events.ts delete mode 100644 csm-alerts/src/utils/events/cs_fee_distributor_events.ts delete mode 100644 csm-alerts/src/utils/events/cs_fee_oracle_events.ts delete mode 100644 csm-alerts/src/utils/events/cs_module_events.ts delete mode 100644 csm-alerts/src/utils/events/mocks/events.mock.ts delete mode 100644 csm-alerts/src/utils/events/ossified_proxy_events.ts delete mode 100644 csm-alerts/src/utils/events/pausable_events.ts delete mode 100644 csm-alerts/src/utils/events/roles_monitoring_events.ts create mode 100644 csm-alerts/src/utils/findings.ts create mode 100644 csm-alerts/src/utils/logs.ts delete mode 100644 csm-alerts/src/utils/mutex.ts create mode 100644 csm-alerts/src/utils/require.ts delete mode 100644 csm-alerts/src/utils/utils.ts delete mode 100644 csm-alerts/tools/go.mod delete mode 100644 csm-alerts/tools/go.sum delete mode 100644 csm-alerts/tools/tools.go diff --git a/csm-alerts/.env.sample b/csm-alerts/.env.sample index e00cc6bad..f51f39f28 100644 --- a/csm-alerts/.env.sample +++ b/csm-alerts/.env.sample @@ -5,9 +5,8 @@ HTTP_PORT=3000 LOG_FORMAT=simple LOG_LEVEL=debug ETHEREUM_RPC_URL=https://holesky.drpc.org -USE_FORTA_RPC_URL=true +FORTA_AGENT_RUN_TIER=testnet ## FORTA compatible env names NODE_ENV=local -AGENT_GRPC_PORT=50051 -FORTA_CHAIN_ID=17000 \ No newline at end of file +FORTA_CHAIN_ID=17000 diff --git a/csm-alerts/.eslintignore b/csm-alerts/.eslintignore index a096acf71..86d4c2dd3 100644 --- a/csm-alerts/.eslintignore +++ b/csm-alerts/.eslintignore @@ -1,2 +1 @@ generated -proto \ No newline at end of file diff --git a/csm-alerts/.eslintrc.js b/csm-alerts/.eslintrc.js new file mode 100644 index 000000000..b676bf52a --- /dev/null +++ b/csm-alerts/.eslintrc.js @@ -0,0 +1,66 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + sourceType: 'module', + }, + settings: { + 'import/resolver': { + typescript: { + project: './tsconfig.json', + }, + }, + }, + plugins: ['@typescript-eslint', 'prettier', 'import'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + 'plugin:import/recommended', + 'plugin:import/typescript', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-empty-interface': 'off', + 'sort-imports': [ + 'error', + { + ignoreCase: false, + ignoreDeclarationSort: true, // don't want to sort import lines, use eslint-plugin-import instead + ignoreMemberSort: false, + memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'], + allowSeparatedGroups: true, + }, + ], + 'import/no-unresolved': 'error', + 'import/order': [ + 'error', + { + groups: [ + 'builtin', // Built-in imports (come from NodeJS native) go first + 'external', // <- External imports + 'internal', // <- Absolute imports + ['sibling', 'parent'], // <- Relative imports, the sibling and parent types they can be mingled together + 'index', // <- index imports + 'unknown', // <- unknown + ], + 'newlines-between': 'always', + alphabetize: { + /* sort in ascending order. Options: ["ignore", "asc", "desc"] */ + order: 'asc', + /* ignore case. Options: [true, false] */ + caseInsensitive: true, + }, + }, + ], + }, +} diff --git a/csm-alerts/.eslintrc.json b/csm-alerts/.eslintrc.json deleted file mode 100644 index 1262ce136..000000000 --- a/csm-alerts/.eslintrc.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"], - "plugins": ["@typescript-eslint", "prettier"], - "env": { - "node": true, - "es6": true - }, - "rules": { - "prettier/prettier": "error", - "curly": "error", - "semi": "off" - } -} diff --git a/csm-alerts/.gitignore b/csm-alerts/.gitignore index 1d4d3cc06..79c91b531 100644 --- a/csm-alerts/.gitignore +++ b/csm-alerts/.gitignore @@ -1,15 +1,12 @@ node_modules + dist -forta.config.json generated -.yarn/* -!.yarn/releases/ -*.log + +forta.config.json version.json -.DS_Store -/coverage/ -tools/vendor -bin +.direnv +.env -.env \ No newline at end of file +.DS_Store diff --git a/csm-alerts/.nvmrc b/csm-alerts/.nvmrc new file mode 100644 index 000000000..790e1105f --- /dev/null +++ b/csm-alerts/.nvmrc @@ -0,0 +1 @@ +v20.10.0 diff --git a/csm-alerts/.prettierignore b/csm-alerts/.prettierignore index a096acf71..59c99e669 100644 --- a/csm-alerts/.prettierignore +++ b/csm-alerts/.prettierignore @@ -1,2 +1,2 @@ generated -proto \ No newline at end of file +abis diff --git a/csm-alerts/Dockerfile b/csm-alerts/Dockerfile index aaec8f0e0..8a7338a9e 100644 --- a/csm-alerts/Dockerfile +++ b/csm-alerts/Dockerfile @@ -1,7 +1,7 @@ # Build stage: compile Typescript to Javascript FROM node:20.10.0-alpine3.18 AS base -RUN apk add --no-cache python3=3.11.8-r0 g++=12.2.1_git20220924-r10 make=4.4.1-r1 +RUN apk add --no-cache tini==0.19.0-r1 FROM base AS builder @@ -16,14 +16,9 @@ LABEL "network.forta.settings.agent-logs.enable"="true" ENV APP_NAME=csm-alerts ENV NODE_ENV=production -ENV ETHEREUM_RPC_URL=https://holesky.drpc.org -ENV AGENT_GRPC_PORT=50051 -ENV HTTP_PORT=3000 ENV LOG_FORMAT=simple ENV LOG_LEVEL=info -ENV INSTANCE=forta -ENV USE_FORTA_RPC_URL=true WORKDIR /app @@ -32,4 +27,5 @@ COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/dist ./src COPY version.json ./ -CMD ["yarn", "run", "start:docker:prod"] \ No newline at end of file +ENTRYPOINT ["/sbin/tini", "--"] +CMD ["yarn", "run", "start:docker:prod"] diff --git a/csm-alerts/Makefile b/csm-alerts/Makefile deleted file mode 100644 index 8b12e9335..000000000 --- a/csm-alerts/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -# Makefile - -.PHONY: gen_proto_prod -gen_proto_prod: - # generate js codes via grpc-tools - yarn grpc_tools_node_protoc \ - --js_out=import_style=commonjs,binary:./dist/generated/proto \ - --grpc_out=grpc_js:./dist/generated/proto \ - --plugin=protoc-gen-grpc=./node_modules/.bin/grpc_tools_node_protoc_plugin \ - -I ./src/brief/proto \ - ./src/brief/proto/*.proto - -.PHONY: gen_js -gen_js: - # generate js codes via grpc-tools - yarn grpc_tools_node_protoc \ - --js_out=import_style=commonjs,binary:./src/generated/proto \ - --grpc_out=grpc_js:./src/generated/proto \ - --plugin=protoc-gen-grpc=./node_modules/.bin/grpc_tools_node_protoc_plugin \ - --proto_path=./src/brief/proto \ - ./src/brief/proto/*.proto - -.PHONY: gen_ts -gen_ts: - # generate d.ts codes - yarn grpc_tools_node_protoc \ - --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts \ - --ts_out=grpc_js:./src/generated/proto \ - --proto_path=./src/brief/proto \ - ./src/brief/proto/*.proto - -tools: - cd tools && go mod tidy && go mod vendor && go mod verify && go generate -tags tools -.PHONY: tools - -.PHONY: check_alerts_syntax -check_alerts_syntax: - ./bin/promtool check rules ./alerts.yml - -.PHONY: test_alerts -test_alerts: - bin/promtool test rules ./alerts_tests.yml \ No newline at end of file diff --git a/csm-alerts/README.md b/csm-alerts/README.md index ee0d36309..aa6b33d6a 100644 --- a/csm-alerts/README.md +++ b/csm-alerts/README.md @@ -10,13 +10,12 @@ 1. General 1. πŸ”΄ HIGH: EL rewards stealing penalty reported/settled/cancelled for an operator. 2. 🟠 MEDIUM: targetLimitMode was set for an operator. - 3. 🟒 LOW: More than 3 operators have the same manager or reward address. - 4. 🟒 LOW: Module's share is close to the targetShare. - 5. 🟒 LOW: More than N "empty" batches in the queue. (N = 30) - 6. 🟒 LOW: More than N validators in the queue. (N = 200) - 7. πŸ”΅ INFO: Operator X was unvetted. - 8. πŸ”΅ INFO: Public release is activated. - 9. πŸ”΅ INFO: Every 100 new operators created (69th as well). + 3. 🟒 LOW: Module's share is close to the targetShare. + 4. 🟒 LOW: More than N "empty" batches in the queue. (N = 30) + 5. 🟒 LOW: More than N validators in the queue. (N = 200) + 6. πŸ”΅ INFO: Operator X was unvetted. + 7. πŸ”΅ INFO: Public release is activated. + 8. πŸ”΅ INFO: Every 100 new operators created (69th as well). 2. Roles monitoring 1. 🚨 CRITICAL: role change: DEFAULT_ADMIN_ROLE 2. 🚨 CRITICAL: role change: PAUSE_ROLE @@ -30,9 +29,8 @@ 2. **CSAccounting** 1. General 1. 🟒 LOW: Average bond value for a validator is below some threshold. - 2. 🟒 LOW: Node operator has X unbonded validators since last block. - 3. 🟒 LOW: Total bond lock more than some value. - 4. 🟒 LOW: sharesOf(CSAccounting.address) - CSBondCoreStorage.totalBondShares > 100 wei + 2. 🟒 LOW: Total bond lock more than some value. + 3. 🟒 LOW: sharesOf(CSAccounting.address) - CSBondCoreStorage.totalBondShares > 0.1 ether 2. Events monitoring 1. 🚨 CRITICAL: ChargePenaltyRecipientSet(address chargeRecipient) 2. 🚨 CRITICAL: BondCurveUpdated(uint256 indexed curveId, uint256[] bondCurve) @@ -54,11 +52,9 @@ 2. πŸ”΄ HIGH: PerfLeewaySet(uint256 valueBP) 3. πŸ”΄ HIGH: FeeDistributorContractSet(address feeDistributorContract) 4. πŸ”΄ HIGH: ConsensusVersionSet(uint256 indexed version, uint256 indexed prevVersion) - 5. πŸ”΄ HIGH: report overdue (expect consensus every 28 days) - 6. πŸ”΄ HIGH: WarnProcessingMissed(uint256 indexed refSlot) - 7. πŸ”΅ INFO: ReportSubmitted(uint256 indexed refSlot, bytes32 hash, uint256 processingDeadlineTime) - 8. πŸ”΅ INFO: ProcessingStarted(uint256 indexed refSlot, bytes32 hash) - 9. πŸ”΅ INFO: ReportSettled(uint256 indexed refSlot, uint256 distributed, bytes32 treeRoot, string treeCid) + 5. πŸ”΅ INFO: WarnProcessingMissed(uint256 indexed refSlot) + 6. πŸ”΅ INFO: ReportSubmitted(uint256 indexed refSlot, bytes32 hash, uint256 processingDeadlineTime) + 7. πŸ”΅ INFO: ProcessingStarted(uint256 indexed refSlot, bytes32 hash) 2. Roles monitoring 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE 2. 🚨 CRITICAL: CONTRACT_MANAGER_ROLE @@ -85,19 +81,17 @@ 5. 🚨 CRITICAL: MANAGE_FAST_LANE_CONFIG_ROLE 6. 🚨 CRITICAL: MANAGE_REPORT_PROCESSOR_ROLE 4. **CSFeeDistributor** - 1. Alerting for failed transactions - 1. 🚨 CRITICAL: transaction reverted with InvalidShares -> CSFeeOracle reports incorrect amount of shares to distribute. - 2. 🚨 CRITICAL: transaction reverted with NotEnoughShares -> CSFeeDistributor internal accounting error. - 3. 🚨 CRITICAL: transaction reverted with InvalidTreeRoot or InvalidTreeCID -> CSFeeOracle built incorrect report. - 2. Events monitoring + + 1. Events monitoring 1. 🚨 CRITICAL: Receiver of TransferShares is NOT CSAccounting, if from is CSFeeDistributor 2. πŸ”΄ HIGH: No fees distributed for X days (repeat every 1 day). 3. πŸ”΅ INFO: DistributionDataUpdated -> Oracle settled a new report. - 3. Roles monitoring + 2. Roles monitoring 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE 2. 🚨 CRITICAL: RECOVERER_ROLE 5. **CSEarlyAdoption** + - _To be added_ 6. **OssifiableProxy** @@ -111,31 +105,30 @@ 1. 🚨 CRITICAL: event ProxyOssified() 2. 🚨 CRITICAL: event Upgraded(address indexed implementation) 3. 🚨 CRITICAL: event AdminChanged(address previousAdmin, address newAdmin) - 4. 🚨 CRITICAL: event BeaconUpgraded(address indexed beacon) 7. **PausableUntil** - For the following contracts: + For the following contracts: - - CSModule - - CSAccounting - - CSFeeOracle + - CSModule + - CSAccounting + - CSFeeOracle - 1. 🚨 CRITICAL: Paused(uint256 duration); - 2. 🚨 CRITICAL: Resumed(); + 1. 🚨 CRITICAL: Paused(uint256 duration); + 2. 🚨 CRITICAL: Resumed(); 8. **AssetRecoverer** - For the following contracts: - - - CSModule - - CSAccounting - - CSFeeOracle - - CSFeeDistributor - - 1. πŸ”΄ HIGH: EtherRecovered() - 2. πŸ”΄ HIGH: ERC20Recovered() - 3. πŸ”΄ HIGH: StETHSharesRecovered() - 4. πŸ”΄ HIGH: ERC721Recovered() - 5. πŸ”΄ HIGH: ERC1155Recovered() + For the following contracts: + + - CSModule + - CSAccounting + - CSFeeOracle + - CSFeeDistributor + + 1. πŸ”΄ HIGH: EtherRecovered() + 2. πŸ”΄ HIGH: ERC20Recovered() + 3. πŸ”΄ HIGH: StETHSharesRecovered() + 4. πŸ”΄ HIGH: ERC721Recovered() + 5. πŸ”΄ HIGH: ERC1155Recovered() ## Development (Forta specific) diff --git a/csm-alerts/alerts.yml b/csm-alerts/alerts.yml deleted file mode 100644 index bd5dd09bb..000000000 --- a/csm-alerts/alerts.yml +++ /dev/null @@ -1,10 +0,0 @@ -groups: - - name: CSMGroup - rules: - - alert: TooMuchNetworkErrors - expr: increase(csm_alerts_network_errors_total[15m]) >= 25 - labels: - severity: critical - annotations: - summary: "CSM bot has detected {{ $value }} network errors in the last 15 minutes" - description: "The csm_alerts_network_errors_total {{ $value }} in the last 15 minutes." diff --git a/csm-alerts/alerts_tests.yml b/csm-alerts/alerts_tests.yml deleted file mode 100644 index 28fb0f83d..000000000 --- a/csm-alerts/alerts_tests.yml +++ /dev/null @@ -1,30 +0,0 @@ -rule_files: - - alerts.yml - -tests: - - interval: 5m - input_series: - - series: 'csm_network_errors_total{}' - values: '100 110 120 125 130 165' - alert_rule_test: - - alertname: TooMuchNetworkErrors - eval_time: 15m - exp_alerts: - - exp_labels: - severity: critical - exp_annotations: - summary: "CSM bot has detected 25 network errors in the last 15 minutes" - description: "The csm_network_errors_total 25 in the last 15 minutes." - - - alertname: TooMuchNetworkErrors - eval_time: 20m - exp_alerts: [ ] - - - alertname: TooMuchNetworkErrors - eval_time: 25m - exp_alerts: - - exp_labels: - severity: critical - exp_annotations: - summary: "CSM bot has detected 45 network errors in the last 15 minutes" - description: "The csm_network_errors_total 45 in the last 15 minutes." diff --git a/csm-alerts/package-lock.json b/csm-alerts/package-lock.json deleted file mode 100644 index 3acadf8c7..000000000 --- a/csm-alerts/package-lock.json +++ /dev/null @@ -1,10501 +0,0 @@ -{ - "name": "lido-csm-bot", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "lido-csm-bot", - "version": "1.0.0", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "@fortanetwork/forta-bot": "^0.2.3", - "@grpc/grpc-js": "^1.10.2", - "@types/lodash": "^4.14.202", - "@types/node": "^20.14.2", - "async-mutex": "^0.4.0", - "bignumber.js": "^9.1.2", - "dotenv": "^16.4.5", - "ethers": "^5.7.2", - "express": "^4.19.2", - "forta-agent": "^0.1.48", - "fp-ts": "^2.16.1", - "knex": "^3.1.0", - "lodash": "^4.17.21", - "prom-client": "^15.1.2", - "ts-retry": "^4.2.4", - "winston": "^3.11.0" - }, - "devDependencies": { - "@faker-js/faker": "^8.3.1", - "@jest/globals": "^29.7.0", - "@tsconfig/node20": "^20.1.4", - "@typechain/ethers-v5": "^11.1.2", - "@types/express": "^4.17.21", - "@types/jest": "^29.5.11", - "@types/nodemon": "^1.19.0", - "@types/ws": "^8.5.10", - "@typescript-eslint/eslint-plugin": "^6.12.0", - "@typescript-eslint/parser": "^6.12.0", - "eslint": "^8.54.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-jest": "^27.6.0", - "eslint-plugin-prettier": "^5.0.1", - "grpc_tools_node_protoc_ts": "^5.3.3", - "grpc-tools": "^1.12.4", - "husky": "^8.0.3", - "jest": "^29.7.0", - "nodemon": "^3.0.1", - "postinstall": "^0.8.0", - "prettier": "^3.1.0", - "ts-generator": "^0.1.1", - "ts-jest": "^29.1.2", - "ts-node": "^10.9.2", - "typechain": "^8.3.2", - "typescript": "^5.3.2" - } - }, - "node_modules/@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helpers": "^7.24.8", - "@babel/parser": "^7.24.8", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.24.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.8", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.24.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.8", - "dev": true, - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.24.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "license": "MIT", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@danieldietrich/copy": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@danieldietrich/copy/-/copy-0.4.2.tgz", - "integrity": "sha512-ZVNZIrgb2KeomfNahP77rL445ho6aQj0HHqU6hNlQ61o4rhvca+NS+ePj0d82zQDq2UPk1mjVZBTXgP+ErsDgw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/danieldietrich" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT" - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "node_modules/@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@faker-js/faker": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", - "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } - ], - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=6.14.13" - } - }, - "node_modules/@fortanetwork/forta-bot": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@fortanetwork/forta-bot/-/forta-bot-0.2.3.tgz", - "integrity": "sha512-kGPAYZFyAFzB9IvZ+jn6OQ3+ASDeKWEyL1Ltzi8wNL57kfVF+C+WiKXhDk77BA1GwP8qyYBRztCxF73k8kA7vQ==", - "dependencies": { - "awilix": "^9.0.0", - "axios": "^1.6.2", - "base64-arraybuffer": "^1.0.2", - "ethers": "^6.9.0", - "flat-cache": "^3.2.0", - "jsonc": "^2.0.0", - "lodash": "^4.17.21", - "lru-cache": "^10.2.0", - "murmurhash3js": "^3.0.1", - "sha3": "^2.1.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@fortanetwork/forta-bot/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - }, - "node_modules/@fortanetwork/forta-bot/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - }, - "node_modules/@fortanetwork/forta-bot/node_modules/awilix": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/awilix/-/awilix-9.0.0.tgz", - "integrity": "sha512-DVhdT1sbCCjGBvJbNKJaPSh+JVvgzUV0Rbdq3r3/MqxDgm7e/zs8aAhWI8O8nFNFvUYFtJPqWsFldyzC2rpMnA==", - "dependencies": { - "camel-case": "^4.1.2", - "fast-glob": "^3.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@fortanetwork/forta-bot/node_modules/ethers": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.1.tgz", - "integrity": "sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.17.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@fortanetwork/forta-bot/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/@fortanetwork/forta-bot/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@fortanetwork/forta-bot/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.10.11", - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node20": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz", - "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typechain/ethers-v5": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-11.1.2.tgz", - "integrity": "sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "ethers": "^5.1.3", - "typechain": "^8.3.2", - "typescript": ">=4.3.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.6", - "license": "MIT" - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.14.10", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/nodemon": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/nodemon/-/nodemon-1.19.6.tgz", - "integrity": "sha512-vjKuaQOLUA5EY2zkUmWG1ipXbKt9Wd+H/0SiIuHVeH4cHtt6509iRUGH9ZR0iqgUrtj3BrP9KqoTuV3ZCbQcYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.5.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "license": "MIT" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "license": "MIT" - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "license": "MIT" - }, - "node_modules/async-mutex": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz", - "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "license": "MIT", - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/awilix": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/awilix/-/awilix-4.3.4.tgz", - "integrity": "sha512-NgRwUPxUnoK+OTRa2fXcRQVFPOPQXlwCN1FJPkhO3IHKQJHokhdVpDfgz9L3VZTcA1iSaOFE3N/Q/5P7lIDqig==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "glob": "^7.1.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "license": "MIT" - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bintrees": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", - "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==", - "license": "MIT" - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "license": "MIT", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", - "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", - "license": "ISC", - "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/browserify-sign/node_modules/elliptic": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/browserify-sign/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "license": "MIT" - }, - "node_modules/browserslist": { - "version": "4.23.2", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001640", - "electron-to-chromium": "^1.4.820", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001641", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "license": "MIT" - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/command-line-usage/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-usage/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/command-line-usage/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/command-line-usage/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/command-line-usage/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "license": "MIT" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "license": "MIT" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.827", - "dev": true, - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "license": "MIT" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "27.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", - "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", - "eslint": "^7.0.0 || ^8.0.0", - "jest": "*" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-jest/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-plugin-jest/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "license": "ISC" - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forta-agent": { - "version": "0.1.48", - "resolved": "https://registry.npmjs.org/forta-agent/-/forta-agent-0.1.48.tgz", - "integrity": "sha512-fk3mar7/Avqg/4OHFmgv01ww/azr1XM+g5KcSnwvNxZy3KDMi7aFp1jAjPCsBjs8ZyVcR03ITUlbtFpRVgZB4Q==", - "license": "MIT", - "dependencies": { - "@grpc/grpc-js": "^1.3.6", - "@grpc/proto-loader": "^0.6.4", - "@types/uuid": "^8.3.4", - "async-retry": "^1.3.3", - "awilix": "^4.3.4", - "axios": "^1.6.2", - "base64-arraybuffer": "^1.0.2", - "ethers": "^5.5.1", - "flat-cache": "^3.0.4", - "form-data": "^4.0.0", - "jsonc": "^2.0.0", - "keythereum": "^1.2.0", - "lodash": "^4.17.21", - "murmurhash3js": "^3.0.1", - "n-readlines": "^1.0.1", - "prompts": "^2.4.1", - "python-shell": "^3.0.0", - "sha3": "^2.1.4", - "shelljs": "^0.8.4", - "uuid": "^8.3.2", - "yargs": "^17.0.1" - }, - "bin": { - "forta-agent": "dist/cli/index.js" - } - }, - "node_modules/forta-agent/node_modules/@grpc/proto-loader": { - "version": "0.6.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", - "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", - "license": "Apache-2.0", - "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.11.3", - "yargs": "^16.2.0" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/forta-agent/node_modules/@grpc/proto-loader/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/forta-agent/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/forta-agent/node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "license": "Apache-2.0" - }, - "node_modules/forta-agent/node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/forta-agent/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fp-ts": { - "version": "2.16.8", - "license": "MIT" - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/getopts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", - "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", - "license": "MIT" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/google-protobuf": { - "version": "3.15.8", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.15.8.tgz", - "integrity": "sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/grpc_tools_node_protoc_ts": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", - "integrity": "sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww==", - "dev": true, - "license": "MIT", - "dependencies": { - "google-protobuf": "3.15.8", - "handlebars": "4.7.7" - }, - "bin": { - "protoc-gen-ts": "bin/protoc-gen-ts" - } - }, - "node_modules/grpc-tools": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", - "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.5" - }, - "bin": { - "grpc_tools_node_protoc": "bin/protoc.js", - "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" - } - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", - "dev": true, - "license": "MIT", - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true, - "license": "ISC" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.14.0", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jake": { - "version": "10.9.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jake/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", - "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==", - "license": "MIT", - "dependencies": { - "fast-safe-stringify": "^2.0.6", - "graceful-fs": "^4.1.15", - "mkdirp": "^0.5.1", - "parse-json": "^4.0.0", - "strip-bom": "^4.0.0", - "strip-json-comments": "^3.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsonc/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/keythereum": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/keythereum/-/keythereum-1.2.0.tgz", - "integrity": "sha512-u3XnjIruOmjIvJ4tH1Wdr2y0X8+z8BZTQ+dqJuDMyLvNWw6VnH9XKtt0yauSE+96Bq97h6CPm4w5LbW3i28x0g==", - "license": "MIT", - "dependencies": { - "crypto-browserify": "3.12.0", - "keccak": "3.0.1", - "scrypt-js": "3.0.1", - "secp256k1": "4.0.2", - "sjcl": "1.0.6", - "uuid": "3.0.0" - } - }, - "node_modules/keythereum/node_modules/uuid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz", - "integrity": "sha512-rqE1LoOVLv3QrZMjb4NkF5UWlkurCfPyItVnFPNKDDGkHw4dQUdE4zMcLqx28+0Kcf3+bnUk4PisaiRJT4aiaQ==", - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/knex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz", - "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==", - "license": "MIT", - "dependencies": { - "colorette": "2.0.19", - "commander": "^10.0.0", - "debug": "4.3.4", - "escalade": "^3.1.1", - "esm": "^3.2.25", - "get-package-type": "^0.1.0", - "getopts": "2.3.0", - "interpret": "^2.2.0", - "lodash": "^4.17.21", - "pg-connection-string": "2.6.2", - "rechoir": "^0.8.0", - "resolve-from": "^5.0.0", - "tarn": "^3.0.2", - "tildify": "2.0.0" - }, - "bin": { - "knex": "bin/cli.js" - }, - "engines": { - "node": ">=16" - }, - "peerDependenciesMeta": { - "better-sqlite3": { - "optional": true - }, - "mysql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } - } - }, - "node_modules/knex/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/knex/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/logform": { - "version": "2.6.1", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", - "license": "Apache-2.0" - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "license": "MIT" - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/murmurhash3js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/murmurhash3js/-/murmurhash3js-3.0.1.tgz", - "integrity": "sha512-KL8QYUaxq7kUbcl0Yto51rMcYt7E/4N4BG3/c96Iqw1PQrTRspu8Cpx4TZ4Nunib1d4bEkIH3gjCYlP2RLBdow==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/n-readlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/n-readlines/-/n-readlines-1.0.1.tgz", - "integrity": "sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ==", - "license": "MIT", - "engines": { - "node": ">=6.x.x" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "license": "MIT" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", - "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true, - "license": "MIT" - }, - "node_modules/nodemon": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/nodemon/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nodemon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", - "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", - "license": "ISC", - "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "hash-base": "~3.0", - "pbkdf2": "^3.1.2", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "license": "MIT", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postinstall": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/postinstall/-/postinstall-0.8.0.tgz", - "integrity": "sha512-onh5cnUw4ue+iBzwoyHZNfih1iopqm5abfc/0vK/A9QyYVPxCbLW0DxwrRpHFZ2/Fs5Uo7j4TiaVDNWriq0HIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@danieldietrich/copy": "^0.4.2", - "glob": "^8.0.3", - "minimist": "^1.2.6", - "resolve-from": "^5.0.0", - "resolve-pkg": "^2.0.0" - }, - "bin": { - "postinstall": "bin/postinstall.js" - } - }, - "node_modules/postinstall/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/postinstall/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postinstall/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/prom-client": { - "version": "15.1.3", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.4.0", - "tdigest": "^0.1.1" - }, - "engines": { - "node": "^16 || ^18 || >=20" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/protobufjs": { - "version": "7.3.2", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/python-shell": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/python-shell/-/python-shell-3.0.1.tgz", - "integrity": "sha512-TWeotuxe1auhXa5bGRScxnc2J+0r41NBntSa6RYZtMBLtAEsvCboKrEbW6DvASosWQepVkhZZlT3B5Ei766G+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", - "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "license": "MIT" - }, - "node_modules/secp256k1": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", - "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "license": "ISC" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/sha3": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", - "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", - "license": "MIT", - "dependencies": { - "buffer": "6.0.3" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "license": "BSD-3-Clause", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shelljs/node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/shelljs/node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/sjcl": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/sjcl/-/sjcl-1.0.6.tgz", - "integrity": "sha512-oUVs+hzMSWEZ3rdeDL461QilvvEU2OL9q6T42lpVi2C5Proej9obVZ1nQeY9T96NxoMy/dqw82m33MfNNEmYJg==", - "engines": { - "node": "*" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true, - "license": "WTFPL OR MIT" - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/tarn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/tdigest": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", - "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", - "license": "MIT", - "dependencies": { - "bintrees": "1.0.2" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tildify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", - "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "license": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-command-line-args": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", - "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", - "dev": true, - "license": "ISC", - "dependencies": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" - }, - "bin": { - "write-markdown": "dist/write-markdown.js" - } - }, - "node_modules/ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": ">=3.7.0" - } - }, - "node_modules/ts-generator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz", - "integrity": "sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mkdirp": "^0.5.2", - "@types/prettier": "^2.1.1", - "@types/resolve": "^0.0.8", - "chalk": "^2.4.1", - "glob": "^7.1.2", - "mkdirp": "^0.5.1", - "prettier": "^2.1.2", - "resolve": "^1.8.1", - "ts-essentials": "^1.0.0" - }, - "bin": { - "ts-generator": "dist/cli/run.js" - } - }, - "node_modules/ts-generator/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ts-generator/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ts-generator/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ts-generator/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ts-generator/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ts-generator/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ts-generator/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/ts-generator/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ts-generator/node_modules/ts-essentials": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz", - "integrity": "sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/ts-jest": { - "version": "29.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "0.x", - "ejs": "^3.0.0", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-retry": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/ts-retry/-/ts-retry-4.2.5.tgz", - "integrity": "sha512-dFBa4pxMBkt/bjzdBio8EwYfbAdycEAwe0KZgzlUKKwU9Wr1WErK7Hg9QLqJuDDYJXTW4KYZyXAyqYKOdO/ehA==", - "license": "MIT" - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typechain": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", - "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prettier": "^2.1.1", - "debug": "^4.3.1", - "fs-extra": "^7.0.0", - "glob": "7.1.7", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "mkdirp": "^1.0.4", - "prettier": "^2.3.1", - "ts-command-line-args": "^2.2.0", - "ts-essentials": "^7.0.1" - }, - "bin": { - "typechain": "dist/cli/cli.js" - }, - "peerDependencies": { - "typescript": ">=4.3.0" - } - }, - "node_modules/typechain/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/typechain/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typechain/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/typechain/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/typechain/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/typescript": { - "version": "5.5.3", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.0", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/winston": { - "version": "3.13.1", - "license": "MIT", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.6.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.7.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.7.1", - "license": "MIT", - "dependencies": { - "logform": "^2.6.1", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/winston/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "license": "MIT", - "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/csm-alerts/package.json b/csm-alerts/package.json index f63198550..48de6e211 100644 --- a/csm-alerts/package.json +++ b/csm-alerts/package.json @@ -8,6 +8,7 @@ }, "license": "MIT", "chainIds": [ + 1, 17000 ], "husky": { @@ -17,36 +18,36 @@ }, "scripts": { "update-version": "node ../utils/write-version.js", - "build": "tsc && mkdir dist/generated/proto && make gen_proto_prod", + "build": "tsc", "copy-version": "cp version.json dist", "start": "ts-node src/main.ts", "start:prod": "node dist/main.js", "start:docker:prod": "node src/main.js", + "range": "forta-bot run --range", + "block": "forta-bot run --block", + "tx": "forta-bot run --tx", "push": "yarn run update-version && forta-agent push", "test": "jest", - "generate-types": "typechain --target=ethers-v5 --out-dir=./src/generated/typechain ./src/brief/abi/*", - "generate-proto": "make gen_ts && make gen_js", + "generate-types": "typechain --target=ethers-v6 --out-dir=./src/generated/typechain ./src/abis/*", "eslint:lint": "eslint ./src", "eslint:format": "eslint ./src --fix", "prettier:check": "prettier --check ./src", "prettier:format": "prettier --write ./src README.md", "lint": "yarn run prettier:check && yarn run eslint:lint", "format": "yarn run eslint:format && yarn run prettier:format", - "postinstall": "yarn generate-types && yarn generate-proto" + "postinstall": "yarn generate-types" }, "dependencies": { "@ethersproject/abi": "^5.0.0", "@ethersproject/providers": "^5.0.0", "@fortanetwork/forta-bot": "^0.2.3", - "@grpc/grpc-js": "^1.10.2", "@types/lodash": "^4.14.202", "@types/node": "^20.14.2", "async-mutex": "^0.4.0", "bignumber.js": "^9.1.2", "dotenv": "^16.4.5", - "ethers": "^5.7.2", + "ethers": "^6.9.0", "express": "^4.19.2", - "forta-agent": "^0.1.48", "fp-ts": "^2.16.1", "knex": "^3.1.0", "lodash": "^4.17.21", @@ -56,21 +57,23 @@ }, "devDependencies": { "@faker-js/faker": "^8.3.1", + "@fortanetwork/forta-bot-cli": "^0.2.4", "@jest/globals": "^29.7.0", "@tsconfig/node20": "^20.1.4", - "@typechain/ethers-v5": "^11.1.2", + "@typechain/ethers-v6": "^0.5.1", "@types/express": "^4.17.21", "@types/jest": "^29.5.11", "@types/nodemon": "^1.19.0", "@types/ws": "^8.5.10", - "@typescript-eslint/eslint-plugin": "^6.12.0", - "@typescript-eslint/parser": "^6.12.0", + "@typescript-eslint/eslint-plugin": "^8.7.0", + "@typescript-eslint/parser": "^8.7.0", "eslint": "^8.54.0", "eslint-config-prettier": "^9.0.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-jest": "^27.6.0", "eslint-plugin-prettier": "^5.0.1", - "grpc_tools_node_protoc_ts": "^5.3.3", - "grpc-tools": "^1.12.4", + "eslint_d": "^14.0.4", "husky": "^8.0.3", "jest": "^29.7.0", "nodemon": "^3.0.1", @@ -80,7 +83,7 @@ "ts-jest": "^29.1.2", "ts-node": "^10.9.2", "typechain": "^8.3.2", - "typescript": "^5.3.2" + "typescript": "~5.5.2" }, "packageManager": "yarn@1.22.22" } diff --git a/csm-alerts/src/abis/AssetRecoverer.json b/csm-alerts/src/abis/AssetRecoverer.json new file mode 100644 index 000000000..c28cc58e4 --- /dev/null +++ b/csm-alerts/src/abis/AssetRecoverer.json @@ -0,0 +1 @@ +[{"type":"event","name":"ERC1155Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC20Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC721Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EtherRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"StETHSharesRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"AddressInsufficientBalance","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"FailedToSendEther","inputs":[]},{"type":"error","name":"SafeERC20FailedOperation","inputs":[{"name":"token","type":"address","internalType":"address"}]}] diff --git a/csm-alerts/src/abis/CSAccounting.json b/csm-alerts/src/abis/CSAccounting.json new file mode 100644 index 000000000..998b45a72 --- /dev/null +++ b/csm-alerts/src/abis/CSAccounting.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"address","name":"lidoLocator","type":"address"},{"internalType":"address","name":"communityStakingModule","type":"address"},{"internalType":"uint256","name":"maxCurveLength","type":"uint256"},{"internalType":"uint256","name":"minBondLockRetentionPeriod","type":"uint256"},{"internalType":"uint256","name":"maxBondLockRetentionPeriod","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ElRewardsVaultReceiveFailed","type":"error"},{"inputs":[],"name":"FailedToSendEther","type":"error"},{"inputs":[],"name":"InvalidBondCurveId","type":"error"},{"inputs":[],"name":"InvalidBondCurveLength","type":"error"},{"inputs":[],"name":"InvalidBondCurveMaxLength","type":"error"},{"inputs":[],"name":"InvalidBondCurveValues","type":"error"},{"inputs":[],"name":"InvalidBondLockAmount","type":"error"},{"inputs":[],"name":"InvalidBondLockRetentionPeriod","type":"error"},{"inputs":[],"name":"InvalidInitialisationCurveId","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NodeOperatorDoesNotExist","type":"error"},{"inputs":[],"name":"NotAllowedToRecover","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"NothingToClaim","type":"error"},{"inputs":[],"name":"PauseUntilMustBeInFuture","type":"error"},{"inputs":[],"name":"PausedExpected","type":"error"},{"inputs":[],"name":"ResumedExpected","type":"error"},{"inputs":[{"internalType":"uint8","name":"bits","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"SafeCastOverflowedUintDowncast","type":"error"},{"inputs":[],"name":"SenderIsNotCSM","type":"error"},{"inputs":[],"name":"ZeroAdminAddress","type":"error"},{"inputs":[],"name":"ZeroChargePenaltyRecipientAddress","type":"error"},{"inputs":[],"name":"ZeroFeeDistributorAddress","type":"error"},{"inputs":[],"name":"ZeroLocatorAddress","type":"error"},{"inputs":[],"name":"ZeroModuleAddress","type":"error"},{"inputs":[],"name":"ZeroPauseDuration","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toBurnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnedAmount","type":"uint256"}],"name":"BondBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChargeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"chargedAmount","type":"uint256"}],"name":"BondCharged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondClaimedStETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"BondClaimedUnstETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondClaimedWstETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"bondCurve","type":"uint256[]"}],"name":"BondCurveAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"BondCurveSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"bondCurve","type":"uint256[]"}],"name":"BondCurveUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondDepositedETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondDepositedStETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondDepositedWstETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"retentionUntil","type":"uint256"}],"name":"BondLockChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondLockCompensated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"BondLockRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"retentionPeriod","type":"uint256"}],"name":"BondLockRetentionPeriodChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"chargePenaltyRecipient","type":"address"}],"name":"ChargePenaltyRecipientSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC1155Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"ERC721Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EtherRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Resumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"StETHSharesRecovered","type":"event"},{"inputs":[],"name":"ACCOUNTING_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CSM","outputs":[{"internalType":"contract ICSModule","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_BOND_CURVE_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIDO","outputs":[{"internalType":"contract ILido","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIDO_LOCATOR","outputs":[{"internalType":"contract ILidoLocator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_BOND_CURVES_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BOND_LOCK_RETENTION_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CURVE_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BOND_LOCK_RETENTION_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_CURVE_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_INFINITELY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RECOVERER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESET_BOND_CURVE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESUME_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_BOND_CURVE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWAL_QUEUE","outputs":[{"internalType":"contract IWithdrawalQueue","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WSTETH","outputs":[{"internalType":"contract IWstETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"bondCurve","type":"uint256[]"}],"name":"addBondCurve","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"chargeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chargePenaltyRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"stETHAmount","type":"uint256"},{"internalType":"address","name":"rewardAddress","type":"address"},{"internalType":"uint256","name":"cumulativeFeeShares","type":"uint256"},{"internalType":"bytes32[]","name":"rewardsProof","type":"bytes32[]"}],"name":"claimRewardsStETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"stEthAmount","type":"uint256"},{"internalType":"address","name":"rewardAddress","type":"address"},{"internalType":"uint256","name":"cumulativeFeeShares","type":"uint256"},{"internalType":"bytes32[]","name":"rewardsProof","type":"bytes32[]"}],"name":"claimRewardsUnstETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"wstETHAmount","type":"uint256"},{"internalType":"address","name":"rewardAddress","type":"address"},{"internalType":"uint256","name":"cumulativeFeeShares","type":"uint256"},{"internalType":"bytes32[]","name":"rewardsProof","type":"bytes32[]"}],"name":"claimRewardsWstETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"compensateLockedBondETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"depositETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"stETHAmount","type":"uint256"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ICSAccounting.PermitInput","name":"permit","type":"tuple"}],"name":"depositStETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"wstETHAmount","type":"uint256"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ICSAccounting.PermitInput","name":"permit","type":"tuple"}],"name":"depositWstETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDistributor","outputs":[{"internalType":"contract ICSFeeDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"getActualLockedBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"getBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"keys","type":"uint256"},{"components":[{"internalType":"uint256[]","name":"points","type":"uint256[]"},{"internalType":"uint256","name":"trend","type":"uint256"}],"internalType":"struct ICSBondCurve.BondCurve","name":"curve","type":"tuple"}],"name":"getBondAmountByKeysCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"keys","type":"uint256"},{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getBondAmountByKeysCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"keysCount","type":"uint256"},{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getBondAmountByKeysCountWstETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"keysCount","type":"uint256"},{"components":[{"internalType":"uint256[]","name":"points","type":"uint256[]"},{"internalType":"uint256","name":"trend","type":"uint256"}],"internalType":"struct ICSBondCurve.BondCurve","name":"curve","type":"tuple"}],"name":"getBondAmountByKeysCountWstETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"getBondCurve","outputs":[{"components":[{"internalType":"uint256[]","name":"points","type":"uint256[]"},{"internalType":"uint256","name":"trend","type":"uint256"}],"internalType":"struct ICSBondCurve.BondCurve","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"getBondCurveId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBondLockRetentionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"getBondShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"getBondSummary","outputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"getBondSummaryShares","outputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getCurveInfo","outputs":[{"components":[{"internalType":"uint256[]","name":"points","type":"uint256[]"},{"internalType":"uint256","name":"trend","type":"uint256"}],"internalType":"struct ICSBondCurve.BondCurve","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"uint256[]","name":"points","type":"uint256[]"},{"internalType":"uint256","name":"trend","type":"uint256"}],"internalType":"struct ICSBondCurve.BondCurve","name":"curve","type":"tuple"}],"name":"getKeysCountByBondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getKeysCountByBondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"getLockedBondInfo","outputs":[{"components":[{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint128","name":"retentionUntil","type":"uint128"}],"internalType":"struct ICSBondLock.BondLock","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"additionalKeys","type":"uint256"}],"name":"getRequiredBondForNextKeys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"additionalKeys","type":"uint256"}],"name":"getRequiredBondForNextKeysWstETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getResumeSinceTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"getUnbondedKeysCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"getUnbondedKeysCountToEject","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"bondCurve","type":"uint256[]"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"_feeDistributor","type":"address"},{"internalType":"uint256","name":"bondLockRetentionPeriod","type":"uint256"},{"internalType":"address","name":"_chargePenaltyRecipient","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lockBondETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"pauseFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"penalize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"cumulativeFeeShares","type":"uint256"},{"internalType":"bytes32[]","name":"rewardsProof","type":"bytes32[]"}],"name":"pullFeeRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"recoverERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"recoverERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverStETHShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"releaseLockedBondETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renewBurnerAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"resetBondCurve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"setBondCurve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_chargePenaltyRecipient","type":"address"}],"name":"setChargePenaltyRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"retention","type":"uint256"}],"name":"setLockedBondRetentionPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"}],"name":"settleLockedBondETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBondShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"internalType":"uint256[]","name":"bondCurve","type":"uint256[]"}],"name":"updateBondCurve","outputs":[],"stateMutability":"nonpayable","type":"function"}] diff --git a/csm-alerts/src/abis/CSFeeDistributor.json b/csm-alerts/src/abis/CSFeeDistributor.json new file mode 100644 index 000000000..2c06383fb --- /dev/null +++ b/csm-alerts/src/abis/CSFeeDistributor.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"stETH","type":"address","internalType":"address"},{"name":"accounting","type":"address","internalType":"address"},{"name":"oracle","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"ACCOUNTING","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"ORACLE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"RECOVERER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"STETH","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IStETH"}],"stateMutability":"view"},{"type":"function","name":"distributeFees","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"sharesToDistribute","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"distributedShares","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getFeesToDistribute","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"sharesToDistribute","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"hashLeaf","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"pure"},{"type":"function","name":"initialize","inputs":[{"name":"admin","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"logCid","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"pendingSharesToDistribute","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"processOracleReport","inputs":[{"name":"_treeRoot","type":"bytes32","internalType":"bytes32"},{"name":"_treeCid","type":"string","internalType":"string"},{"name":"_logCid","type":"string","internalType":"string"},{"name":"distributed","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC1155","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC20","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC721","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverEther","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"totalClaimableShares","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"treeCid","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"treeRoot","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"event","name":"DistributionDataUpdated","inputs":[{"name":"totalClaimableShares","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"treeRoot","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"treeCid","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"DistributionLogUpdated","inputs":[{"name":"logCid","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"ERC1155Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC20Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC721Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EtherRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"FeeDistributed","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StETHSharesRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"FailedToSendEther","inputs":[]},{"type":"error","name":"FeeSharesDecrease","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"InvalidLogCID","inputs":[]},{"type":"error","name":"InvalidProof","inputs":[]},{"type":"error","name":"InvalidShares","inputs":[]},{"type":"error","name":"InvalidTreeCID","inputs":[]},{"type":"error","name":"InvalidTreeRoot","inputs":[]},{"type":"error","name":"NotAccounting","inputs":[]},{"type":"error","name":"NotAllowedToRecover","inputs":[]},{"type":"error","name":"NotEnoughShares","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"NotOracle","inputs":[]},{"type":"error","name":"ZeroAccountingAddress","inputs":[]},{"type":"error","name":"ZeroAdminAddress","inputs":[]},{"type":"error","name":"ZeroOracleAddress","inputs":[]},{"type":"error","name":"ZeroStEthAddress","inputs":[]}] diff --git a/csm-alerts/src/abis/CSFeeOracle.json b/csm-alerts/src/abis/CSFeeOracle.json new file mode 100644 index 000000000..053a5ca50 --- /dev/null +++ b/csm-alerts/src/abis/CSFeeOracle.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"secondsPerSlot","type":"uint256","internalType":"uint256"},{"name":"genesisTime","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"CONTRACT_MANAGER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"GENESIS_TIME","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_CONSENSUS_CONTRACT_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_CONSENSUS_VERSION_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_INFINITELY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RECOVERER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RESUME_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"SECONDS_PER_SLOT","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"SUBMIT_DATA_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"avgPerfLeewayBP","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"discardConsensusReport","inputs":[{"name":"refSlot","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"feeDistributor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSFeeDistributor"}],"stateMutability":"view"},{"type":"function","name":"getConsensusContract","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getConsensusReport","inputs":[],"outputs":[{"name":"hash","type":"bytes32","internalType":"bytes32"},{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"processingDeadlineTime","type":"uint256","internalType":"uint256"},{"name":"processingStarted","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getConsensusVersion","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getContractVersion","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getLastProcessingRefSlot","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getResumeSinceTimestamp","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"admin","type":"address","internalType":"address"},{"name":"feeDistributorContract","type":"address","internalType":"address"},{"name":"consensusContract","type":"address","internalType":"address"},{"name":"consensusVersion","type":"uint256","internalType":"uint256"},{"name":"_avgPerfLeewayBP","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isPaused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"pauseFor","inputs":[{"name":"duration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pauseUntil","inputs":[{"name":"pauseUntilInclusive","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC1155","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC20","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC721","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverEther","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setConsensusContract","inputs":[{"name":"addr","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setConsensusVersion","inputs":[{"name":"version","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFeeDistributorContract","inputs":[{"name":"feeDistributorContract","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setPerformanceLeeway","inputs":[{"name":"valueBP","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"submitConsensusReport","inputs":[{"name":"reportHash","type":"bytes32","internalType":"bytes32"},{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"submitReportData","inputs":[{"name":"data","type":"tuple","internalType":"struct CSFeeOracle.ReportData","components":[{"name":"consensusVersion","type":"uint256","internalType":"uint256"},{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"treeRoot","type":"bytes32","internalType":"bytes32"},{"name":"treeCid","type":"string","internalType":"string"},{"name":"logCid","type":"string","internalType":"string"},{"name":"distributed","type":"uint256","internalType":"uint256"}]},{"name":"contractVersion","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"ConsensusHashContractSet","inputs":[{"name":"addr","type":"address","indexed":true,"internalType":"address"},{"name":"prevAddr","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ConsensusVersionSet","inputs":[{"name":"version","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"prevVersion","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ContractVersionSet","inputs":[{"name":"version","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC1155Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC20Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC721Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EtherRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"FeeDistributorContractSet","inputs":[{"name":"feeDistributorContract","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"duration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"PerfLeewaySet","inputs":[{"name":"valueBP","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ProcessingStarted","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"hash","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"ReportDiscarded","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"hash","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"ReportSubmitted","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"hash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"processingDeadlineTime","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Resumed","inputs":[],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StETHSharesRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"WarnProcessingMissed","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AddressCannotBeSame","inputs":[]},{"type":"error","name":"AddressCannotBeZero","inputs":[]},{"type":"error","name":"FailedToSendEther","inputs":[]},{"type":"error","name":"HashCannotBeZero","inputs":[]},{"type":"error","name":"InitialRefSlotCannotBeLessThanProcessingOne","inputs":[{"name":"initialRefSlot","type":"uint256","internalType":"uint256"},{"name":"processingRefSlot","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidContractVersion","inputs":[]},{"type":"error","name":"InvalidContractVersionIncrement","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"InvalidPerfLeeway","inputs":[]},{"type":"error","name":"NoConsensusReportToProcess","inputs":[]},{"type":"error","name":"NonZeroContractVersionOnInit","inputs":[]},{"type":"error","name":"NotAllowedToRecover","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"PauseUntilMustBeInFuture","inputs":[]},{"type":"error","name":"PausedExpected","inputs":[]},{"type":"error","name":"ProcessingDeadlineMissed","inputs":[{"name":"deadline","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"RefSlotAlreadyProcessing","inputs":[]},{"type":"error","name":"RefSlotCannotDecrease","inputs":[{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"prevRefSlot","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"RefSlotMustBeGreaterThanProcessingOne","inputs":[{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"processingRefSlot","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ResumedExpected","inputs":[]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"SecondsPerSlotCannotBeZero","inputs":[]},{"type":"error","name":"SenderIsNotTheConsensusContract","inputs":[]},{"type":"error","name":"SenderNotAllowed","inputs":[]},{"type":"error","name":"UnexpectedChainConfig","inputs":[]},{"type":"error","name":"UnexpectedConsensusVersion","inputs":[{"name":"expectedVersion","type":"uint256","internalType":"uint256"},{"name":"receivedVersion","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnexpectedContractVersion","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"received","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnexpectedDataHash","inputs":[{"name":"consensusHash","type":"bytes32","internalType":"bytes32"},{"name":"receivedHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"UnexpectedRefSlot","inputs":[{"name":"consensusRefSlot","type":"uint256","internalType":"uint256"},{"name":"dataRefSlot","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"VersionCannotBeSame","inputs":[]},{"type":"error","name":"VersionCannotBeZero","inputs":[]},{"type":"error","name":"ZeroAdminAddress","inputs":[]},{"type":"error","name":"ZeroFeeDistributorAddress","inputs":[]},{"type":"error","name":"ZeroPauseDuration","inputs":[]}] diff --git a/csm-alerts/src/abis/CSModule.json b/csm-alerts/src/abis/CSModule.json new file mode 100644 index 000000000..02d08254c --- /dev/null +++ b/csm-alerts/src/abis/CSModule.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"moduleType","type":"bytes32","internalType":"bytes32"},{"name":"minSlashingPenaltyQuotient","type":"uint256","internalType":"uint256"},{"name":"elRewardsStealingFine","type":"uint256","internalType":"uint256"},{"name":"maxKeysPerOperatorEA","type":"uint256","internalType":"uint256"},{"name":"maxKeyRemovalCharge","type":"uint256","internalType":"uint256"},{"name":"lidoLocator","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"EL_REWARDS_STEALING_FINE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"INITIAL_SLASHING_PENALTY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"LIDO_LOCATOR","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ILidoLocator"}],"stateMutability":"view"},{"type":"function","name":"MAX_KEY_REMOVAL_CHARGE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_SIGNING_KEYS_PER_OPERATOR_BEFORE_PUBLIC_RELEASE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MODULE_MANAGER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_INFINITELY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RECOVERER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"REPORT_EL_REWARDS_STEALING_PENALTY_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RESUME_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"STAKING_ROUTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"STETH","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IStETH"}],"stateMutability":"view"},{"type":"function","name":"VERIFIER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"accounting","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSAccounting"}],"stateMutability":"view"},{"type":"function","name":"activatePublicRelease","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addNodeOperatorETH","inputs":[{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"managementProperties","type":"tuple","internalType":"struct NodeOperatorManagementProperties","components":[{"name":"managerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"}]},{"name":"eaProof","type":"bytes32[]","internalType":"bytes32[]"},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"addNodeOperatorStETH","inputs":[{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"managementProperties","type":"tuple","internalType":"struct NodeOperatorManagementProperties","components":[{"name":"managerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"}]},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"name":"eaProof","type":"bytes32[]","internalType":"bytes32[]"},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addNodeOperatorWstETH","inputs":[{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"managementProperties","type":"tuple","internalType":"struct NodeOperatorManagementProperties","components":[{"name":"managerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"}]},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"name":"eaProof","type":"bytes32[]","internalType":"bytes32[]"},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addValidatorKeysETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"addValidatorKeysStETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addValidatorKeysWstETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"cancelELRewardsStealingPenalty","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"changeNodeOperatorRewardAddress","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"newAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimRewardsStETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"stETHAmount","type":"uint256","internalType":"uint256"},{"name":"cumulativeFeeShares","type":"uint256","internalType":"uint256"},{"name":"rewardsProof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimRewardsUnstETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"stEthAmount","type":"uint256","internalType":"uint256"},{"name":"cumulativeFeeShares","type":"uint256","internalType":"uint256"},{"name":"rewardsProof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimRewardsWstETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"wstETHAmount","type":"uint256","internalType":"uint256"},{"name":"cumulativeFeeShares","type":"uint256","internalType":"uint256"},{"name":"rewardsProof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"cleanDepositQueue","inputs":[{"name":"maxItems","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"removed","type":"uint256","internalType":"uint256"},{"name":"lastRemovedAtDepth","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"compensateELRewardsStealingPenalty","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"confirmNodeOperatorManagerAddressChange","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"confirmNodeOperatorRewardAddressChange","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"decreaseVettedSigningKeysCount","inputs":[{"name":"nodeOperatorIds","type":"bytes","internalType":"bytes"},{"name":"vettedSigningKeysCounts","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"depositETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"depositQueue","inputs":[],"outputs":[{"name":"head","type":"uint128","internalType":"uint128"},{"name":"tail","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"type":"function","name":"depositQueueItem","inputs":[{"name":"index","type":"uint128","internalType":"uint128"}],"outputs":[{"name":"","type":"uint256","internalType":"Batch"}],"stateMutability":"view"},{"type":"function","name":"depositStETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"stETHAmount","type":"uint256","internalType":"uint256"},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"depositWstETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"wstETHAmount","type":"uint256","internalType":"uint256"},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"earlyAdoption","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSEarlyAdoption"}],"stateMutability":"view"},{"type":"function","name":"getActiveNodeOperatorsCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getNodeOperator","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct NodeOperator","components":[{"name":"totalAddedKeys","type":"uint32","internalType":"uint32"},{"name":"totalWithdrawnKeys","type":"uint32","internalType":"uint32"},{"name":"totalDepositedKeys","type":"uint32","internalType":"uint32"},{"name":"totalVettedKeys","type":"uint32","internalType":"uint32"},{"name":"stuckValidatorsCount","type":"uint32","internalType":"uint32"},{"name":"depositableValidatorsCount","type":"uint32","internalType":"uint32"},{"name":"targetLimit","type":"uint32","internalType":"uint32"},{"name":"targetLimitMode","type":"uint8","internalType":"uint8"},{"name":"totalExitedKeys","type":"uint32","internalType":"uint32"},{"name":"enqueuedCount","type":"uint32","internalType":"uint32"},{"name":"managerAddress","type":"address","internalType":"address"},{"name":"proposedManagerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"proposedRewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"}]}],"stateMutability":"view"},{"type":"function","name":"getNodeOperatorIds","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"nodeOperatorIds","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getNodeOperatorIsActive","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getNodeOperatorNonWithdrawnKeys","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getNodeOperatorSummary","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"targetLimitMode","type":"uint256","internalType":"uint256"},{"name":"targetValidatorsCount","type":"uint256","internalType":"uint256"},{"name":"stuckValidatorsCount","type":"uint256","internalType":"uint256"},{"name":"refundedValidatorsCount","type":"uint256","internalType":"uint256"},{"name":"stuckPenaltyEndTimestamp","type":"uint256","internalType":"uint256"},{"name":"totalExitedValidators","type":"uint256","internalType":"uint256"},{"name":"totalDepositedValidators","type":"uint256","internalType":"uint256"},{"name":"depositableValidatorsCount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getNodeOperatorsCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getNonce","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getResumeSinceTimestamp","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getSigningKeys","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"startIndex","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getSigningKeysWithSignatures","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"startIndex","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"keys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getStakingModuleSummary","inputs":[],"outputs":[{"name":"totalExitedValidators","type":"uint256","internalType":"uint256"},{"name":"totalDepositedValidators","type":"uint256","internalType":"uint256"},{"name":"depositableValidatorsCount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getType","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_accounting","type":"address","internalType":"address"},{"name":"_earlyAdoption","type":"address","internalType":"address"},{"name":"_keyRemovalCharge","type":"uint256","internalType":"uint256"},{"name":"admin","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isPaused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isValidatorSlashed","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndex","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isValidatorWithdrawn","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndex","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"keyRemovalCharge","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"normalizeQueue","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"obtainDepositData","inputs":[{"name":"depositsCount","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"type":"function","name":"onExitedAndStuckValidatorsCountsUpdated","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"onRewardsMinted","inputs":[{"name":"totalShares","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"onWithdrawalCredentialsChanged","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pauseFor","inputs":[{"name":"duration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"proposeNodeOperatorManagerAddressChange","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"proposedAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"proposeNodeOperatorRewardAddressChange","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"proposedAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"publicRelease","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"recoverERC1155","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC20","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC721","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverEther","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeKeys","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"startIndex","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"reportELRewardsStealingPenalty","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"blockHash","type":"bytes32","internalType":"bytes32"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resetNodeOperatorManagerAddress","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setKeyRemovalCharge","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"settleELRewardsStealingPenalty","inputs":[{"name":"nodeOperatorIds","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"submitInitialSlashing","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndex","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"submitWithdrawal","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndex","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"isSlashed","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"unsafeUpdateValidatorsCount","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"exitedValidatorsKeysCount","type":"uint256","internalType":"uint256"},{"name":"stuckValidatorsKeysCount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateExitedValidatorsCount","inputs":[{"name":"nodeOperatorIds","type":"bytes","internalType":"bytes"},{"name":"exitedValidatorsCounts","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateRefundedValidatorsCount","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateStuckValidatorsCount","inputs":[{"name":"nodeOperatorIds","type":"bytes","internalType":"bytes"},{"name":"stuckValidatorsCounts","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateTargetValidatorsLimits","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"targetLimitMode","type":"uint256","internalType":"uint256"},{"name":"targetLimit","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"BatchEnqueued","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"count","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"DepositableSigningKeysCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"depositableKeysCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"DepositedSigningKeysCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"depositedKeysCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ELRewardsStealingPenaltyCancelled","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ELRewardsStealingPenaltyCompensated","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ELRewardsStealingPenaltyReported","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"proposedBlockHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"stolenAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ELRewardsStealingPenaltySettled","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC1155Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC20Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC721Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EtherRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ExitedSigningKeysCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"exitedKeysCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"InitialSlashingSubmitted","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"keyIndex","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"pubkey","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"KeyRemovalChargeApplied","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"KeyRemovalChargeSet","inputs":[{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"NodeOperatorAdded","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"managerAddress","type":"address","indexed":true,"internalType":"address"},{"name":"rewardAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NodeOperatorManagerAddressChangeProposed","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldProposedAddress","type":"address","indexed":true,"internalType":"address"},{"name":"newProposedAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NodeOperatorManagerAddressChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldAddress","type":"address","indexed":true,"internalType":"address"},{"name":"newAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NodeOperatorRewardAddressChangeProposed","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldProposedAddress","type":"address","indexed":true,"internalType":"address"},{"name":"newProposedAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NodeOperatorRewardAddressChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldAddress","type":"address","indexed":true,"internalType":"address"},{"name":"newAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NonceChanged","inputs":[{"name":"nonce","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"duration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"PublicRelease","inputs":[],"anonymous":false},{"type":"event","name":"ReferrerSet","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"referrer","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Resumed","inputs":[],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SigningKeyAdded","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"pubkey","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"SigningKeyRemoved","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"pubkey","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"StETHSharesRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"StuckSigningKeysCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"stuckKeysCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TargetValidatorsCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"targetLimitMode","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"targetValidatorsCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TotalSigningKeysCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"totalKeysCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"VettedSigningKeysCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"vettedKeysCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"VettedSigningKeysCountDecreased","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"WithdrawalSubmitted","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"keyIndex","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"pubkey","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AlreadyActivated","inputs":[]},{"type":"error","name":"AlreadyProposed","inputs":[]},{"type":"error","name":"AlreadySubmitted","inputs":[]},{"type":"error","name":"EmptyKey","inputs":[]},{"type":"error","name":"ExitedKeysDecrease","inputs":[]},{"type":"error","name":"ExitedKeysHigherThanTotalDeposited","inputs":[]},{"type":"error","name":"FailedToSendEther","inputs":[]},{"type":"error","name":"InvalidAmount","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"InvalidInput","inputs":[]},{"type":"error","name":"InvalidKeysCount","inputs":[]},{"type":"error","name":"InvalidLength","inputs":[]},{"type":"error","name":"InvalidReportData","inputs":[]},{"type":"error","name":"InvalidVetKeysPointer","inputs":[]},{"type":"error","name":"MaxSigningKeysCountExceeded","inputs":[]},{"type":"error","name":"MethodCallIsNotAllowed","inputs":[]},{"type":"error","name":"NodeOperatorDoesNotExist","inputs":[]},{"type":"error","name":"NotAllowedToJoinYet","inputs":[]},{"type":"error","name":"NotAllowedToRecover","inputs":[]},{"type":"error","name":"NotEnoughKeys","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"NotSupported","inputs":[]},{"type":"error","name":"PauseUntilMustBeInFuture","inputs":[]},{"type":"error","name":"PausedExpected","inputs":[]},{"type":"error","name":"QueueIsEmpty","inputs":[]},{"type":"error","name":"QueueLookupNoLimit","inputs":[]},{"type":"error","name":"ResumedExpected","inputs":[]},{"type":"error","name":"SameAddress","inputs":[]},{"type":"error","name":"SenderIsNotEligible","inputs":[]},{"type":"error","name":"SenderIsNotManagerAddress","inputs":[]},{"type":"error","name":"SenderIsNotProposedAddress","inputs":[]},{"type":"error","name":"SenderIsNotRewardAddress","inputs":[]},{"type":"error","name":"SigningKeysInvalidOffset","inputs":[]},{"type":"error","name":"StuckKeysHigherThanNonExited","inputs":[]},{"type":"error","name":"ZeroAccountingAddress","inputs":[]},{"type":"error","name":"ZeroAdminAddress","inputs":[]},{"type":"error","name":"ZeroLocatorAddress","inputs":[]},{"type":"error","name":"ZeroPauseDuration","inputs":[]},{"type":"error","name":"ZeroRewardAddress","inputs":[]}] diff --git a/csm-alerts/src/abis/HashConsensus.json b/csm-alerts/src/abis/HashConsensus.json new file mode 100644 index 000000000..bb18bbdca --- /dev/null +++ b/csm-alerts/src/abis/HashConsensus.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"slotsPerEpoch","type":"uint256","internalType":"uint256"},{"name":"secondsPerSlot","type":"uint256","internalType":"uint256"},{"name":"genesisTime","type":"uint256","internalType":"uint256"},{"name":"epochsPerFrame","type":"uint256","internalType":"uint256"},{"name":"fastLaneLengthSlots","type":"uint256","internalType":"uint256"},{"name":"admin","type":"address","internalType":"address"},{"name":"reportProcessor","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"DISABLE_CONSENSUS_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_FAST_LANE_CONFIG_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_FRAME_CONFIG_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_MEMBERS_AND_QUORUM_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_REPORT_PROCESSOR_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addMember","inputs":[{"name":"addr","type":"address","internalType":"address"},{"name":"quorum","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"disableConsensus","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getChainConfig","inputs":[],"outputs":[{"name":"slotsPerEpoch","type":"uint256","internalType":"uint256"},{"name":"secondsPerSlot","type":"uint256","internalType":"uint256"},{"name":"genesisTime","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[],"outputs":[{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"consensusReport","type":"bytes32","internalType":"bytes32"},{"name":"isReportProcessing","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getConsensusStateForMember","inputs":[{"name":"addr","type":"address","internalType":"address"}],"outputs":[{"name":"result","type":"tuple","internalType":"struct HashConsensus.MemberConsensusState","components":[{"name":"currentFrameRefSlot","type":"uint256","internalType":"uint256"},{"name":"currentFrameConsensusReport","type":"bytes32","internalType":"bytes32"},{"name":"isMember","type":"bool","internalType":"bool"},{"name":"isFastLane","type":"bool","internalType":"bool"},{"name":"canReport","type":"bool","internalType":"bool"},{"name":"lastMemberReportRefSlot","type":"uint256","internalType":"uint256"},{"name":"currentFrameMemberReport","type":"bytes32","internalType":"bytes32"}]}],"stateMutability":"view"},{"type":"function","name":"getCurrentFrame","inputs":[],"outputs":[{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"reportProcessingDeadlineSlot","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getFastLaneMembers","inputs":[],"outputs":[{"name":"addresses","type":"address[]","internalType":"address[]"},{"name":"lastReportedRefSlots","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getFrameConfig","inputs":[],"outputs":[{"name":"initialEpoch","type":"uint256","internalType":"uint256"},{"name":"epochsPerFrame","type":"uint256","internalType":"uint256"},{"name":"fastLaneLengthSlots","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getInitialRefSlot","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getIsFastLaneMember","inputs":[{"name":"addr","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getIsMember","inputs":[{"name":"addr","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getMembers","inputs":[],"outputs":[{"name":"addresses","type":"address[]","internalType":"address[]"},{"name":"lastReportedRefSlots","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getQuorum","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getReportProcessor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getReportVariants","inputs":[],"outputs":[{"name":"variants","type":"bytes32[]","internalType":"bytes32[]"},{"name":"support","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"removeMember","inputs":[{"name":"addr","type":"address","internalType":"address"},{"name":"quorum","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFastLaneLengthSlots","inputs":[{"name":"fastLaneLengthSlots","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFrameConfig","inputs":[{"name":"epochsPerFrame","type":"uint256","internalType":"uint256"},{"name":"fastLaneLengthSlots","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setQuorum","inputs":[{"name":"quorum","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setReportProcessor","inputs":[{"name":"newProcessor","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"submitReport","inputs":[{"name":"slot","type":"uint256","internalType":"uint256"},{"name":"report","type":"bytes32","internalType":"bytes32"},{"name":"consensusVersion","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateInitialEpoch","inputs":[{"name":"initialEpoch","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"ConsensusLost","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ConsensusReached","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"report","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"support","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"FastLaneConfigSet","inputs":[{"name":"fastLaneLengthSlots","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"FrameConfigSet","inputs":[{"name":"newInitialEpoch","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newEpochsPerFrame","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"MemberAdded","inputs":[{"name":"addr","type":"address","indexed":true,"internalType":"address"},{"name":"newTotalMembers","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newQuorum","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"MemberRemoved","inputs":[{"name":"addr","type":"address","indexed":true,"internalType":"address"},{"name":"newTotalMembers","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newQuorum","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"QuorumSet","inputs":[{"name":"newQuorum","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"totalMembers","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"prevQuorum","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ReportProcessorSet","inputs":[{"name":"processor","type":"address","indexed":true,"internalType":"address"},{"name":"prevProcessor","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ReportReceived","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"member","type":"address","indexed":true,"internalType":"address"},{"name":"report","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AddressCannotBeZero","inputs":[]},{"type":"error","name":"AdminCannotBeZero","inputs":[]},{"type":"error","name":"ConsensusReportAlreadyProcessing","inputs":[]},{"type":"error","name":"DuplicateMember","inputs":[]},{"type":"error","name":"DuplicateReport","inputs":[]},{"type":"error","name":"EmptyReport","inputs":[]},{"type":"error","name":"EpochsPerFrameCannotBeZero","inputs":[]},{"type":"error","name":"FastLanePeriodCannotBeLongerThanFrame","inputs":[]},{"type":"error","name":"InitialEpochAlreadyArrived","inputs":[]},{"type":"error","name":"InitialEpochIsYetToArrive","inputs":[]},{"type":"error","name":"InitialEpochRefSlotCannotBeEarlierThanProcessingSlot","inputs":[]},{"type":"error","name":"InvalidChainConfig","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"InvalidSlot","inputs":[]},{"type":"error","name":"NewProcessorCannotBeTheSame","inputs":[]},{"type":"error","name":"NonFastLaneMemberCannotReportWithinFastLaneInterval","inputs":[]},{"type":"error","name":"NonMember","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"NumericOverflow","inputs":[]},{"type":"error","name":"QuorumTooSmall","inputs":[{"name":"minQuorum","type":"uint256","internalType":"uint256"},{"name":"receivedQuorum","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ReportProcessorCannotBeZero","inputs":[]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"StaleReport","inputs":[]},{"type":"error","name":"UnexpectedConsensusVersion","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"received","type":"uint256","internalType":"uint256"}]}] diff --git a/csm-alerts/src/abis/Lido.json b/csm-alerts/src/abis/Lido.json new file mode 100644 index 000000000..7253754a9 --- /dev/null +++ b/csm-alerts/src/abis/Lido.json @@ -0,0 +1 @@ +[{"constant":false,"inputs":[],"name":"resume","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pureis:issue is:open ","type":"function"},{"constant":false,"inputs":[],"name":"stop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hasInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"STAKING_CONTROL_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_ethAmount","type":"uint256"}],"name":"getSharesByPooledEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isStakingPaused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sender","type":"address"},{"name":"_recipient","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_script","type":"bytes"}],"name":"getEVMScriptExecutor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maxStakeLimit","type":"uint256"},{"name":"_stakeLimitIncreasePerBlock","type":"uint256"}],"name":"setStakingLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"RESUME_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_lidoLocator","type":"address"},{"name":"_eip712StETH","type":"address"}],"name":"finalizeUpgrade_v2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getRecoveryVault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalPooledEther","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newDepositedValidators","type":"uint256"}],"name":"unsafeChangeDepositedValidators","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PAUSE_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTreasury","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isStopped","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBufferedEther","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_lidoLocator","type":"address"},{"name":"_eip712StETH","type":"address"}],"name":"initialize","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"receiveELRewards","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getWithdrawalCredentials","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentStakeLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStakeLimitFullInfo","outputs":[{"name":"isStakingPaused","type":"bool"},{"name":"isStakingLimitSet","type":"bool"},{"name":"currentStakeLimit","type":"uint256"},{"name":"maxStakeLimit","type":"uint256"},{"name":"maxStakeLimitGrowthBlocks","type":"uint256"},{"name":"prevStakeLimit","type":"uint256"},{"name":"prevStakeBlockNumber","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sender","type":"address"},{"name":"_recipient","type":"address"},{"name":"_sharesAmount","type":"uint256"}],"name":"transferSharesFrom","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"resumeStaking","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getFeeDistribution","outputs":[{"name":"treasuryFeeBasisPoints","type":"uint16"},{"name":"insuranceFeeBasisPoints","type":"uint16"},{"name":"operatorsFeeBasisPoints","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"receiveWithdrawals","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_sharesAmount","type":"uint256"}],"name":"getPooledEthByShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"allowRecoverability","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"nonces","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"appId","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"eip712Domain","outputs":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getContractVersion","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInitializationBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"},{"name":"_sharesAmount","type":"uint256"}],"name":"transferShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getEIP712StETH","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"","type":"address"}],"name":"transferToVault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_sender","type":"address"},{"name":"_role","type":"bytes32"},{"name":"_params","type":"uint256[]"}],"name":"canPerform","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_referral","type":"address"}],"name":"submit","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getEVMScriptRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_maxDepositsCount","type":"uint256"},{"name":"_stakingModuleId","type":"uint256"},{"name":"_depositCalldata","type":"bytes"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"UNSAFE_CHANGE_DEPOSITED_VALIDATORS_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBeaconStat","outputs":[{"name":"depositedValidators","type":"uint256"},{"name":"beaconValidators","type":"uint256"},{"name":"beaconBalance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"removeStakingLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_reportTimestamp","type":"uint256"},{"name":"_timeElapsed","type":"uint256"},{"name":"_clValidators","type":"uint256"},{"name":"_clBalance","type":"uint256"},{"name":"_withdrawalVaultBalance","type":"uint256"},{"name":"_elRewardsVaultBalance","type":"uint256"},{"name":"_sharesRequestedToBurn","type":"uint256"},{"name":"_withdrawalFinalizationBatches","type":"uint256[]"},{"name":"_simulatedShareRate","type":"uint256"}],"name":"handleOracleReport","outputs":[{"name":"postRebaseAmounts","type":"uint256[4]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getFee","outputs":[{"name":"totalFee","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"kernel","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_deadline","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPetrified","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLidoLocator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"canDeposit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STAKING_PAUSE_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDepositableEther","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"sharesOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pauseStaking","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTotalELRewardsCollected","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[],"name":"StakingPaused","type":"event"},{"anonymous":false,"inputs":[],"name":"StakingResumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"maxStakeLimit","type":"uint256"},{"indexed":false,"name":"stakeLimitIncreasePerBlock","type":"uint256"}],"name":"StakingLimitSet","type":"event"},{"anonymous":false,"inputs":[],"name":"StakingLimitRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"reportTimestamp","type":"uint256"},{"indexed":false,"name":"preCLValidators","type":"uint256"},{"indexed":false,"name":"postCLValidators","type":"uint256"}],"name":"CLValidatorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"depositedValidators","type":"uint256"}],"name":"DepositedValidatorsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"reportTimestamp","type":"uint256"},{"indexed":false,"name":"preCLBalance","type":"uint256"},{"indexed":false,"name":"postCLBalance","type":"uint256"},{"indexed":false,"name":"withdrawalsWithdrawn","type":"uint256"},{"indexed":false,"name":"executionLayerRewardsWithdrawn","type":"uint256"},{"indexed":false,"name":"postBufferedEther","type":"uint256"}],"name":"ETHDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"reportTimestamp","type":"uint256"},{"indexed":false,"name":"timeElapsed","type":"uint256"},{"indexed":false,"name":"preTotalShares","type":"uint256"},{"indexed":false,"name":"preTotalEther","type":"uint256"},{"indexed":false,"name":"postTotalShares","type":"uint256"},{"indexed":false,"name":"postTotalEther","type":"uint256"},{"indexed":false,"name":"sharesMintedAsFees","type":"uint256"}],"name":"TokenRebased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"lidoLocator","type":"address"}],"name":"LidoLocatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"ELRewardsReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"WithdrawalsReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"referral","type":"address"}],"name":"Submitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Unbuffered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"executor","type":"address"},{"indexed":false,"name":"script","type":"bytes"},{"indexed":false,"name":"input","type":"bytes"},{"indexed":false,"name":"returnData","type":"bytes"}],"name":"ScriptResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"vault","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"RecoverToVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"eip712StETH","type":"address"}],"name":"EIP712StETHInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"sharesValue","type":"uint256"}],"name":"TransferShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":false,"name":"preRebaseTokenAmount","type":"uint256"},{"indexed":false,"name":"postRebaseTokenAmount","type":"uint256"},{"indexed":false,"name":"sharesAmount","type":"uint256"}],"name":"SharesBurnt","type":"event"},{"anonymous":false,"inputs":[],"name":"Stopped","type":"event"},{"anonymous":false,"inputs":[],"name":"Resumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"uint256"}],"name":"ContractVersionSet","type":"event"}] diff --git a/csm-alerts/src/abis/OssifiableProxy.json b/csm-alerts/src/abis/OssifiableProxy.json new file mode 100644 index 000000000..3c3ad7439 --- /dev/null +++ b/csm-alerts/src/abis/OssifiableProxy.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"implementation_","type":"address","internalType":"address"},{"name":"admin_","type":"address","internalType":"address"},{"name":"data_","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"type":"fallback","stateMutability":"payable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"proxy__changeAdmin","inputs":[{"name":"newAdmin_","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"proxy__getAdmin","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxy__getImplementation","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxy__getIsOssified","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"proxy__ossify","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"proxy__upgradeTo","inputs":[{"name":"newImplementation_","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"proxy__upgradeToAndCall","inputs":[{"name":"newImplementation_","type":"address","internalType":"address"},{"name":"setupCalldata_","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ProxyOssified","inputs":[],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967InvalidAdmin","inputs":[{"name":"admin","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967InvalidImplementation","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967NonPayable","inputs":[]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"NotAdmin","inputs":[]},{"type":"error","name":"ProxyIsOssified","inputs":[]}] diff --git a/csm-alerts/src/abis/PausableUntil.json b/csm-alerts/src/abis/PausableUntil.json new file mode 100644 index 000000000..f1161c521 --- /dev/null +++ b/csm-alerts/src/abis/PausableUntil.json @@ -0,0 +1 @@ +[{"type":"function","name":"PAUSE_INFINITELY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getResumeSinceTimestamp","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"isPaused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"Paused","inputs":[{"name":"duration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Resumed","inputs":[],"anonymous":false},{"type":"error","name":"PauseUntilMustBeInFuture","inputs":[]},{"type":"error","name":"PausedExpected","inputs":[]},{"type":"error","name":"ResumedExpected","inputs":[]},{"type":"error","name":"ZeroPauseDuration","inputs":[]}] diff --git a/csm-alerts/src/abis/StakingRouter.json b/csm-alerts/src/abis/StakingRouter.json new file mode 100644 index 000000000..e2e677bee --- /dev/null +++ b/csm-alerts/src/abis/StakingRouter.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"address","name":"_depositContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AppAuthLidoFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"firstArrayLength","type":"uint256"},{"internalType":"uint256","name":"secondArrayLength","type":"uint256"}],"name":"ArraysLengthMismatch","type":"error"},{"inputs":[],"name":"DepositContractZeroAddress","type":"error"},{"inputs":[],"name":"DirectETHTransfer","type":"error"},{"inputs":[],"name":"EmptyWithdrawalsCredentials","type":"error"},{"inputs":[],"name":"ExitedValidatorsCountCannotDecrease","type":"error"},{"inputs":[],"name":"InvalidContractVersionIncrement","type":"error"},{"inputs":[{"internalType":"uint256","name":"etherValue","type":"uint256"},{"internalType":"uint256","name":"depositsCount","type":"uint256"}],"name":"InvalidDepositsValue","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"InvalidPublicKeysBatchLength","type":"error"},{"inputs":[{"internalType":"uint256","name":"code","type":"uint256"}],"name":"InvalidReportData","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"InvalidSignaturesBatchLength","type":"error"},{"inputs":[],"name":"NonZeroContractVersionOnInit","type":"error"},{"inputs":[{"internalType":"uint256","name":"reportedExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"depositedValidatorsCount","type":"uint256"}],"name":"ReportedExitedValidatorsExceedDeposited","type":"error"},{"inputs":[],"name":"StakingModuleAddressExists","type":"error"},{"inputs":[],"name":"StakingModuleNotActive","type":"error"},{"inputs":[],"name":"StakingModuleNotPaused","type":"error"},{"inputs":[],"name":"StakingModuleStatusTheSame","type":"error"},{"inputs":[],"name":"StakingModuleUnregistered","type":"error"},{"inputs":[],"name":"StakingModuleWrongName","type":"error"},{"inputs":[],"name":"StakingModulesLimitExceeded","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"name":"UnexpectedContractVersion","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentModuleExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"currentNodeOpExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"currentNodeOpStuckValidatorsCount","type":"uint256"}],"name":"UnexpectedCurrentValidatorsCount","type":"error"},{"inputs":[],"name":"UnrecoverableModuleError","type":"error"},{"inputs":[{"internalType":"string","name":"field","type":"string"}],"name":"ValueOver100Percent","type":"error"},{"inputs":[{"internalType":"string","name":"field","type":"string"}],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"ContractVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"lowLevelRevertData","type":"bytes"}],"name":"ExitedAndStuckValidatorsCountsUpdateFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"lowLevelRevertData","type":"bytes"}],"name":"RewardsMintedReportFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"address","name":"stakingModule","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"createdBy","type":"address"}],"name":"StakingModuleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unreportedExitedValidatorsCount","type":"uint256"}],"name":"StakingModuleExitedValidatorsIncompleteReporting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakingModuleFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"setBy","type":"address"}],"name":"StakingModuleFeesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"enum StakingRouter.StakingModuleStatus","name":"status","type":"uint8"},{"indexed":false,"internalType":"address","name":"setBy","type":"address"}],"name":"StakingModuleStatusSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"targetShare","type":"uint256"},{"indexed":false,"internalType":"address","name":"setBy","type":"address"}],"name":"StakingModuleTargetShareSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakingRouterETHDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"withdrawalCredentials","type":"bytes32"},{"indexed":false,"internalType":"address","name":"setBy","type":"address"}],"name":"WithdrawalCredentialsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"lowLevelRevertData","type":"bytes"}],"name":"WithdrawalsCredentialsChangeFailed","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_CONTRACT","outputs":[{"internalType":"contract IDepositContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_PRECISION_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_WITHDRAWAL_CREDENTIALS_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_STAKING_MODULES_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_STAKING_MODULE_NAME_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPORT_EXITED_VALIDATORS_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPORT_REWARDS_MINTED_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_MODULE_MANAGE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_MODULE_PAUSE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_MODULE_RESUME_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNSAFE_SET_EXITED_VALIDATORS_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_stakingModuleAddress","type":"address"},{"internalType":"uint256","name":"_targetShare","type":"uint256"},{"internalType":"uint256","name":"_stakingModuleFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"addStakingModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositsCount","type":"uint256"},{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"bytes","name":"_depositCalldata","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getAllNodeOperatorDigests","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"components":[{"internalType":"bool","name":"isTargetLimitActive","type":"bool"},{"internalType":"uint256","name":"targetValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"refundedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckPenaltyEndTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.NodeOperatorSummary","name":"summary","type":"tuple"}],"internalType":"struct StakingRouter.NodeOperatorDigest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllStakingModuleDigests","outputs":[{"components":[{"internalType":"uint256","name":"nodeOperatorsCount","type":"uint256"},{"internalType":"uint256","name":"activeNodeOperatorsCount","type":"uint256"},{"components":[{"internalType":"uint24","name":"id","type":"uint24"},{"internalType":"address","name":"stakingModuleAddress","type":"address"},{"internalType":"uint16","name":"stakingModuleFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"targetShare","type":"uint16"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"lastDepositAt","type":"uint64"},{"internalType":"uint256","name":"lastDepositBlock","type":"uint256"},{"internalType":"uint256","name":"exitedValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.StakingModule","name":"state","type":"tuple"},{"components":[{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.StakingModuleSummary","name":"summary","type":"tuple"}],"internalType":"struct StakingRouter.StakingModuleDigest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositsCount","type":"uint256"}],"name":"getDepositsAllocation","outputs":[{"internalType":"uint256","name":"allocated","type":"uint256"},{"internalType":"uint256[]","name":"allocations","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLido","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256[]","name":"_nodeOperatorIds","type":"uint256[]"}],"name":"getNodeOperatorDigests","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"components":[{"internalType":"bool","name":"isTargetLimitActive","type":"bool"},{"internalType":"uint256","name":"targetValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"refundedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckPenaltyEndTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.NodeOperatorSummary","name":"summary","type":"tuple"}],"internalType":"struct StakingRouter.NodeOperatorDigest[]","name":"digests","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"getNodeOperatorDigests","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"components":[{"internalType":"bool","name":"isTargetLimitActive","type":"bool"},{"internalType":"uint256","name":"targetValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"refundedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckPenaltyEndTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.NodeOperatorSummary","name":"summary","type":"tuple"}],"internalType":"struct StakingRouter.NodeOperatorDigest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_nodeOperatorId","type":"uint256"}],"name":"getNodeOperatorSummary","outputs":[{"components":[{"internalType":"bool","name":"isTargetLimitActive","type":"bool"},{"internalType":"uint256","name":"targetValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"refundedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckPenaltyEndTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.NodeOperatorSummary","name":"summary","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingFeeAggregateDistribution","outputs":[{"internalType":"uint96","name":"modulesFee","type":"uint96"},{"internalType":"uint96","name":"treasuryFee","type":"uint96"},{"internalType":"uint256","name":"basePrecision","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingFeeAggregateDistributionE4Precision","outputs":[{"internalType":"uint16","name":"modulesFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModule","outputs":[{"components":[{"internalType":"uint24","name":"id","type":"uint24"},{"internalType":"address","name":"stakingModuleAddress","type":"address"},{"internalType":"uint16","name":"stakingModuleFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"targetShare","type":"uint16"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"lastDepositAt","type":"uint64"},{"internalType":"uint256","name":"lastDepositBlock","type":"uint256"},{"internalType":"uint256","name":"exitedValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.StakingModule","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleActiveValidatorsCount","outputs":[{"internalType":"uint256","name":"activeValidatorsCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_stakingModuleIds","type":"uint256[]"}],"name":"getStakingModuleDigests","outputs":[{"components":[{"internalType":"uint256","name":"nodeOperatorsCount","type":"uint256"},{"internalType":"uint256","name":"activeNodeOperatorsCount","type":"uint256"},{"components":[{"internalType":"uint24","name":"id","type":"uint24"},{"internalType":"address","name":"stakingModuleAddress","type":"address"},{"internalType":"uint16","name":"stakingModuleFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"targetShare","type":"uint16"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"lastDepositAt","type":"uint64"},{"internalType":"uint256","name":"lastDepositBlock","type":"uint256"},{"internalType":"uint256","name":"exitedValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.StakingModule","name":"state","type":"tuple"},{"components":[{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.StakingModuleSummary","name":"summary","type":"tuple"}],"internalType":"struct StakingRouter.StakingModuleDigest[]","name":"digests","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingModuleIds","outputs":[{"internalType":"uint256[]","name":"stakingModuleIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleIsDepositsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleIsStopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleLastDepositBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_maxDepositsValue","type":"uint256"}],"name":"getStakingModuleMaxDepositsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleStatus","outputs":[{"internalType":"enum StakingRouter.StakingModuleStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleSummary","outputs":[{"components":[{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.StakingModuleSummary","name":"summary","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingModules","outputs":[{"components":[{"internalType":"uint24","name":"id","type":"uint24"},{"internalType":"address","name":"stakingModuleAddress","type":"address"},{"internalType":"uint16","name":"stakingModuleFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"targetShare","type":"uint16"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"lastDepositAt","type":"uint64"},{"internalType":"uint256","name":"lastDepositBlock","type":"uint256"},{"internalType":"uint256","name":"exitedValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.StakingModule[]","name":"res","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingModulesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingRewardsDistribution","outputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"stakingModuleIds","type":"uint256[]"},{"internalType":"uint96[]","name":"stakingModuleFees","type":"uint96[]"},{"internalType":"uint96","name":"totalFee","type":"uint96"},{"internalType":"uint256","name":"precisionPoints","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalFeeE4Precision","outputs":[{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawalCredentials","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"hasStakingModule","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_lido","type":"address"},{"internalType":"bytes32","name":"_withdrawalCredentials","type":"bytes32"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"onValidatorsCountsByNodeOperatorReportingFinished","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"pauseStakingModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_stakingModuleIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_totalShares","type":"uint256[]"}],"name":"reportRewardsMinted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"bytes","name":"_nodeOperatorIds","type":"bytes"},{"internalType":"bytes","name":"_exitedValidatorsCounts","type":"bytes"}],"name":"reportStakingModuleExitedValidatorsCountByNodeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"bytes","name":"_nodeOperatorIds","type":"bytes"},{"internalType":"bytes","name":"_stuckValidatorsCounts","type":"bytes"}],"name":"reportStakingModuleStuckValidatorsCountByNodeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"resumeStakingModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"enum StakingRouter.StakingModuleStatus","name":"_status","type":"uint8"}],"name":"setStakingModuleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_withdrawalCredentials","type":"bytes32"}],"name":"setWithdrawalCredentials","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_nodeOperatorId","type":"uint256"},{"internalType":"bool","name":"_triggerUpdateFinish","type":"bool"},{"components":[{"internalType":"uint256","name":"currentModuleExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"currentNodeOperatorExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"currentNodeOperatorStuckValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"newModuleExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"newNodeOperatorExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"newNodeOperatorStuckValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.ValidatorsCountsCorrection","name":"_correction","type":"tuple"}],"name":"unsafeSetExitedValidatorsCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_stakingModuleIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_exitedValidatorsCounts","type":"uint256[]"}],"name":"updateExitedValidatorsCountByStakingModule","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"_refundedValidatorsCount","type":"uint256"}],"name":"updateRefundedValidatorsCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_targetShare","type":"uint256"},{"internalType":"uint256","name":"_stakingModuleFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateStakingModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_nodeOperatorId","type":"uint256"},{"internalType":"bool","name":"_isTargetLimitActive","type":"bool"},{"internalType":"uint256","name":"_targetLimit","type":"uint256"}],"name":"updateTargetValidatorsLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}] diff --git a/csm-alerts/src/brief/abi/CSAccounting.json b/csm-alerts/src/brief/abi/CSAccounting.json deleted file mode 100644 index 26de59f9f..000000000 --- a/csm-alerts/src/brief/abi/CSAccounting.json +++ /dev/null @@ -1,2293 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "lidoLocator", - "type": "address" - }, - { - "internalType": "address", - "name": "communityStakingModule", - "type": "address" - }, - { - "internalType": "uint256", - "name": "maxCurveLength", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minBondLockRetentionPeriod", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxBondLockRetentionPeriod", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "ElRewardsVaultReceiveFailed", - "type": "error" - }, - { - "inputs": [], - "name": "FailedToSendEther", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBondCurveId", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBondCurveLength", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBondCurveMaxLength", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBondCurveValues", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBondLockAmount", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBondLockRetentionPeriod", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidInitialisationCurveId", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidInitialization", - "type": "error" - }, - { - "inputs": [], - "name": "NodeOperatorDoesNotExist", - "type": "error" - }, - { - "inputs": [], - "name": "NotAllowedToRecover", - "type": "error" - }, - { - "inputs": [], - "name": "NotInitializing", - "type": "error" - }, - { - "inputs": [], - "name": "NothingToClaim", - "type": "error" - }, - { - "inputs": [], - "name": "PauseUntilMustBeInFuture", - "type": "error" - }, - { - "inputs": [], - "name": "PausedExpected", - "type": "error" - }, - { - "inputs": [], - "name": "ResumedExpected", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "bits", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "SafeCastOverflowedUintDowncast", - "type": "error" - }, - { - "inputs": [], - "name": "SenderIsNotCSM", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAdminAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroChargePenaltyRecipientAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroFeeDistributorAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroLocatorAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroModuleAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroPauseDuration", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "toBurnAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "burnedAmount", - "type": "uint256" - } - ], - "name": "BondBurned", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "toChargeAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "chargedAmount", - "type": "uint256" - } - ], - "name": "BondCharged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "BondClaimedStETH", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "requestId", - "type": "uint256" - } - ], - "name": "BondClaimedUnstETH", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "BondClaimedWstETH", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256[]", - "name": "bondCurve", - "type": "uint256[]" - } - ], - "name": "BondCurveAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "curveId", - "type": "uint256" - } - ], - "name": "BondCurveSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "curveId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "bondCurve", - "type": "uint256[]" - } - ], - "name": "BondCurveUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "BondDepositedETH", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "BondDepositedStETH", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "BondDepositedWstETH", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "retentionUntil", - "type": "uint256" - } - ], - "name": "BondLockChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "BondLockCompensated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "BondLockRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "retentionPeriod", - "type": "uint256" - } - ], - "name": "BondLockRetentionPeriodChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "chargePenaltyRecipient", - "type": "address" - } - ], - "name": "ChargePenaltyRecipientSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "ERC1155Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "ERC20Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - } - ], - "name": "ERC721Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "EtherRecovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint64", - "name": "version", - "type": "uint64" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "duration", - "type": "uint256" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "Resumed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "StETHSharesRecovered", - "type": "event" - }, - { - "inputs": [], - "name": "ACCOUNTING_MANAGER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CSM", - "outputs": [ - { - "internalType": "contract ICSModule", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_BOND_CURVE_ID", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "LIDO", - "outputs": [ - { - "internalType": "contract ILido", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "LIDO_LOCATOR", - "outputs": [ - { - "internalType": "contract ILidoLocator", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MANAGE_BOND_CURVES_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_BOND_LOCK_RETENTION_PERIOD", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_CURVE_LENGTH", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_BOND_LOCK_RETENTION_PERIOD", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_CURVE_LENGTH", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PAUSE_INFINITELY", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PAUSE_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RECOVERER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RESET_BOND_CURVE_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RESUME_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SET_BOND_CURVE_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "WITHDRAWAL_QUEUE", - "outputs": [ - { - "internalType": "contract IWithdrawalQueue", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "WSTETH", - "outputs": [ - { - "internalType": "contract IWstETH", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "bondCurve", - "type": "uint256[]" - } - ], - "name": "addBondCurve", - "outputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "chargeFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "chargePenaltyRecipient", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stETHAmount", - "type": "uint256" - }, - { - "internalType": "address", - "name": "rewardAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "cumulativeFeeShares", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "rewardsProof", - "type": "bytes32[]" - } - ], - "name": "claimRewardsStETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stEthAmount", - "type": "uint256" - }, - { - "internalType": "address", - "name": "rewardAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "cumulativeFeeShares", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "rewardsProof", - "type": "bytes32[]" - } - ], - "name": "claimRewardsUnstETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "wstETHAmount", - "type": "uint256" - }, - { - "internalType": "address", - "name": "rewardAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "cumulativeFeeShares", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "rewardsProof", - "type": "bytes32[]" - } - ], - "name": "claimRewardsWstETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "compensateLockedBondETH", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "depositETH", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stETHAmount", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct ICSAccounting.PermitInput", - "name": "permit", - "type": "tuple" - } - ], - "name": "depositStETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "wstETHAmount", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct ICSAccounting.PermitInput", - "name": "permit", - "type": "tuple" - } - ], - "name": "depositWstETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "feeDistributor", - "outputs": [ - { - "internalType": "contract ICSFeeDistributor", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getActualLockedBond", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getBond", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "keys", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256[]", - "name": "points", - "type": "uint256[]" - }, - { - "internalType": "uint256", - "name": "trend", - "type": "uint256" - } - ], - "internalType": "struct ICSBondCurve.BondCurve", - "name": "curve", - "type": "tuple" - } - ], - "name": "getBondAmountByKeysCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "keys", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "curveId", - "type": "uint256" - } - ], - "name": "getBondAmountByKeysCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "keysCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "curveId", - "type": "uint256" - } - ], - "name": "getBondAmountByKeysCountWstETH", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "keysCount", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256[]", - "name": "points", - "type": "uint256[]" - }, - { - "internalType": "uint256", - "name": "trend", - "type": "uint256" - } - ], - "internalType": "struct ICSBondCurve.BondCurve", - "name": "curve", - "type": "tuple" - } - ], - "name": "getBondAmountByKeysCountWstETH", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getBondCurve", - "outputs": [ - { - "components": [ - { - "internalType": "uint256[]", - "name": "points", - "type": "uint256[]" - }, - { - "internalType": "uint256", - "name": "trend", - "type": "uint256" - } - ], - "internalType": "struct ICSBondCurve.BondCurve", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getBondCurveId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getBondLockRetentionPeriod", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getBondShares", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getBondSummary", - "outputs": [ - { - "internalType": "uint256", - "name": "current", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "required", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getBondSummaryShares", - "outputs": [ - { - "internalType": "uint256", - "name": "current", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "required", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "curveId", - "type": "uint256" - } - ], - "name": "getCurveInfo", - "outputs": [ - { - "components": [ - { - "internalType": "uint256[]", - "name": "points", - "type": "uint256[]" - }, - { - "internalType": "uint256", - "name": "trend", - "type": "uint256" - } - ], - "internalType": "struct ICSBondCurve.BondCurve", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256[]", - "name": "points", - "type": "uint256[]" - }, - { - "internalType": "uint256", - "name": "trend", - "type": "uint256" - } - ], - "internalType": "struct ICSBondCurve.BondCurve", - "name": "curve", - "type": "tuple" - } - ], - "name": "getKeysCountByBondAmount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "curveId", - "type": "uint256" - } - ], - "name": "getKeysCountByBondAmount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getLockedBondInfo", - "outputs": [ - { - "components": [ - { - "internalType": "uint128", - "name": "amount", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "retentionUntil", - "type": "uint128" - } - ], - "internalType": "struct ICSBondLock.BondLock", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "additionalKeys", - "type": "uint256" - } - ], - "name": "getRequiredBondForNextKeys", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "additionalKeys", - "type": "uint256" - } - ], - "name": "getRequiredBondForNextKeysWstETH", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getResumeSinceTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getUnbondedKeysCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getUnbondedKeysCountToEject", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "bondCurve", - "type": "uint256[]" - }, - { - "internalType": "address", - "name": "admin", - "type": "address" - }, - { - "internalType": "address", - "name": "_feeDistributor", - "type": "address" - }, - { - "internalType": "uint256", - "name": "bondLockRetentionPeriod", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_chargePenaltyRecipient", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "isPaused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "lockBondETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "duration", - "type": "uint256" - } - ], - "name": "pauseFor", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "penalize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "cumulativeFeeShares", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "rewardsProof", - "type": "bytes32[]" - } - ], - "name": "pullFeeRewards", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "recoverERC1155", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "recoverERC721", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "recoverEther", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "recoverStETHShares", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "releaseLockedBondETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renewBurnerAllowance", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "resetBondCurve", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "resume", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "curveId", - "type": "uint256" - } - ], - "name": "setBondCurve", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_chargePenaltyRecipient", - "type": "address" - } - ], - "name": "setChargePenaltyRecipient", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "retention", - "type": "uint256" - } - ], - "name": "setLockedBondRetentionPeriod", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "settleLockedBondETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalBondShares", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "curveId", - "type": "uint256" - }, - { - "internalType": "uint256[]", - "name": "bondCurve", - "type": "uint256[]" - } - ], - "name": "updateBondCurve", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] \ No newline at end of file diff --git a/csm-alerts/src/brief/abi/CSFeeDistributor.json b/csm-alerts/src/brief/abi/CSFeeDistributor.json deleted file mode 100644 index 75ed4aa7a..000000000 --- a/csm-alerts/src/brief/abi/CSFeeDistributor.json +++ /dev/null @@ -1,849 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "stETH", - "type": "address" - }, - { - "internalType": "address", - "name": "accounting", - "type": "address" - }, - { - "internalType": "address", - "name": "oracle", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "FailedToSendEther", - "type": "error" - }, - { - "inputs": [], - "name": "FeeSharesDecrease", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidInitialization", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidProof", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidShares", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidTreeCID", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidTreeRoot", - "type": "error" - }, - { - "inputs": [], - "name": "NotAccounting", - "type": "error" - }, - { - "inputs": [], - "name": "NotAllowedToRecover", - "type": "error" - }, - { - "inputs": [], - "name": "NotEnoughShares", - "type": "error" - }, - { - "inputs": [], - "name": "NotInitializing", - "type": "error" - }, - { - "inputs": [], - "name": "NotOracle", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAccountingAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAdminAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroOracleAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroStEthAddress", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "totalClaimableShares", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "treeRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "string", - "name": "treeCid", - "type": "string" - } - ], - "name": "DistributionDataUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "ERC1155Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "ERC20Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - } - ], - "name": "ERC721Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "EtherRecovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "FeeDistributed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint64", - "name": "version", - "type": "uint64" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "StETHSharesRecovered", - "type": "event" - }, - { - "inputs": [], - "name": "ACCOUNTING", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ORACLE", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RECOVERER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "STETH", - "outputs": [ - { - "internalType": "contract IStETH", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "proof", - "type": "bytes32[]" - } - ], - "name": "distributeFees", - "outputs": [ - { - "internalType": "uint256", - "name": "sharesToDistribute", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "distributedShares", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "proof", - "type": "bytes32[]" - } - ], - "name": "getFeesToDistribute", - "outputs": [ - { - "internalType": "uint256", - "name": "sharesToDistribute", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "hashLeaf", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "admin", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "pendingSharesToDistribute", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_treeRoot", - "type": "bytes32" - }, - { - "internalType": "string", - "name": "_treeCid", - "type": "string" - }, - { - "internalType": "uint256", - "name": "distributed", - "type": "uint256" - } - ], - "name": "processOracleReport", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "recoverERC1155", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "recoverERC721", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "recoverEther", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalClaimableShares", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "treeCid", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "treeRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - } -] \ No newline at end of file diff --git a/csm-alerts/src/brief/abi/CSFeeOracle.json b/csm-alerts/src/brief/abi/CSFeeOracle.json deleted file mode 100644 index 0292f38cb..000000000 --- a/csm-alerts/src/brief/abi/CSFeeOracle.json +++ /dev/null @@ -1,1397 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "uint256", - "name": "secondsPerSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "genesisTime", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "AddressCannotBeSame", - "type": "error" - }, - { - "inputs": [], - "name": "AddressCannotBeZero", - "type": "error" - }, - { - "inputs": [], - "name": "FailedToSendEther", - "type": "error" - }, - { - "inputs": [], - "name": "HashCannotBeZero", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "initialRefSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "processingRefSlot", - "type": "uint256" - } - ], - "name": "InitialRefSlotCannotBeLessThanProcessingOne", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidContractVersionIncrement", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidInitialization", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidPerfLeeway", - "type": "error" - }, - { - "inputs": [], - "name": "NoConsensusReportToProcess", - "type": "error" - }, - { - "inputs": [], - "name": "NonZeroContractVersionOnInit", - "type": "error" - }, - { - "inputs": [], - "name": "NotAllowedToRecover", - "type": "error" - }, - { - "inputs": [], - "name": "NotInitializing", - "type": "error" - }, - { - "inputs": [], - "name": "PauseUntilMustBeInFuture", - "type": "error" - }, - { - "inputs": [], - "name": "PausedExpected", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "ProcessingDeadlineMissed", - "type": "error" - }, - { - "inputs": [], - "name": "RefSlotAlreadyProcessing", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevRefSlot", - "type": "uint256" - } - ], - "name": "RefSlotCannotDecrease", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "processingRefSlot", - "type": "uint256" - } - ], - "name": "RefSlotMustBeGreaterThanProcessingOne", - "type": "error" - }, - { - "inputs": [], - "name": "ResumedExpected", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "bits", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "SafeCastOverflowedUintDowncast", - "type": "error" - }, - { - "inputs": [], - "name": "SecondsPerSlotCannotBeZero", - "type": "error" - }, - { - "inputs": [], - "name": "SenderIsNotTheConsensusContract", - "type": "error" - }, - { - "inputs": [], - "name": "SenderNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "UnexpectedChainConfig", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "expectedVersion", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "receivedVersion", - "type": "uint256" - } - ], - "name": "UnexpectedConsensusVersion", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "received", - "type": "uint256" - } - ], - "name": "UnexpectedContractVersion", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "consensusHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "receivedHash", - "type": "bytes32" - } - ], - "name": "UnexpectedDataHash", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "consensusRefSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "dataRefSlot", - "type": "uint256" - } - ], - "name": "UnexpectedRefSlot", - "type": "error" - }, - { - "inputs": [], - "name": "VersionCannotBeSame", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAdminAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroFeeDistributorAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroPauseDuration", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "prevAddr", - "type": "address" - } - ], - "name": "ConsensusHashContractSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "version", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "prevVersion", - "type": "uint256" - } - ], - "name": "ConsensusVersionSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "version", - "type": "uint256" - } - ], - "name": "ContractVersionSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "ERC1155Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "ERC20Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - } - ], - "name": "ERC721Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "EtherRecovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "feeDistributorContract", - "type": "address" - } - ], - "name": "FeeDistributorContractSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint64", - "name": "version", - "type": "uint64" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "duration", - "type": "uint256" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "valueBP", - "type": "uint256" - } - ], - "name": "PerfLeewaySet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "name": "ProcessingStarted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "name": "ReportDiscarded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "distributed", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "treeRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "string", - "name": "treeCid", - "type": "string" - } - ], - "name": "ReportSettled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "processingDeadlineTime", - "type": "uint256" - } - ], - "name": "ReportSubmitted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "Resumed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "StETHSharesRecovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - } - ], - "name": "WarnProcessingMissed", - "type": "event" - }, - { - "inputs": [], - "name": "CONTRACT_MANAGER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "GENESIS_TIME", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MANAGE_CONSENSUS_CONTRACT_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MANAGE_CONSENSUS_VERSION_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PAUSE_INFINITELY", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PAUSE_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RECOVERER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RESUME_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SECONDS_PER_SLOT", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SUBMIT_DATA_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "avgPerfLeewayBP", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - } - ], - "name": "discardConsensusReport", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "feeDistributor", - "outputs": [ - { - "internalType": "contract ICSFeeDistributor", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getConsensusContract", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getConsensusReport", - "outputs": [ - { - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "processingDeadlineTime", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "processingStarted", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getConsensusVersion", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getContractVersion", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLastProcessingRefSlot", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getResumeSinceTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "admin", - "type": "address" - }, - { - "internalType": "address", - "name": "feeDistributorContract", - "type": "address" - }, - { - "internalType": "address", - "name": "consensusContract", - "type": "address" - }, - { - "internalType": "uint256", - "name": "consensusVersion", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_avgPerfLeewayBP", - "type": "uint256" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "isPaused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "duration", - "type": "uint256" - } - ], - "name": "pauseFor", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "pauseUntilInclusive", - "type": "uint256" - } - ], - "name": "pauseUntil", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "recoverERC1155", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "recoverERC721", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "recoverEther", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "resume", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - } - ], - "name": "setConsensusContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "version", - "type": "uint256" - } - ], - "name": "setConsensusVersion", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "feeDistributorContract", - "type": "address" - } - ], - "name": "setFeeDistributorContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "valueBP", - "type": "uint256" - } - ], - "name": "setPerformanceLeeway", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "reportHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "submitConsensusReport", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "consensusVersion", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "treeRoot", - "type": "bytes32" - }, - { - "internalType": "string", - "name": "treeCid", - "type": "string" - }, - { - "internalType": "uint256", - "name": "distributed", - "type": "uint256" - } - ], - "internalType": "struct CSFeeOracle.ReportData", - "name": "data", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "contractVersion", - "type": "uint256" - } - ], - "name": "submitReportData", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } -] \ No newline at end of file diff --git a/csm-alerts/src/brief/abi/CSModule.json b/csm-alerts/src/brief/abi/CSModule.json deleted file mode 100644 index 4914db6e7..000000000 --- a/csm-alerts/src/brief/abi/CSModule.json +++ /dev/null @@ -1,2996 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "bytes32", - "name": "moduleType", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "minSlashingPenaltyQuotient", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "elRewardsStealingFine", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxKeysPerOperatorEA", - "type": "uint256" - }, - { - "internalType": "address", - "name": "lidoLocator", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "AlreadyActivated", - "type": "error" - }, - { - "inputs": [], - "name": "AlreadyProposed", - "type": "error" - }, - { - "inputs": [], - "name": "AlreadySubmitted", - "type": "error" - }, - { - "inputs": [], - "name": "AlreadyWithdrawn", - "type": "error" - }, - { - "inputs": [], - "name": "EmptyKey", - "type": "error" - }, - { - "inputs": [], - "name": "ExitedKeysDecrease", - "type": "error" - }, - { - "inputs": [], - "name": "ExitedKeysHigherThanTotalDeposited", - "type": "error" - }, - { - "inputs": [], - "name": "FailedToSendEther", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidAmount", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidInitialization", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidInput", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidKeysCount", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidLength", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidReportData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidVetKeysPointer", - "type": "error" - }, - { - "inputs": [], - "name": "MaxSigningKeysCountExceeded", - "type": "error" - }, - { - "inputs": [], - "name": "MethodCallIsNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "NodeOperatorDoesNotExist", - "type": "error" - }, - { - "inputs": [], - "name": "NotAllowedToJoinYet", - "type": "error" - }, - { - "inputs": [], - "name": "NotAllowedToRecover", - "type": "error" - }, - { - "inputs": [], - "name": "NotEnoughKeys", - "type": "error" - }, - { - "inputs": [], - "name": "NotInitializing", - "type": "error" - }, - { - "inputs": [], - "name": "NotSupported", - "type": "error" - }, - { - "inputs": [], - "name": "PauseUntilMustBeInFuture", - "type": "error" - }, - { - "inputs": [], - "name": "PausedExpected", - "type": "error" - }, - { - "inputs": [], - "name": "QueueIsEmpty", - "type": "error" - }, - { - "inputs": [], - "name": "QueueLookupNoLimit", - "type": "error" - }, - { - "inputs": [], - "name": "ResumedExpected", - "type": "error" - }, - { - "inputs": [], - "name": "SameAddress", - "type": "error" - }, - { - "inputs": [], - "name": "SenderIsNotEligible", - "type": "error" - }, - { - "inputs": [], - "name": "SenderIsNotManagerAddress", - "type": "error" - }, - { - "inputs": [], - "name": "SenderIsNotProposedAddress", - "type": "error" - }, - { - "inputs": [], - "name": "SenderIsNotRewardAddress", - "type": "error" - }, - { - "inputs": [], - "name": "SigningKeysInvalidOffset", - "type": "error" - }, - { - "inputs": [], - "name": "StuckKeysHigherThanNonExited", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAccountingAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAdminAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroLocatorAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroPauseDuration", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroRewardAddress", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "count", - "type": "uint256" - } - ], - "name": "BatchEnqueued", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "depositableKeysCount", - "type": "uint256" - } - ], - "name": "DepositableSigningKeysCountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "depositedKeysCount", - "type": "uint256" - } - ], - "name": "DepositedSigningKeysCountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "ELRewardsStealingPenaltyCancelled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "proposedBlockHash", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "stolenAmount", - "type": "uint256" - } - ], - "name": "ELRewardsStealingPenaltyReported", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "ELRewardsStealingPenaltySettled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "ERC1155Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "ERC20Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - } - ], - "name": "ERC721Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "EtherRecovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "exitedKeysCount", - "type": "uint256" - } - ], - "name": "ExitedSigningKeysCountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "keyIndex", - "type": "uint256" - } - ], - "name": "InitialSlashingSubmitted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint64", - "name": "version", - "type": "uint64" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "KeyRemovalChargeApplied", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "KeyRemovalChargeSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "managerAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "rewardAddress", - "type": "address" - } - ], - "name": "NodeOperatorAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "oldProposedAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newProposedAddress", - "type": "address" - } - ], - "name": "NodeOperatorManagerAddressChangeProposed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "oldAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "NodeOperatorManagerAddressChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "oldProposedAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newProposedAddress", - "type": "address" - } - ], - "name": "NodeOperatorRewardAddressChangeProposed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "oldAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "NodeOperatorRewardAddressChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - } - ], - "name": "NonceChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "duration", - "type": "uint256" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "PublicRelease", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "referrer", - "type": "address" - } - ], - "name": "ReferrerSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "Resumed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - } - ], - "name": "SigningKeyAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - } - ], - "name": "SigningKeyRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "StETHSharesRecovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "stuckKeysCount", - "type": "uint256" - } - ], - "name": "StuckSigningKeysCountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "targetLimitMode", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "targetValidatorsCount", - "type": "uint256" - } - ], - "name": "TargetValidatorsCountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "totalKeysCount", - "type": "uint256" - } - ], - "name": "TotalSigningKeysCountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "vettedKeysCount", - "type": "uint256" - } - ], - "name": "VettedSigningKeysCountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "VettedSigningKeysCountDecreased", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "keyIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "WithdrawalSubmitted", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "EL_REWARDS_STEALING_FINE", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIAL_SLASHING_PENALTY", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "LIDO_LOCATOR", - "outputs": [ - { - "internalType": "contract ILidoLocator", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_SIGNING_KEYS_PER_OPERATOR_BEFORE_PUBLIC_RELEASE", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MODULE_MANAGER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PAUSE_INFINITELY", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PAUSE_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RECOVERER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "REPORT_EL_REWARDS_STEALING_PENALTY_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RESUME_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "STAKING_ROUTER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "STETH", - "outputs": [ - { - "internalType": "contract IStETH", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "VERIFIER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "accounting", - "outputs": [ - { - "internalType": "contract ICSAccounting", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "activatePublicRelease", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "keysCount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "publicKeys", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - }, - { - "components": [ - { - "internalType": "address", - "name": "managerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "rewardAddress", - "type": "address" - }, - { - "internalType": "bool", - "name": "extendedManagerPermissions", - "type": "bool" - } - ], - "internalType": "struct NodeOperatorManagementProperties", - "name": "managementProperties", - "type": "tuple" - }, - { - "internalType": "bytes32[]", - "name": "eaProof", - "type": "bytes32[]" - }, - { - "internalType": "address", - "name": "referrer", - "type": "address" - } - ], - "name": "addNodeOperatorETH", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "keysCount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "publicKeys", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - }, - { - "components": [ - { - "internalType": "address", - "name": "managerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "rewardAddress", - "type": "address" - }, - { - "internalType": "bool", - "name": "extendedManagerPermissions", - "type": "bool" - } - ], - "internalType": "struct NodeOperatorManagementProperties", - "name": "managementProperties", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct ICSAccounting.PermitInput", - "name": "permit", - "type": "tuple" - }, - { - "internalType": "bytes32[]", - "name": "eaProof", - "type": "bytes32[]" - }, - { - "internalType": "address", - "name": "referrer", - "type": "address" - } - ], - "name": "addNodeOperatorStETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "keysCount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "publicKeys", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - }, - { - "components": [ - { - "internalType": "address", - "name": "managerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "rewardAddress", - "type": "address" - }, - { - "internalType": "bool", - "name": "extendedManagerPermissions", - "type": "bool" - } - ], - "internalType": "struct NodeOperatorManagementProperties", - "name": "managementProperties", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct ICSAccounting.PermitInput", - "name": "permit", - "type": "tuple" - }, - { - "internalType": "bytes32[]", - "name": "eaProof", - "type": "bytes32[]" - }, - { - "internalType": "address", - "name": "referrer", - "type": "address" - } - ], - "name": "addNodeOperatorWstETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "keysCount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "publicKeys", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - } - ], - "name": "addValidatorKeysETH", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "keysCount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "publicKeys", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct ICSAccounting.PermitInput", - "name": "permit", - "type": "tuple" - } - ], - "name": "addValidatorKeysStETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "keysCount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "publicKeys", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct ICSAccounting.PermitInput", - "name": "permit", - "type": "tuple" - } - ], - "name": "addValidatorKeysWstETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "cancelELRewardsStealingPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "changeNodeOperatorRewardAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stETHAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "cumulativeFeeShares", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "rewardsProof", - "type": "bytes32[]" - } - ], - "name": "claimRewardsStETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stEthAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "cumulativeFeeShares", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "rewardsProof", - "type": "bytes32[]" - } - ], - "name": "claimRewardsUnstETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "wstETHAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "cumulativeFeeShares", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "rewardsProof", - "type": "bytes32[]" - } - ], - "name": "claimRewardsWstETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "maxItems", - "type": "uint256" - } - ], - "name": "cleanDepositQueue", - "outputs": [ - { - "internalType": "uint256", - "name": "removed", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "lastRemovedAtDepth", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "compensateELRewardsStealingPenalty", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "confirmNodeOperatorManagerAddressChange", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "confirmNodeOperatorRewardAddressChange", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "nodeOperatorIds", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "vettedSigningKeysCounts", - "type": "bytes" - } - ], - "name": "decreaseVettedSigningKeysCount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "depositETH", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "depositQueue", - "outputs": [ - { - "internalType": "uint128", - "name": "head", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "tail", - "type": "uint128" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint128", - "name": "index", - "type": "uint128" - } - ], - "name": "depositQueueItem", - "outputs": [ - { - "internalType": "Batch", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stETHAmount", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct ICSAccounting.PermitInput", - "name": "permit", - "type": "tuple" - } - ], - "name": "depositStETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "wstETHAmount", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct ICSAccounting.PermitInput", - "name": "permit", - "type": "tuple" - } - ], - "name": "depositWstETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "earlyAdoption", - "outputs": [ - { - "internalType": "contract ICSEarlyAdoption", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getActiveNodeOperatorsCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getNodeOperator", - "outputs": [ - { - "components": [ - { - "internalType": "uint32", - "name": "totalAddedKeys", - "type": "uint32" - }, - { - "internalType": "uint32", - "name": "totalWithdrawnKeys", - "type": "uint32" - }, - { - "internalType": "uint32", - "name": "totalDepositedKeys", - "type": "uint32" - }, - { - "internalType": "uint32", - "name": "totalVettedKeys", - "type": "uint32" - }, - { - "internalType": "uint32", - "name": "stuckValidatorsCount", - "type": "uint32" - }, - { - "internalType": "uint32", - "name": "depositableValidatorsCount", - "type": "uint32" - }, - { - "internalType": "uint32", - "name": "targetLimit", - "type": "uint32" - }, - { - "internalType": "uint8", - "name": "targetLimitMode", - "type": "uint8" - }, - { - "internalType": "uint32", - "name": "totalExitedKeys", - "type": "uint32" - }, - { - "internalType": "uint32", - "name": "enqueuedCount", - "type": "uint32" - }, - { - "internalType": "address", - "name": "managerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "proposedManagerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "rewardAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "proposedRewardAddress", - "type": "address" - }, - { - "internalType": "bool", - "name": "extendedManagerPermissions", - "type": "bool" - } - ], - "internalType": "struct NodeOperator", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "offset", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "limit", - "type": "uint256" - } - ], - "name": "getNodeOperatorIds", - "outputs": [ - { - "internalType": "uint256[]", - "name": "nodeOperatorIds", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getNodeOperatorIsActive", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getNodeOperatorNonWithdrawnKeys", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "getNodeOperatorSummary", - "outputs": [ - { - "internalType": "uint256", - "name": "targetLimitMode", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "targetValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stuckValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "refundedValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stuckPenaltyEndTimestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalExitedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalDepositedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "depositableValidatorsCount", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNodeOperatorsCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getResumeSinceTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "startIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "keysCount", - "type": "uint256" - } - ], - "name": "getSigningKeys", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "startIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "keysCount", - "type": "uint256" - } - ], - "name": "getSigningKeysWithSignatures", - "outputs": [ - { - "internalType": "bytes", - "name": "keys", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getStakingModuleSummary", - "outputs": [ - { - "internalType": "uint256", - "name": "totalExitedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalDepositedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "depositableValidatorsCount", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getType", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_accounting", - "type": "address" - }, - { - "internalType": "address", - "name": "_earlyAdoption", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_keyRemovalCharge", - "type": "uint256" - }, - { - "internalType": "address", - "name": "admin", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "isPaused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "keyIndex", - "type": "uint256" - } - ], - "name": "isValidatorSlashed", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "keyIndex", - "type": "uint256" - } - ], - "name": "isValidatorWithdrawn", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "keyRemovalCharge", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "normalizeQueue", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "depositsCount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "obtainDepositData", - "outputs": [ - { - "internalType": "bytes", - "name": "publicKeys", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "onExitedAndStuckValidatorsCountsUpdated", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "totalShares", - "type": "uint256" - } - ], - "name": "onRewardsMinted", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "onWithdrawalCredentialsChanged", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "duration", - "type": "uint256" - } - ], - "name": "pauseFor", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "proposedAddress", - "type": "address" - } - ], - "name": "proposeNodeOperatorManagerAddressChange", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "proposedAddress", - "type": "address" - } - ], - "name": "proposeNodeOperatorRewardAddressChange", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "publicRelease", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "recoverERC1155", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "recoverERC721", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "recoverEther", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "recoverStETHShares", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "startIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "keysCount", - "type": "uint256" - } - ], - "name": "removeKeys", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "blockHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "reportELRewardsStealingPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - } - ], - "name": "resetNodeOperatorManagerAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "resume", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "setKeyRemovalCharge", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "nodeOperatorIds", - "type": "uint256[]" - } - ], - "name": "settleELRewardsStealingPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "keyIndex", - "type": "uint256" - } - ], - "name": "submitInitialSlashing", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "keyIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isSlashed", - "type": "bool" - } - ], - "name": "submitWithdrawal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "exitedValidatorsKeysCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stuckValidatorsKeysCount", - "type": "uint256" - } - ], - "name": "unsafeUpdateValidatorsCount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "nodeOperatorIds", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "exitedValidatorsCounts", - "type": "bytes" - } - ], - "name": "updateExitedValidatorsCount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "updateRefundedValidatorsCount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "nodeOperatorIds", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "stuckValidatorsCounts", - "type": "bytes" - } - ], - "name": "updateStuckValidatorsCount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "targetLimitMode", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "targetLimit", - "type": "uint256" - } - ], - "name": "updateTargetValidatorsLimits", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] \ No newline at end of file diff --git a/csm-alerts/src/brief/abi/HashConsensus.json b/csm-alerts/src/brief/abi/HashConsensus.json deleted file mode 100644 index c3d30982e..000000000 --- a/csm-alerts/src/brief/abi/HashConsensus.json +++ /dev/null @@ -1 +0,0 @@ -[{"inputs":[{"internalType":"uint256","name":"slotsPerEpoch","type":"uint256"},{"internalType":"uint256","name":"secondsPerSlot","type":"uint256"},{"internalType":"uint256","name":"genesisTime","type":"uint256"},{"internalType":"uint256","name":"epochsPerFrame","type":"uint256"},{"internalType":"uint256","name":"fastLaneLengthSlots","type":"uint256"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"reportProcessor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"AddressCannotBeZero","type":"error"},{"inputs":[],"name":"AdminCannotBeZero","type":"error"},{"inputs":[],"name":"ConsensusReportAlreadyProcessing","type":"error"},{"inputs":[],"name":"DuplicateMember","type":"error"},{"inputs":[],"name":"DuplicateReport","type":"error"},{"inputs":[],"name":"EmptyReport","type":"error"},{"inputs":[],"name":"EpochsPerFrameCannotBeZero","type":"error"},{"inputs":[],"name":"FastLanePeriodCannotBeLongerThanFrame","type":"error"},{"inputs":[],"name":"InitialEpochAlreadyArrived","type":"error"},{"inputs":[],"name":"InitialEpochIsYetToArrive","type":"error"},{"inputs":[],"name":"InitialEpochRefSlotCannotBeEarlierThanProcessingSlot","type":"error"},{"inputs":[],"name":"InvalidChainConfig","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidSlot","type":"error"},{"inputs":[],"name":"NewProcessorCannotBeTheSame","type":"error"},{"inputs":[],"name":"NonFastLaneMemberCannotReportWithinFastLaneInterval","type":"error"},{"inputs":[],"name":"NonMember","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"NumericOverflow","type":"error"},{"inputs":[{"internalType":"uint256","name":"minQuorum","type":"uint256"},{"internalType":"uint256","name":"receivedQuorum","type":"uint256"}],"name":"QuorumTooSmall","type":"error"},{"inputs":[],"name":"ReportProcessorCannotBeZero","type":"error"},{"inputs":[{"internalType":"uint8","name":"bits","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"SafeCastOverflowedUintDowncast","type":"error"},{"inputs":[],"name":"StaleReport","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"name":"UnexpectedConsensusVersion","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"}],"name":"ConsensusLost","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"report","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"support","type":"uint256"}],"name":"ConsensusReached","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fastLaneLengthSlots","type":"uint256"}],"name":"FastLaneConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newInitialEpoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEpochsPerFrame","type":"uint256"}],"name":"FrameConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"newTotalMembers","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newQuorum","type":"uint256"}],"name":"MemberAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"newTotalMembers","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newQuorum","type":"uint256"}],"name":"MemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newQuorum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalMembers","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"prevQuorum","type":"uint256"}],"name":"QuorumSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"processor","type":"address"},{"indexed":true,"internalType":"address","name":"prevProcessor","type":"address"}],"name":"ReportProcessorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":true,"internalType":"address","name":"member","type":"address"},{"indexed":false,"internalType":"bytes32","name":"report","type":"bytes32"}],"name":"ReportReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISABLE_CONSENSUS_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_FAST_LANE_CONFIG_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_FRAME_CONFIG_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_MEMBERS_AND_QUORUM_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_REPORT_PROCESSOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"quorum","type":"uint256"}],"name":"addMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableConsensus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getChainConfig","outputs":[{"internalType":"uint256","name":"slotsPerEpoch","type":"uint256"},{"internalType":"uint256","name":"secondsPerSlot","type":"uint256"},{"internalType":"uint256","name":"genesisTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConsensusState","outputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"bytes32","name":"consensusReport","type":"bytes32"},{"internalType":"bool","name":"isReportProcessing","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getConsensusStateForMember","outputs":[{"components":[{"internalType":"uint256","name":"currentFrameRefSlot","type":"uint256"},{"internalType":"bytes32","name":"currentFrameConsensusReport","type":"bytes32"},{"internalType":"bool","name":"isMember","type":"bool"},{"internalType":"bool","name":"isFastLane","type":"bool"},{"internalType":"bool","name":"canReport","type":"bool"},{"internalType":"uint256","name":"lastMemberReportRefSlot","type":"uint256"},{"internalType":"bytes32","name":"currentFrameMemberReport","type":"bytes32"}],"internalType":"struct HashConsensus.MemberConsensusState","name":"result","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentFrame","outputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"reportProcessingDeadlineSlot","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFastLaneMembers","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"lastReportedRefSlots","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFrameConfig","outputs":[{"internalType":"uint256","name":"initialEpoch","type":"uint256"},{"internalType":"uint256","name":"epochsPerFrame","type":"uint256"},{"internalType":"uint256","name":"fastLaneLengthSlots","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInitialRefSlot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getIsFastLaneMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getIsMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMembers","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"lastReportedRefSlots","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReportProcessor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReportVariants","outputs":[{"internalType":"bytes32[]","name":"variants","type":"bytes32[]"},{"internalType":"uint256[]","name":"support","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"quorum","type":"uint256"}],"name":"removeMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fastLaneLengthSlots","type":"uint256"}],"name":"setFastLaneLengthSlots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epochsPerFrame","type":"uint256"},{"internalType":"uint256","name":"fastLaneLengthSlots","type":"uint256"}],"name":"setFrameConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quorum","type":"uint256"}],"name":"setQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newProcessor","type":"address"}],"name":"setReportProcessor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"bytes32","name":"report","type":"bytes32"},{"internalType":"uint256","name":"consensusVersion","type":"uint256"}],"name":"submitReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"initialEpoch","type":"uint256"}],"name":"updateInitialEpoch","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/csm-alerts/src/brief/abi/Lido.json b/csm-alerts/src/brief/abi/Lido.json deleted file mode 100644 index 0d2c29468..000000000 --- a/csm-alerts/src/brief/abi/Lido.json +++ /dev/null @@ -1,871 +0,0 @@ -[ - { - "constant": false, - "inputs": [], - "name": "resume", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "name", - "outputs": [{ "name": "", "type": "string" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "stop", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "hasInitialized", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_spender", "type": "address" }, - { "name": "_amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "STAKING_CONTROL_ROLE", - "outputs": [{ "name": "", "type": "bytes32" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "_ethAmount", "type": "uint256" }], - "name": "getSharesByPooledEth", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "isStakingPaused", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_sender", "type": "address" }, - { "name": "_recipient", "type": "address" }, - { "name": "_amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "_script", "type": "bytes" }], - "name": "getEVMScriptExecutor", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_maxStakeLimit", "type": "uint256" }, - { "name": "_stakeLimitIncreasePerBlock", "type": "uint256" } - ], - "name": "setStakingLimit", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "RESUME_ROLE", - "outputs": [{ "name": "", "type": "bytes32" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_lidoLocator", "type": "address" }, - { "name": "_eip712StETH", "type": "address" } - ], - "name": "finalizeUpgrade_v2", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "decimals", - "outputs": [{ "name": "", "type": "uint8" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getRecoveryVault", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [{ "name": "", "type": "bytes32" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getTotalPooledEther", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "_newDepositedValidators", "type": "uint256" }], - "name": "unsafeChangeDepositedValidators", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "PAUSE_ROLE", - "outputs": [{ "name": "", "type": "bytes32" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_spender", "type": "address" }, - { "name": "_addedValue", "type": "uint256" } - ], - "name": "increaseAllowance", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getTreasury", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "isStopped", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getBufferedEther", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_lidoLocator", "type": "address" }, - { "name": "_eip712StETH", "type": "address" } - ], - "name": "initialize", - "outputs": [], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "receiveELRewards", - "outputs": [], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getWithdrawalCredentials", - "outputs": [{ "name": "", "type": "bytes32" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getCurrentStakeLimit", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getStakeLimitFullInfo", - "outputs": [ - { "name": "isStakingPaused", "type": "bool" }, - { "name": "isStakingLimitSet", "type": "bool" }, - { "name": "currentStakeLimit", "type": "uint256" }, - { "name": "maxStakeLimit", "type": "uint256" }, - { "name": "maxStakeLimitGrowthBlocks", "type": "uint256" }, - { "name": "prevStakeLimit", "type": "uint256" }, - { "name": "prevStakeBlockNumber", "type": "uint256" } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_sender", "type": "address" }, - { "name": "_recipient", "type": "address" }, - { "name": "_sharesAmount", "type": "uint256" } - ], - "name": "transferSharesFrom", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "_account", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "resumeStaking", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getFeeDistribution", - "outputs": [ - { "name": "treasuryFeeBasisPoints", "type": "uint16" }, - { "name": "insuranceFeeBasisPoints", "type": "uint16" }, - { "name": "operatorsFeeBasisPoints", "type": "uint16" } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "receiveWithdrawals", - "outputs": [], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "_sharesAmount", "type": "uint256" }], - "name": "getPooledEthByShares", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "token", "type": "address" }], - "name": "allowRecoverability", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "owner", "type": "address" }], - "name": "nonces", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "appId", - "outputs": [{ "name": "", "type": "bytes32" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getOracle", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "eip712Domain", - "outputs": [ - { "name": "name", "type": "string" }, - { "name": "version", "type": "string" }, - { "name": "chainId", "type": "uint256" }, - { "name": "verifyingContract", "type": "address" } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getContractVersion", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getInitializationBlock", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_recipient", "type": "address" }, - { "name": "_sharesAmount", "type": "uint256" } - ], - "name": "transferShares", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "symbol", - "outputs": [{ "name": "", "type": "string" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getEIP712StETH", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "", "type": "address" }], - "name": "transferToVault", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "name": "_sender", "type": "address" }, - { "name": "_role", "type": "bytes32" }, - { "name": "_params", "type": "uint256[]" } - ], - "name": "canPerform", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "_referral", "type": "address" }], - "name": "submit", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_spender", "type": "address" }, - { "name": "_subtractedValue", "type": "uint256" } - ], - "name": "decreaseAllowance", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getEVMScriptRegistry", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_recipient", "type": "address" }, - { "name": "_amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_maxDepositsCount", "type": "uint256" }, - { "name": "_stakingModuleId", "type": "uint256" }, - { "name": "_depositCalldata", "type": "bytes" } - ], - "name": "deposit", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "UNSAFE_CHANGE_DEPOSITED_VALIDATORS_ROLE", - "outputs": [{ "name": "", "type": "bytes32" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getBeaconStat", - "outputs": [ - { "name": "depositedValidators", "type": "uint256" }, - { "name": "beaconValidators", "type": "uint256" }, - { "name": "beaconBalance", "type": "uint256" } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "removeStakingLimit", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_reportTimestamp", "type": "uint256" }, - { "name": "_timeElapsed", "type": "uint256" }, - { "name": "_clValidators", "type": "uint256" }, - { "name": "_clBalance", "type": "uint256" }, - { "name": "_withdrawalVaultBalance", "type": "uint256" }, - { "name": "_elRewardsVaultBalance", "type": "uint256" }, - { "name": "_sharesRequestedToBurn", "type": "uint256" }, - { "name": "_withdrawalFinalizationBatches", "type": "uint256[]" }, - { "name": "_simulatedShareRate", "type": "uint256" } - ], - "name": "handleOracleReport", - "outputs": [{ "name": "postRebaseAmounts", "type": "uint256[4]" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getFee", - "outputs": [{ "name": "totalFee", "type": "uint16" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "kernel", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getTotalShares", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_owner", "type": "address" }, - { "name": "_spender", "type": "address" }, - { "name": "_value", "type": "uint256" }, - { "name": "_deadline", "type": "uint256" }, - { "name": "_v", "type": "uint8" }, - { "name": "_r", "type": "bytes32" }, - { "name": "_s", "type": "bytes32" } - ], - "name": "permit", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "name": "_owner", "type": "address" }, - { "name": "_spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "isPetrified", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getLidoLocator", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "canDeposit", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "STAKING_PAUSE_ROLE", - "outputs": [{ "name": "", "type": "bytes32" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getDepositableEther", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "_account", "type": "address" }], - "name": "sharesOf", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "pauseStaking", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getTotalELRewardsCollected", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { "payable": true, "stateMutability": "payable", "type": "fallback" }, - { "anonymous": false, "inputs": [], "name": "StakingPaused", "type": "event" }, - { "anonymous": false, "inputs": [], "name": "StakingResumed", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "maxStakeLimit", "type": "uint256" }, - { "indexed": false, "name": "stakeLimitIncreasePerBlock", "type": "uint256" } - ], - "name": "StakingLimitSet", - "type": "event" - }, - { "anonymous": false, "inputs": [], "name": "StakingLimitRemoved", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "reportTimestamp", "type": "uint256" }, - { "indexed": false, "name": "preCLValidators", "type": "uint256" }, - { "indexed": false, "name": "postCLValidators", "type": "uint256" } - ], - "name": "CLValidatorsUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "depositedValidators", "type": "uint256" }], - "name": "DepositedValidatorsChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "reportTimestamp", "type": "uint256" }, - { "indexed": false, "name": "preCLBalance", "type": "uint256" }, - { "indexed": false, "name": "postCLBalance", "type": "uint256" }, - { "indexed": false, "name": "withdrawalsWithdrawn", "type": "uint256" }, - { "indexed": false, "name": "executionLayerRewardsWithdrawn", "type": "uint256" }, - { "indexed": false, "name": "postBufferedEther", "type": "uint256" } - ], - "name": "ETHDistributed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "reportTimestamp", "type": "uint256" }, - { "indexed": false, "name": "timeElapsed", "type": "uint256" }, - { "indexed": false, "name": "preTotalShares", "type": "uint256" }, - { "indexed": false, "name": "preTotalEther", "type": "uint256" }, - { "indexed": false, "name": "postTotalShares", "type": "uint256" }, - { "indexed": false, "name": "postTotalEther", "type": "uint256" }, - { "indexed": false, "name": "sharesMintedAsFees", "type": "uint256" } - ], - "name": "TokenRebased", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "lidoLocator", "type": "address" }], - "name": "LidoLocatorSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "amount", "type": "uint256" }], - "name": "ELRewardsReceived", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "amount", "type": "uint256" }], - "name": "WithdrawalsReceived", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "sender", "type": "address" }, - { "indexed": false, "name": "amount", "type": "uint256" }, - { "indexed": false, "name": "referral", "type": "address" } - ], - "name": "Submitted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "amount", "type": "uint256" }], - "name": "Unbuffered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "executor", "type": "address" }, - { "indexed": false, "name": "script", "type": "bytes" }, - { "indexed": false, "name": "input", "type": "bytes" }, - { "indexed": false, "name": "returnData", "type": "bytes" } - ], - "name": "ScriptResult", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "vault", "type": "address" }, - { "indexed": true, "name": "token", "type": "address" }, - { "indexed": false, "name": "amount", "type": "uint256" } - ], - "name": "RecoverToVault", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "eip712StETH", "type": "address" }], - "name": "EIP712StETHInitialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "from", "type": "address" }, - { "indexed": true, "name": "to", "type": "address" }, - { "indexed": false, "name": "sharesValue", "type": "uint256" } - ], - "name": "TransferShares", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "account", "type": "address" }, - { "indexed": false, "name": "preRebaseTokenAmount", "type": "uint256" }, - { "indexed": false, "name": "postRebaseTokenAmount", "type": "uint256" }, - { "indexed": false, "name": "sharesAmount", "type": "uint256" } - ], - "name": "SharesBurnt", - "type": "event" - }, - { "anonymous": false, "inputs": [], "name": "Stopped", "type": "event" }, - { "anonymous": false, "inputs": [], "name": "Resumed", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "from", "type": "address" }, - { "indexed": true, "name": "to", "type": "address" }, - { "indexed": false, "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "owner", "type": "address" }, - { "indexed": true, "name": "spender", "type": "address" }, - { "indexed": false, "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "version", "type": "uint256" }], - "name": "ContractVersionSet", - "type": "event" - } -] diff --git a/csm-alerts/src/brief/abi/ProxyShortABI.json b/csm-alerts/src/brief/abi/ProxyShortABI.json deleted file mode 100644 index b73d7c162..000000000 --- a/csm-alerts/src/brief/abi/ProxyShortABI.json +++ /dev/null @@ -1,28 +0,0 @@ -[ - { - "inputs": [], - "name": "proxy__getAdmin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "proxy__getImplementation", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/csm-alerts/src/brief/abi/StakingRouter.json b/csm-alerts/src/brief/abi/StakingRouter.json deleted file mode 100644 index 9e6f892fb..000000000 --- a/csm-alerts/src/brief/abi/StakingRouter.json +++ /dev/null @@ -1,2307 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "_depositContract", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AppAuthLidoFailed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "firstArrayLength", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "secondArrayLength", - "type": "uint256" - } - ], - "name": "ArraysLengthMismatch", - "type": "error" - }, - { - "inputs": [], - "name": "DepositContractZeroAddress", - "type": "error" - }, - { - "inputs": [], - "name": "DirectETHTransfer", - "type": "error" - }, - { - "inputs": [], - "name": "EmptyWithdrawalsCredentials", - "type": "error" - }, - { - "inputs": [], - "name": "ExitedValidatorsCountCannotDecrease", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidContractVersionIncrement", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "etherValue", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "depositsCount", - "type": "uint256" - } - ], - "name": "InvalidDepositsValue", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "actual", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - } - ], - "name": "InvalidPublicKeysBatchLength", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "code", - "type": "uint256" - } - ], - "name": "InvalidReportData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "actual", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - } - ], - "name": "InvalidSignaturesBatchLength", - "type": "error" - }, - { - "inputs": [], - "name": "NonZeroContractVersionOnInit", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "reportedExitedValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "depositedValidatorsCount", - "type": "uint256" - } - ], - "name": "ReportedExitedValidatorsExceedDeposited", - "type": "error" - }, - { - "inputs": [], - "name": "StakingModuleAddressExists", - "type": "error" - }, - { - "inputs": [], - "name": "StakingModuleNotActive", - "type": "error" - }, - { - "inputs": [], - "name": "StakingModuleNotPaused", - "type": "error" - }, - { - "inputs": [], - "name": "StakingModuleStatusTheSame", - "type": "error" - }, - { - "inputs": [], - "name": "StakingModuleUnregistered", - "type": "error" - }, - { - "inputs": [], - "name": "StakingModuleWrongName", - "type": "error" - }, - { - "inputs": [], - "name": "StakingModulesLimitExceeded", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "received", - "type": "uint256" - } - ], - "name": "UnexpectedContractVersion", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "currentModuleExitedValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "currentNodeOpExitedValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "currentNodeOpStuckValidatorsCount", - "type": "uint256" - } - ], - "name": "UnexpectedCurrentValidatorsCount", - "type": "error" - }, - { - "inputs": [], - "name": "UnrecoverableModuleError", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "field", - "type": "string" - } - ], - "name": "ValueOver100Percent", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "field", - "type": "string" - } - ], - "name": "ZeroAddress", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "version", - "type": "uint256" - } - ], - "name": "ContractVersionSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "stakingModuleId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "lowLevelRevertData", - "type": "bytes" - } - ], - "name": "ExitedAndStuckValidatorsCountsUpdateFailed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "stakingModuleId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "lowLevelRevertData", - "type": "bytes" - } - ], - "name": "RewardsMintedReportFailed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "stakingModuleId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "stakingModule", - "type": "address" - }, - { - "indexed": false, - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "indexed": false, - "internalType": "address", - "name": "createdBy", - "type": "address" - } - ], - "name": "StakingModuleAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "stakingModuleId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "unreportedExitedValidatorsCount", - "type": "uint256" - } - ], - "name": "StakingModuleExitedValidatorsIncompleteReporting", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "stakingModuleId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "stakingModuleFee", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "treasuryFee", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "setBy", - "type": "address" - } - ], - "name": "StakingModuleFeesSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "stakingModuleId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "enum StakingRouter.StakingModuleStatus", - "name": "status", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "address", - "name": "setBy", - "type": "address" - } - ], - "name": "StakingModuleStatusSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "stakingModuleId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "targetShare", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "setBy", - "type": "address" - } - ], - "name": "StakingModuleTargetShareSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "stakingModuleId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "StakingRouterETHDeposited", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "withdrawalCredentials", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "setBy", - "type": "address" - } - ], - "name": "WithdrawalCredentialsSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "stakingModuleId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "lowLevelRevertData", - "type": "bytes" - } - ], - "name": "WithdrawalsCredentialsChangeFailed", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEPOSIT_CONTRACT", - "outputs": [ - { - "internalType": "contract IDepositContract", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "FEE_PRECISION_POINTS", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MANAGE_WITHDRAWAL_CREDENTIALS_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_STAKING_MODULES_COUNT", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_STAKING_MODULE_NAME_LENGTH", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "REPORT_EXITED_VALIDATORS_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "REPORT_REWARDS_MINTED_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "STAKING_MODULE_MANAGE_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "STAKING_MODULE_PAUSE_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "STAKING_MODULE_RESUME_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TOTAL_BASIS_POINTS", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "UNSAFE_SET_EXITED_VALIDATORS_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "address", - "name": "_stakingModuleAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_targetShare", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_stakingModuleFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_treasuryFee", - "type": "uint256" - } - ], - "name": "addStakingModule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_depositsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_depositCalldata", - "type": "bytes" - } - ], - "name": "deposit", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "getAllNodeOperatorDigests", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isActive", - "type": "bool" - }, - { - "components": [ - { - "internalType": "bool", - "name": "isTargetLimitActive", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "targetValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stuckValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "refundedValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stuckPenaltyEndTimestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalExitedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalDepositedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "depositableValidatorsCount", - "type": "uint256" - } - ], - "internalType": "struct StakingRouter.NodeOperatorSummary", - "name": "summary", - "type": "tuple" - } - ], - "internalType": "struct StakingRouter.NodeOperatorDigest[]", - "name": "", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getAllStakingModuleDigests", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "nodeOperatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "activeNodeOperatorsCount", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint24", - "name": "id", - "type": "uint24" - }, - { - "internalType": "address", - "name": "stakingModuleAddress", - "type": "address" - }, - { - "internalType": "uint16", - "name": "stakingModuleFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "treasuryFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "targetShare", - "type": "uint16" - }, - { - "internalType": "uint8", - "name": "status", - "type": "uint8" - }, - { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "uint64", - "name": "lastDepositAt", - "type": "uint64" - }, - { - "internalType": "uint256", - "name": "lastDepositBlock", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "exitedValidatorsCount", - "type": "uint256" - } - ], - "internalType": "struct StakingRouter.StakingModule", - "name": "state", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "totalExitedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalDepositedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "depositableValidatorsCount", - "type": "uint256" - } - ], - "internalType": "struct StakingRouter.StakingModuleSummary", - "name": "summary", - "type": "tuple" - } - ], - "internalType": "struct StakingRouter.StakingModuleDigest[]", - "name": "", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getContractVersion", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_depositsCount", - "type": "uint256" - } - ], - "name": "getDepositsAllocation", - "outputs": [ - { - "internalType": "uint256", - "name": "allocated", - "type": "uint256" - }, - { - "internalType": "uint256[]", - "name": "allocations", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLido", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - }, - { - "internalType": "uint256[]", - "name": "_nodeOperatorIds", - "type": "uint256[]" - } - ], - "name": "getNodeOperatorDigests", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isActive", - "type": "bool" - }, - { - "components": [ - { - "internalType": "bool", - "name": "isTargetLimitActive", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "targetValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stuckValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "refundedValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stuckPenaltyEndTimestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalExitedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalDepositedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "depositableValidatorsCount", - "type": "uint256" - } - ], - "internalType": "struct StakingRouter.NodeOperatorSummary", - "name": "summary", - "type": "tuple" - } - ], - "internalType": "struct StakingRouter.NodeOperatorDigest[]", - "name": "digests", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_offset", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_limit", - "type": "uint256" - } - ], - "name": "getNodeOperatorDigests", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isActive", - "type": "bool" - }, - { - "components": [ - { - "internalType": "bool", - "name": "isTargetLimitActive", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "targetValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stuckValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "refundedValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stuckPenaltyEndTimestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalExitedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalDepositedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "depositableValidatorsCount", - "type": "uint256" - } - ], - "internalType": "struct StakingRouter.NodeOperatorSummary", - "name": "summary", - "type": "tuple" - } - ], - "internalType": "struct StakingRouter.NodeOperatorDigest[]", - "name": "", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_nodeOperatorId", - "type": "uint256" - } - ], - "name": "getNodeOperatorSummary", - "outputs": [ - { - "components": [ - { - "internalType": "bool", - "name": "isTargetLimitActive", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "targetValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stuckValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "refundedValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stuckPenaltyEndTimestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalExitedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalDepositedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "depositableValidatorsCount", - "type": "uint256" - } - ], - "internalType": "struct StakingRouter.NodeOperatorSummary", - "name": "summary", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getStakingFeeAggregateDistribution", - "outputs": [ - { - "internalType": "uint96", - "name": "modulesFee", - "type": "uint96" - }, - { - "internalType": "uint96", - "name": "treasuryFee", - "type": "uint96" - }, - { - "internalType": "uint256", - "name": "basePrecision", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getStakingFeeAggregateDistributionE4Precision", - "outputs": [ - { - "internalType": "uint16", - "name": "modulesFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "treasuryFee", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "getStakingModule", - "outputs": [ - { - "components": [ - { - "internalType": "uint24", - "name": "id", - "type": "uint24" - }, - { - "internalType": "address", - "name": "stakingModuleAddress", - "type": "address" - }, - { - "internalType": "uint16", - "name": "stakingModuleFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "treasuryFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "targetShare", - "type": "uint16" - }, - { - "internalType": "uint8", - "name": "status", - "type": "uint8" - }, - { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "uint64", - "name": "lastDepositAt", - "type": "uint64" - }, - { - "internalType": "uint256", - "name": "lastDepositBlock", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "exitedValidatorsCount", - "type": "uint256" - } - ], - "internalType": "struct StakingRouter.StakingModule", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "getStakingModuleActiveValidatorsCount", - "outputs": [ - { - "internalType": "uint256", - "name": "activeValidatorsCount", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "_stakingModuleIds", - "type": "uint256[]" - } - ], - "name": "getStakingModuleDigests", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "nodeOperatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "activeNodeOperatorsCount", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint24", - "name": "id", - "type": "uint24" - }, - { - "internalType": "address", - "name": "stakingModuleAddress", - "type": "address" - }, - { - "internalType": "uint16", - "name": "stakingModuleFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "treasuryFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "targetShare", - "type": "uint16" - }, - { - "internalType": "uint8", - "name": "status", - "type": "uint8" - }, - { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "uint64", - "name": "lastDepositAt", - "type": "uint64" - }, - { - "internalType": "uint256", - "name": "lastDepositBlock", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "exitedValidatorsCount", - "type": "uint256" - } - ], - "internalType": "struct StakingRouter.StakingModule", - "name": "state", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "totalExitedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalDepositedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "depositableValidatorsCount", - "type": "uint256" - } - ], - "internalType": "struct StakingRouter.StakingModuleSummary", - "name": "summary", - "type": "tuple" - } - ], - "internalType": "struct StakingRouter.StakingModuleDigest[]", - "name": "digests", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getStakingModuleIds", - "outputs": [ - { - "internalType": "uint256[]", - "name": "stakingModuleIds", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "getStakingModuleIsActive", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "getStakingModuleIsDepositsPaused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "getStakingModuleIsStopped", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "getStakingModuleLastDepositBlock", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_maxDepositsValue", - "type": "uint256" - } - ], - "name": "getStakingModuleMaxDepositsCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "getStakingModuleNonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "getStakingModuleStatus", - "outputs": [ - { - "internalType": "enum StakingRouter.StakingModuleStatus", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "getStakingModuleSummary", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "totalExitedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalDepositedValidators", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "depositableValidatorsCount", - "type": "uint256" - } - ], - "internalType": "struct StakingRouter.StakingModuleSummary", - "name": "summary", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getStakingModules", - "outputs": [ - { - "components": [ - { - "internalType": "uint24", - "name": "id", - "type": "uint24" - }, - { - "internalType": "address", - "name": "stakingModuleAddress", - "type": "address" - }, - { - "internalType": "uint16", - "name": "stakingModuleFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "treasuryFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "targetShare", - "type": "uint16" - }, - { - "internalType": "uint8", - "name": "status", - "type": "uint8" - }, - { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "uint64", - "name": "lastDepositAt", - "type": "uint64" - }, - { - "internalType": "uint256", - "name": "lastDepositBlock", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "exitedValidatorsCount", - "type": "uint256" - } - ], - "internalType": "struct StakingRouter.StakingModule[]", - "name": "res", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getStakingModulesCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getStakingRewardsDistribution", - "outputs": [ - { - "internalType": "address[]", - "name": "recipients", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "stakingModuleIds", - "type": "uint256[]" - }, - { - "internalType": "uint96[]", - "name": "stakingModuleFees", - "type": "uint96[]" - }, - { - "internalType": "uint96", - "name": "totalFee", - "type": "uint96" - }, - { - "internalType": "uint256", - "name": "precisionPoints", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalFeeE4Precision", - "outputs": [ - { - "internalType": "uint16", - "name": "totalFee", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getWithdrawalCredentials", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "hasStakingModule", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_admin", - "type": "address" - }, - { - "internalType": "address", - "name": "_lido", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "_withdrawalCredentials", - "type": "bytes32" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "onValidatorsCountsByNodeOperatorReportingFinished", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "pauseStakingModule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "_stakingModuleIds", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "_totalShares", - "type": "uint256[]" - } - ], - "name": "reportRewardsMinted", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_nodeOperatorIds", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "_exitedValidatorsCounts", - "type": "bytes" - } - ], - "name": "reportStakingModuleExitedValidatorsCountByNodeOperator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_nodeOperatorIds", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "_stuckValidatorsCounts", - "type": "bytes" - } - ], - "name": "reportStakingModuleStuckValidatorsCountByNodeOperator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - } - ], - "name": "resumeStakingModule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - }, - { - "internalType": "enum StakingRouter.StakingModuleStatus", - "name": "_status", - "type": "uint8" - } - ], - "name": "setStakingModuleStatus", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_withdrawalCredentials", - "type": "bytes32" - } - ], - "name": "setWithdrawalCredentials", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "_triggerUpdateFinish", - "type": "bool" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "currentModuleExitedValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "currentNodeOperatorExitedValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "currentNodeOperatorStuckValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "newModuleExitedValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "newNodeOperatorExitedValidatorsCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "newNodeOperatorStuckValidatorsCount", - "type": "uint256" - } - ], - "internalType": "struct StakingRouter.ValidatorsCountsCorrection", - "name": "_correction", - "type": "tuple" - } - ], - "name": "unsafeSetExitedValidatorsCount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "_stakingModuleIds", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "_exitedValidatorsCounts", - "type": "uint256[]" - } - ], - "name": "updateExitedValidatorsCountByStakingModule", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_refundedValidatorsCount", - "type": "uint256" - } - ], - "name": "updateRefundedValidatorsCount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_targetShare", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_stakingModuleFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_treasuryFee", - "type": "uint256" - } - ], - "name": "updateStakingModule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_stakingModuleId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "_isTargetLimitActive", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "_targetLimit", - "type": "uint256" - } - ], - "name": "updateTargetValidatorsLimits", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ] \ No newline at end of file diff --git a/csm-alerts/src/brief/proto/agent.proto b/csm-alerts/src/brief/proto/agent.proto deleted file mode 100644 index 95b9af4b6..000000000 --- a/csm-alerts/src/brief/proto/agent.proto +++ /dev/null @@ -1,348 +0,0 @@ -syntax = "proto3"; - -package network.forta; - -import public "alert.proto"; - -option go_package = "./;protocol"; - - -service Agent { - rpc Initialize (InitializeRequest) returns (InitializeResponse) {} - rpc EvaluateTx (EvaluateTxRequest) returns (EvaluateTxResponse) {} - rpc EvaluateBlock (EvaluateBlockRequest) returns (EvaluateBlockResponse) {} - rpc EvaluateAlert (EvaluateAlertRequest) returns (EvaluateAlertResponse) {} - rpc HealthCheck (HealthCheckRequest) returns (HealthCheckResponse) {} -} - -message Error { - string message = 1; -} - -enum ResponseStatus { - UNKNOWN = 0; - ERROR = 1; - SUCCESS = 2; -} - -message HealthCheckRequest {} - -message HealthCheckResponse { - enum ResponseStatus { - UNKNOWN = 0; - ERROR = 1; - SUCCESS = 2; - } - - ResponseStatus status = 1; - repeated Error errors = 2; -} - -message InitializeRequest { - string agentId = 1; - string proxyHost = 2; - int32 shardId = 3; -} - -message InitializeResponse { - ResponseStatus status = 1; - repeated Error errors = 2; - repeated string addresses = 3; - AlertConfig alertConfig = 4; -} - -message AlertConfig { - repeated CombinerBotSubscription subscriptions = 1; -} - -message CombinerBotSubscription { - string botId = 1; - string alertId = 2; - repeated string alertIds = 3; - uint64 chainId = 4; -} - -message EvaluateTxRequest { - string requestId = 1; - TransactionEvent event = 2; - int32 shardId = 3; -} - -message EvaluateBlockRequest { - string requestId = 1; - BlockEvent event = 2; - int32 shardId = 3; -} - -message EvaluateAlertRequest { - string requestId = 1; - AlertEvent event = 2; - string targetBotId = 3; - int32 shardId = 4; -} - -message EvaluateTxResponse { - ResponseStatus status = 1; - repeated Error errors = 2; - repeated Finding findings = 3; - map metadata = 4; - string timestamp = 5; - uint32 latencyMs = 6; - bool private = 7; -} - -message EvaluateBlockResponse { - ResponseStatus status = 1; - repeated Error errors = 2; - repeated Finding findings = 3; - map metadata = 4; - string timestamp = 5; - uint32 latencyMs = 6; - bool private = 7; -} - -message EvaluateAlertResponse { - ResponseStatus status = 1; - repeated Error errors = 2; - repeated Finding findings = 3; - map metadata = 4; - string timestamp = 5; - uint32 latencyMs = 6; - bool private = 7; -} - -message BlockEvent { - enum EventType { - BLOCK = 0; - REORG = 1 [deprecated = true]; - } - message Network { - string chainId = 1; - } - - message EthBlock { - string difficulty = 1; - string extraData = 2; - string gasLimit = 3; - string gasUsed = 4; - string hash = 5; - string logsBloom = 6; - string miner = 7; - string mixHash = 8; - string nonce = 9; - string number = 10; - string parentHash = 11; - string receiptsRoot = 12; - string sha3Uncles = 13; - string size = 14; - string stateRoot = 15; - string timestamp = 16; - string totalDifficulty = 17; - repeated string transactions = 18; - string transactionsRoot = 19; - repeated string uncles = 20; - string baseFeePerGas = 21; - } - - EventType type = 1; - string blockHash = 2; - string blockNumber = 3; - Network network = 4; - EthBlock block = 5; - TrackingTimestamps timestamps = 6; -} - -message TransactionEvent { - - enum EventType { - BLOCK = 0; - REORG = 1; - } - - message Network { - string chainId = 1; - } - - message EthBlock { - string blockHash = 1; - string blockNumber = 2; - string blockTimestamp = 3; - string baseFeePerGas = 4; - } - - message EthTransaction { - string type = 1; - string nonce = 2; - string gasPrice = 3; - string gas = 4; - string value = 5; - string input = 6; - string v = 7; - string r = 8; - string s = 9; - string to = 10; - string hash = 11; - string from = 12; - string maxFeePerGas = 13; - string maxPriorityFeePerGas = 14; - } - - message Log { - string address = 1; - repeated string topics = 2; - string data = 3; - string blockNumber = 4; - string transactionHash = 5; - string transactionIndex = 6; - string blockHash = 7; - string logIndex = 8; - bool removed = 9; - } - - message EthReceipt { - string root = 1; - string status = 2; - string cumulativeGasUsed = 3; - string logsBloom = 4; - repeated Log logs = 5; - string transactionHash = 6; - string contractAddress = 7; - string gasUsed = 8; - string blockHash = 9; - string blockNumber = 10; - string transactionIndex = 11; - } - - message TraceAction { - string callType = 1; - string to = 2; - string input = 3; - string from = 4; - string value = 5; - string init = 6; - string address = 7; - string balance = 8; - string refundAddress = 9; - } - - message TraceResult { - string gasUsed = 1; - string address = 2; - string code = 3; - string output = 4; - } - - message Trace { - TraceAction action = 1; - string blockHash = 2; - int64 blockNumber = 3; - TraceResult result = 4; - int64 subtraces = 5; - repeated int64 traceAddress = 6; - string transactionHash = 7; - int64 transactionPosition = 8; - string type = 9; - string error = 10; - } - - EventType type = 1; - EthTransaction transaction = 2; - EthReceipt receipt = 3 [deprecated = true]; - Network network = 4; - repeated Trace traces = 5; - map addresses = 6; - EthBlock block = 7; - repeated Log logs = 8; - bool isContractDeployment = 9; - string contractAddress = 10; - TrackingTimestamps timestamps = 11; - map txAddresses = 12; -} - -message AlertEvent { - message Alert { - message Contract { - string name = 1; - string projectId = 2; - } - - message Project { - string id = 1; - } - - message Block { - uint64 number = 1; - string hash = 2; - string timestamp = 3; - uint64 chainId = 4; - } - - message Bot { - repeated string chainIds = 1; - string createdAt = 2; - string description = 3; - string developer = 4; - string DocReference = 5; - bool enabled = 6; - string id = 7; - string image = 8; - string name = 9; - string reference = 10; - string repository = 11; - repeated string projects = 12; - repeated string scanNodes = 13; - string version = 14; - } - - message SourceAlertEvent { - string botId = 1; - string hash = 2; - string timestamp = 3; - uint64 chainId = 4; - } - - message Source { - string transactionHash = 1; - Bot bot = 2; - Block block = 3; - SourceAlertEvent sourceAlert = 4; - } - - message Label { - string label = 1; - float confidence = 2; - string entity = 3; - string entityType = 4; - bool remove = 5; - repeated string metadata = 6; - string uniqueKey = 7; - } - - // Unique string to identify this class of finding, - // primarily used to group similar findings for the end user - string alertId = 1; - // List of addresses involved in the alert - repeated string addresses = 2; - // List of contracts related to the alert - repeated Contract contracts = 3; - // Timestamp when the alert was published - string createdAt = 4; - string description = 5; - string hash = 6; - map metadata = 7; - string name = 8; - repeated Project projects = 9; - int32 scanNodeCount = 10; - string severity = 11; - Source source = 12; - string findingType = 13; - repeated string relatedAlerts = 14; - uint64 chainId = 15; - repeated Label labels = 16; - bool truncated = 17; - BloomFilter addressBloomFilter = 18; - } - - Alert alert = 1; - TrackingTimestamps timestamps = 2; -} diff --git a/csm-alerts/src/brief/proto/alert.proto b/csm-alerts/src/brief/proto/alert.proto deleted file mode 100644 index 16c089991..000000000 --- a/csm-alerts/src/brief/proto/alert.proto +++ /dev/null @@ -1,179 +0,0 @@ -syntax = "proto3"; - -package network.forta; - -option go_package = "./;protocol"; - -message TrackingTimestamps { - string block = 1; - string feed = 2; - string botRequest = 3; - string botResponse = 4; - string sourceAlert = 5; -} - -enum AlertType { - UNKNOWN_ALERT_TYPE = 0; - TRANSACTION = 1; - BLOCK = 2; - PRIVATE = 3; - COMBINATION = 4; - API = 5; -} - -message AgentInfo { - string image = 1; - string imageHash = 2; - string id = 3; - bool isTest = 4; - string manifest = 5; -} - -message ScannerInfo { - string address = 1; -} - -message AlertResponse { - repeated SignedAlert alerts = 1; - string nextPageToken = 2; -} - -message Signature { - string signature = 1; - string algorithm = 2; - string signer = 3; -} - -message BloomFilter { - string k = 1; - string m = 2; - string bitset = 3; - uint32 itemCount = 4; -} - -message Alert { - string id = 1; - AlertType type = 2; - Finding finding = 3; - string timestamp = 4; - map metadata = 5; - AgentInfo agent = 6; - map tags = 7; - ScannerInfo scanner = 8; - TrackingTimestamps timestamps = 9; - bool truncated = 10; - BloomFilter addressBloomFilter = 11; -} - -message SignedAlert { - Alert alert = 1; - Signature signature = 2; - string chainId = 3; - string blockNumber = 4; - string publishedWithTx = 5; -} - -message Label { - enum EntityType { - UNKNOWN_ENTITY_TYPE = 0; - ADDRESS = 1; - TRANSACTION = 2; - BLOCK = 3; - URL = 4; - } - - EntityType entityType = 1; - string entity = 2; - reserved 3; - float confidence = 4; - reserved 5; - bool remove = 6; - string label = 7; - repeated string metadata = 8; - string uniqueKey = 9; -} - -message Source { - message TransactionSource { - uint64 chainId = 1; - string hash = 2; - } - - message BlockSource { - uint64 chainId = 1; - string hash = 2; - uint64 number = 3; - } - - message URLSource { - string url = 1; - } - - message ChainSource { - uint64 chainId = 1; - } - - message AlertSource { - string id = 1; - } - - message CustomSource { - string name = 1; - string value = 2; - } - - repeated TransactionSource transactions = 1; - repeated BlockSource blocks = 2; - repeated URLSource urls = 3; - repeated ChainSource chains = 4; - repeated AlertSource alerts = 5; - repeated CustomSource customSources = 6; -} - -message Finding { - enum Severity { - UNKNOWN = 0; - INFO = 1; - LOW = 2; - MEDIUM = 3; - HIGH = 4; - CRITICAL = 5; - } - - enum FindingType { - UNKNOWN_TYPE = 0; - EXPLOIT = 1; - SUSPICIOUS = 2; - DEGRADED = 3; - INFORMATION = 4; - SCAM = 5; - } - - string protocol = 1; - Severity severity = 2; - map metadata = 3; - FindingType type = 4; - string alertId = 5; - string name = 6; - string description = 7; - reserved 8; - bool private = 9; - repeated string addresses = 10; - map indicators = 11; - repeated Label labels = 12; - repeated string relatedAlerts = 13; - string uniqueKey = 14; - Source source = 15; - string timestamp = 16; -} - -message APIAlert { - message APIAlertAgent { - string id = 1; - } - string id = 1; - AlertType type = 2; - Finding finding = 3; - APIAlertAgent agent = 4; - string timestamp = 5; -} \ No newline at end of file diff --git a/csm-alerts/src/clients/eth_provider.ts b/csm-alerts/src/clients/eth_provider.ts deleted file mode 100644 index 1c42e732e..000000000 --- a/csm-alerts/src/clients/eth_provider.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { ethers } from 'forta-agent' -import { either as E } from 'fp-ts' -import { retryAsync } from 'ts-retry' -import { - CSModule as CSModuleRunner, - CSAccounting as CSAccountingRunner, - CSFeeDistributor as CSFeeDistributorRunner, - CSFeeOracle as CSFeeOracleRunner, -} from '../generated/typechain' -import { NetworkError } from '../utils/errors' -import { Logger } from 'winston' -import { ICSAccountingClient } from '../services/CSAccounting/CSAccounting.srv' -import { Block } from '@ethersproject/providers' -import { ICSModuleClient } from '../services/CSModule/CSModule.srv' -import { ICSFeeOracleClient } from '../services/CSFeeOracle/CSFeeOracle.srv' -import { ICSFeeDistributorClient } from '../services/CSFeeDistributor/CSFeeDistributor.srv' -import { Metrics, StatusFail, StatusOK } from '../utils/metrics/metrics' -import { BlockDto } from '../entity/events' - -const DELAY_IN_500MS = 500 -const ATTEMPTS_5 = 5 - -export class ETHProvider implements ICSAccountingClient, ICSModuleClient, ICSFeeOracleClient, ICSFeeDistributorClient { - private jsonRpcProvider: ethers.providers.JsonRpcProvider - - private readonly csModuleRunner: CSModuleRunner - private readonly csAccountingRunner: CSAccountingRunner - private readonly csFeeDistributorRunner: CSFeeDistributorRunner - private csFeeOracleRunner: CSFeeOracleRunner - - private readonly logger: Logger - private readonly metrics: Metrics - - constructor( - logger: Logger, - metrcs: Metrics, - jsonRpcProvider: ethers.providers.JsonRpcProvider, - csModuleRunner: CSModuleRunner, - csAccountingRunner: CSAccountingRunner, - csFeeDistributorRunner: CSFeeDistributorRunner, - csFeeOracleRunner: CSFeeOracleRunner, - ) { - this.jsonRpcProvider = jsonRpcProvider - this.csModuleRunner = csModuleRunner - this.csAccountingRunner = csAccountingRunner - this.csFeeDistributorRunner = csFeeDistributorRunner - this.csFeeOracleRunner = csFeeOracleRunner - this.logger = logger - this.metrics = metrcs - } - - public async getBlockNumber(): Promise> { - const end = this.metrics.etherJsDurationHistogram.labels({ method: 'getBlockNumber' }).startTimer() - try { - const latestBlockNumber = await this.jsonRpcProvider.getBlockNumber() - - this.metrics.etherJsRequest.labels({ method: 'getBlockNumber', status: StatusOK }).inc() - end({ status: StatusOK }) - - return E.right(latestBlockNumber) - } catch (e) { - this.metrics.etherJsRequest.labels({ method: 'getBlockNumber', status: StatusFail }).inc() - end({ status: StatusFail }) - - return E.left(new NetworkError(e, `Could not fetch latest block number`)) - } - } - - public async getBlockByHash(blockHash: string): Promise> { - const end = this.metrics.etherJsDurationHistogram.startTimer({ method: 'getBlockByHash' }) - - try { - const out = await retryAsync( - async (): Promise => { - return await this.jsonRpcProvider.getBlock(blockHash) - }, - { delay: DELAY_IN_500MS, maxTry: ATTEMPTS_5 }, - ) - - this.metrics.etherJsRequest.labels({ method: 'getBlockByHash', status: StatusOK }).inc() - end({ status: StatusOK }) - - return E.right({ - number: out.number, - timestamp: out.timestamp, - parentHash: out.parentHash, - hash: out.hash, - }) - } catch (e) { - this.metrics.etherJsRequest.labels({ method: 'getBlockByHash', status: StatusFail }).inc() - end({ status: StatusFail }) - - return E.left(new NetworkError(e, `Could not call jsonRpcProvider.getBlock(blockHash)`)) - } - } - - public async getBlockByNumber(blockNumber: number): Promise> { - const end = this.metrics.etherJsDurationHistogram.startTimer({ method: this.getBlockByNumber.name }) - - try { - const out = await retryAsync( - async (): Promise => { - return await this.jsonRpcProvider.getBlock(blockNumber) - }, - { delay: DELAY_IN_500MS, maxTry: ATTEMPTS_5 }, - ) - - this.metrics.etherJsRequest.labels({ method: this.getBlockByNumber.name, status: StatusOK }).inc() - end({ status: StatusOK }) - - return E.right({ - number: out.number, - timestamp: out.timestamp, - parentHash: out.parentHash, - hash: out.hash, - }) - } catch (e) { - this.metrics.etherJsRequest.labels({ method: this.getBlockByNumber.name, status: StatusFail }).inc() - end({ status: StatusFail }) - - return E.left(new NetworkError(e, `Could not call jsonRpcProvider.${this.getBlockByNumber.name}`)) - } - } - - public async getChainPrevBlocks(parentHash: string, depth: number): Promise> { - const end = this.metrics.etherJsDurationHistogram.startTimer({ method: 'getChainPrevBlocks' }) - const chain = new Array(depth) - - while (depth > 0) { - try { - const prevBlock = await retryAsync( - async (): Promise => { - const parentBlock = await this.getBlockByHash(parentHash) - - if (E.isLeft(parentBlock)) { - throw parentBlock.left - } - - return parentBlock.right - }, - { delay: DELAY_IN_500MS, maxTry: ATTEMPTS_5 }, - ) - - chain[depth - 1] = prevBlock - parentHash = prevBlock.parentHash - depth -= 1 - } catch (e) { - this.metrics.etherJsRequest.labels({ method: 'getChainPrevBlocks', status: StatusFail }).inc() - end({ status: StatusFail }) - - return E.left(new NetworkError(e, `Could not call this.getBlockByHash(parentHash)`)) - } - } - - this.metrics.etherJsRequest.labels({ method: 'getChainPrevBlocks', status: StatusOK }).inc() - end({ status: StatusOK }) - - return E.right(chain) - } -} diff --git a/csm-alerts/src/clients/mocks/mock.ts b/csm-alerts/src/clients/mocks/mock.ts deleted file mode 100644 index 494f9f0e0..000000000 --- a/csm-alerts/src/clients/mocks/mock.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { IEtherscanProvider } from '../eth_provider' - -export const EtherscanProviderMock = (): jest.Mocked => ({ - getBalance: jest.fn(), -}) diff --git a/csm-alerts/src/config.ts b/csm-alerts/src/config.ts new file mode 100644 index 000000000..fe55b3767 --- /dev/null +++ b/csm-alerts/src/config.ts @@ -0,0 +1,7 @@ +export const RUN_TIER = process.env.FORTA_AGENT_RUN_TIER || null +export const APP_NAME = process.env.APP_NAME || 'csm-alerts' +export const NODE_ENV = process.env.NODE_ENV || 'production' +export const LOG_LEVEL = process.env.LOG_LEVEL || 'info' +export const LOG_FORMAT = process.env.LOG_FORMAT || 'simple' +export const RPC_URL = process.env.RPC_URL || 'https://holesky.drpc.org' +export const IS_CLI = !!(process.env.FORTA_CLI_BLOCK || process.env.FORTA_CLI_TX) diff --git a/csm-alerts/src/entity/events.ts b/csm-alerts/src/entity/events.ts index 76b120f67..29d447ae5 100644 --- a/csm-alerts/src/entity/events.ts +++ b/csm-alerts/src/entity/events.ts @@ -1,99 +1,35 @@ -import { Log } from '@ethersproject/abstract-provider' -import * as agent_pb from '../generated/proto/agent_pb' -import { TransactionEvent } from '../generated/proto/agent_pb' -import BigNumber from 'bignumber.js' -import { formatAddress } from 'forta-agent/dist/cli/utils' -import { Finding } from '../generated/proto/alert_pb' -import { ethers } from 'ethers' +import { Finding, TransactionEvent, ethers } from '@fortanetwork/forta-bot' -export type EventOfNotice = { - name: string - address: string - abi: string - alertId: string - description: CallableFunction - severity: Finding.Severity - type: Finding.FindingType -} - -export type BlockDto = { - number: number - timestamp: number - parentHash: string - hash: string -} - -export type TransactionDto = { - logs: Log[] - to: string | null - block: { - timestamp: number - number: number - } - hash: string -} - -export function newTransactionDto(request: agent_pb.EvaluateTxRequest): TransactionDto { - const txEvent = request.getEvent() - const transaction = txEvent.getTransaction() - const logList = >txEvent.getLogsList() - const block = txEvent.getBlock() - - const logs: Log[] = [] - for (const l of logList) { - logs.push({ - blockNumber: new BigNumber(l.getBlocknumber(), 10).toNumber(), - blockHash: l.getTransactionhash(), - transactionIndex: new BigNumber(l.getTransactionindex(), 10).toNumber(), - removed: l.getRemoved(), - address: l.getAddress(), - data: l.getData(), - topics: l.getTopicsList(), - transactionHash: l.getTransactionhash(), - logIndex: new BigNumber(l.getLogindex(), 10).toNumber(), - }) - } +import { EventOfNotice } from '../shared/types' +import { sourceFromEvent } from '../utils/findings' - return { - logs: logs, - to: transaction.getTo() ? formatAddress(transaction.getTo()) : null, - block: { - number: new BigNumber(block.getBlocknumber(), 10).toNumber(), - timestamp: new BigNumber(block.getBlocktimestamp(), 10).toNumber(), - }, - hash: transaction.getHash(), - } -} - -export function handleEventsOfNotice(txEvent: TransactionDto, eventsOfNotice: EventOfNotice[]): Finding[] { +export function handleEventsOfNotice(txEvent: TransactionEvent, eventsOfNotice: EventOfNotice[]): Finding[] { const out: Finding[] = [] - const addresses = new Set(eventsOfNotice.map((event) => event.address.toLowerCase())) - for (const log of txEvent.logs) { - if (addresses.has(log.address.toLowerCase())) { - for (const eventInfo of eventsOfNotice) { - const parser = new ethers.utils.Interface([eventInfo.abi]) - - try { - const logDesc = parser.parseLog(log) - const f: Finding = new Finding() - - f.setName(eventInfo.name) - f.setDescription(eventInfo.description(logDesc.args)) - f.setAlertid(eventInfo.alertId) - f.setSeverity(eventInfo.severity) - f.setType(eventInfo.type) - f.setProtocol('ethereum') - const m = f.getMetadataMap() - m.set('args', String(logDesc.args)) + for (const eventInfo of eventsOfNotice) { + if (log.address.toLowerCase() != eventInfo.address.toLowerCase()) { + continue + } - out.push(f) - } catch (e) { - // Only one from eventsOfNotice could be correct - // Others - skipping - } + const parser = new ethers.Interface(typeof eventInfo.abi === 'string' ? [eventInfo.abi] : eventInfo.abi) + const logDesc = parser.parseLog(log) + if (!logDesc) { + continue } + + const f = Finding.fromObject({ + name: eventInfo.name, + description: eventInfo.description(logDesc.args), + alertId: eventInfo.alertId, + severity: eventInfo.severity, + type: eventInfo.type, + source: sourceFromEvent(txEvent), + addresses: Object.keys(txEvent.addresses), + metadata: { args: String(logDesc.args) }, + }) + + out.push(f) } } diff --git a/csm-alerts/src/entity/metadata.ts b/csm-alerts/src/entity/metadata.ts deleted file mode 100644 index 32745c4d7..000000000 --- a/csm-alerts/src/entity/metadata.ts +++ /dev/null @@ -1 +0,0 @@ -export type Metadata = { [key: string]: string } diff --git a/csm-alerts/src/handlers/alert.handler.ts b/csm-alerts/src/handlers/alert.handler.ts deleted file mode 100644 index 2ee864d13..000000000 --- a/csm-alerts/src/handlers/alert.handler.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { sendUnaryData, ServerUnaryCall } from '@grpc/grpc-js' -import { EvaluateAlertRequest, EvaluateAlertResponse, ResponseStatus } from '../generated/proto/agent_pb' - -export class AlertHandler { - public handleAlert() { - return async ( - call: ServerUnaryCall, - callback: sendUnaryData, - ) => { - const resp = new EvaluateAlertResponse() - resp.setStatus(ResponseStatus.SUCCESS) - resp.setFindingsList([]) - resp.setTimestamp(new Date().toISOString()) - - callback(null, resp) - } - } -} diff --git a/csm-alerts/src/handlers/block.handler.ts b/csm-alerts/src/handlers/block.handler.ts deleted file mode 100644 index a723aac04..000000000 --- a/csm-alerts/src/handlers/block.handler.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { sendUnaryData, ServerUnaryCall } from '@grpc/grpc-js' -import { BlockEvent, EvaluateBlockRequest, EvaluateBlockResponse, ResponseStatus } from '../generated/proto/agent_pb' -import { CSModuleSrv } from '../services/CSModule/CSModule.srv' -import { HealthChecker } from '../services/health-checker/health-checker.srv' -import { CSAccountingSrv } from '../services/CSAccounting/CSAccounting.srv' -import { CSFeeOracleSrv } from '../services/CSFeeOracle/CSFeeOracle.srv' -import { CSFeeDistributorSrv } from '../services/CSFeeDistributor/CSFeeDistributor.srv' -import { Logger } from 'winston' -import { elapsedTime } from '../utils/time' -import { BlockDto } from '../entity/events' -import BigNumber from 'bignumber.js' -import { Finding } from '../generated/proto/alert_pb' -import { HandleBlockLabel, Metrics, StatusFail, StatusOK } from '../utils/metrics/metrics' - -export class BlockHandler { - private logger: Logger - private metrics: Metrics - private csModuleSrv: CSModuleSrv - private csAccountingSrv: CSAccountingSrv - private csFeeDistributorSrv: CSFeeDistributorSrv - private csFeeOracleSrv: CSFeeOracleSrv - private healthChecker: HealthChecker - - private onAppStartFindings: Finding[] = [] - - constructor( - logger: Logger, - metrics: Metrics, - csModuleSrv: CSModuleSrv, - csAccountingSrv: CSAccountingSrv, - csFeeDistributorSrv: CSFeeDistributorSrv, - csFeeOracleSrv: CSFeeOracleSrv, - healthChecker: HealthChecker, - onAppStartFindings: Finding[], - ) { - this.logger = logger - this.metrics = metrics - this.csModuleSrv = csModuleSrv - this.csAccountingSrv = csAccountingSrv - this.csFeeDistributorSrv = csFeeDistributorSrv - this.csFeeOracleSrv = csFeeOracleSrv - this.healthChecker = healthChecker - this.onAppStartFindings = onAppStartFindings - } - - public handleBlock() { - return async ( - call: ServerUnaryCall, - callback: sendUnaryData, - ) => { - this.metrics.lastAgentTouch.labels({ method: HandleBlockLabel }).set(new Date().getTime()) - const end = this.metrics.summaryHandlers.labels({ method: HandleBlockLabel }).startTimer() - - const event = call.request.getEvent() - const block = event.getBlock() - - const blockDtoEvent: BlockDto = { - number: new BigNumber(block.getNumber(), 10).toNumber(), - timestamp: new BigNumber(block.getTimestamp(), 10).toNumber(), - parentHash: block.getParenthash(), - hash: block.getHash(), - } - - this.logger.info(`#ETH block: ${blockDtoEvent.number}`) - const startTime = new Date().getTime() - - const findings: Finding[] = [] - if (this.onAppStartFindings.length > 0) { - findings.push(...this.onAppStartFindings) - this.onAppStartFindings = [] - } - - const [csModuleFindings, csAccountingFindings, csFeeDistributorFindings, csFeeOracleFindings] = await Promise.all( - [ - this.csModuleSrv.handleBlock(blockDtoEvent), - this.csAccountingSrv.handleBlock(blockDtoEvent), - this.csFeeDistributorSrv.handleBlock(blockDtoEvent), - this.csFeeOracleSrv.handleBlock(blockDtoEvent), - ], - ) - - findings.push(...csModuleFindings, ...csAccountingFindings, ...csFeeDistributorFindings, ...csFeeOracleFindings) - - const errCount = this.healthChecker.check(findings) - errCount === 0 - ? this.metrics.processedIterations.labels({ method: HandleBlockLabel, status: StatusOK }).inc() - : this.metrics.processedIterations.labels({ method: HandleBlockLabel, status: StatusFail }).inc() - - const blockResponse = new EvaluateBlockResponse() - blockResponse.setStatus(ResponseStatus.SUCCESS) - blockResponse.setPrivate(false) - blockResponse.setFindingsList(findings) - const m = blockResponse.getMetadataMap() - m.set('timestamp', new Date().toISOString()) - - this.logger.info(elapsedTime('handleBlock', startTime) + '\n') - this.metrics.lastBlockNumber.set(blockDtoEvent.number) - - end() - callback(null, blockResponse) - } - } -} diff --git a/csm-alerts/src/handlers/health.handler.ts b/csm-alerts/src/handlers/health.handler.ts deleted file mode 100644 index 403730746..000000000 --- a/csm-alerts/src/handlers/health.handler.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { HealthChecker } from '../services/health-checker/health-checker.srv' -import { sendUnaryData, ServerUnaryCall } from '@grpc/grpc-js' -import * as agent_pb from '../generated/proto/agent_pb' -import { HealthCheckRequest, HealthCheckResponse, ResponseStatus } from '../generated/proto/agent_pb' -import { Metrics } from '../utils/metrics/metrics' -import express, { Request, Response } from 'express' -import BigNumber from 'bignumber.js' -import { Logger } from 'winston' - -export class HealthHandler { - private healthChecker: HealthChecker - private metrics: Metrics - private logger: Logger - private readonly ethereumRpcUrl: string - private readonly chainId: number - - constructor(healthChecker: HealthChecker, metrics: Metrics, logger: Logger, ethereumRpcUrl: string, chainId: number) { - this.healthChecker = healthChecker - this.metrics = metrics - this.logger = logger - this.ethereumRpcUrl = ethereumRpcUrl - this.chainId = chainId - } - - public healthGrpc() { - return async ( - call: ServerUnaryCall, - callback: sendUnaryData, - ) => { - const resp = new HealthCheckResponse() - resp.setStatus(ResponseStatus.SUCCESS) - this.metrics.healthStatus.set(1) - - if (!this.healthChecker.isHealth()) { - const e: agent_pb.Error = new agent_pb.Error() - e.setMessage('There is too much network errors') - - const errList: Array = [] - errList.push(e) - - resp.setErrorsList(errList) - this.metrics.healthStatus.set(0) - } - - callback(null, resp) - } - } - - public healthHttp(): express.Handler { - return async (req: Request, res: Response) => { - try { - type data = { - jsonrpc: string - id: number - result: string - } - - const resp = await fetch(this.ethereumRpcUrl, { - method: 'POST', - body: JSON.stringify({ - method: 'eth_chainId', - }), - }) - - // @ts-expect-error @typescript-eslint/ban-ts-comment - const data: data = await resp.json() - const chainId = new BigNumber(data.result) - if (chainId.toNumber() === this.chainId) { - return res.status(200).send('ok') - } - } catch (e) { - this.logger.error(e) - } - - return res.status(503).send('not ok') - } - } -} diff --git a/csm-alerts/src/handlers/init.handler.ts b/csm-alerts/src/handlers/init.handler.ts deleted file mode 100644 index fed415e12..000000000 --- a/csm-alerts/src/handlers/init.handler.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { sendUnaryData, ServerUnaryCall } from '@grpc/grpc-js' -import { InitializeRequest, InitializeResponse, ResponseStatus } from '../generated/proto/agent_pb' -import { Logger } from 'winston' -import { CSFeeDistributorSrv } from '../services/CSFeeDistributor/CSFeeDistributor.srv' -import { CSModuleSrv } from '../services/CSModule/CSModule.srv' -import { CSAccountingSrv } from '../services/CSAccounting/CSAccounting.srv' -import { CSFeeOracleSrv } from '../services/CSFeeOracle/CSFeeOracle.srv' -import { Metadata } from '../entity/metadata' -import Version from '../utils/version' -import { elapsedTime } from '../utils/time' -import { Finding } from '../generated/proto/alert_pb' -import { ProxyWatcherSrv } from '../services/ProxyWatcher/ProxyWatcher.srv' - -export class InitHandler { - private readonly logger: Logger - private readonly csModuleSrv: CSModuleSrv - private readonly csFeeDistributorSrv: CSFeeDistributorSrv - private readonly csAccountingSrv: CSAccountingSrv - private readonly csFeeOracleSrv: CSFeeOracleSrv - private readonly proxyWatcherSrv: ProxyWatcherSrv - private readonly appName: string - private readonly latestBlockNumber: number - - private onAppStartFindings: Finding[] = [] - - constructor( - appName: string, - logger: Logger, - csModuleSrv: CSModuleSrv, - csFeeDistributorSrv: CSFeeDistributorSrv, - csAccountingSrv: CSAccountingSrv, - csFeeOracleSrv: CSFeeOracleSrv, - proxyWatcherSrv: ProxyWatcherSrv, - onAppStartFindings: Finding[], - latestBlockNumber: number, - ) { - this.appName = appName - this.logger = logger - this.csModuleSrv = csModuleSrv - this.csFeeDistributorSrv = csFeeDistributorSrv - this.csAccountingSrv = csAccountingSrv - this.csFeeOracleSrv = csFeeOracleSrv - this.proxyWatcherSrv = proxyWatcherSrv - this.onAppStartFindings = onAppStartFindings - this.latestBlockNumber = latestBlockNumber - } - - public handleInit() { - return async ( - call: ServerUnaryCall, - callback: sendUnaryData, - ) => { - const startTime = new Date().getTime() - - const metadata: Metadata = { - 'version.commitHash': Version.commitHash, - 'version.commitMsg': Version.commitMsg, - } - - const agents: string[] = [ - this.csModuleSrv.getName(), - this.csFeeDistributorSrv.getName(), - this.csAccountingSrv.getName(), - this.csFeeOracleSrv.getName(), - this.proxyWatcherSrv.getName(), - ] - metadata.agents = '[' + agents.toString() + ']' - - await this.csModuleSrv.initialize(this.latestBlockNumber) - await this.csFeeDistributorSrv.initialize(this.latestBlockNumber) - await this.csAccountingSrv.initialize(this.latestBlockNumber) - await this.csFeeOracleSrv.initialize(this.latestBlockNumber) - await this.proxyWatcherSrv.initialize(this.latestBlockNumber) - - const f: Finding = new Finding() - f.setName(`${this.appName} launched`) - f.setDescription(`Version: ${Version.desc}`) - f.setAlertid('LIDO-AGENT-LAUNCHED') - f.setSeverity(Finding.Severity.INFO) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') - - this.onAppStartFindings.push(f) - - this.logger.info(elapsedTime('Agent.initialize', startTime) + '\n') - - const resp = new InitializeResponse() - resp.setStatus(ResponseStatus.SUCCESS) - - callback(null, resp) - } - } -} diff --git a/csm-alerts/src/handlers/tx.handler.ts b/csm-alerts/src/handlers/tx.handler.ts deleted file mode 100644 index bc8ae1625..000000000 --- a/csm-alerts/src/handlers/tx.handler.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { sendUnaryData, ServerUnaryCall } from '@grpc/grpc-js' -import { CSModuleSrv } from '../services/CSModule/CSModule.srv' -import { HealthChecker } from '../services/health-checker/health-checker.srv' -import { CSAccountingSrv } from '../services/CSAccounting/CSAccounting.srv' -import { CSFeeOracleSrv } from '../services/CSFeeOracle/CSFeeOracle.srv' -import { CSFeeDistributorSrv } from '../services/CSFeeDistributor/CSFeeDistributor.srv' -import { EvaluateTxRequest, EvaluateTxResponse, ResponseStatus } from '../generated/proto/agent_pb' -import { newTransactionDto } from '../entity/events' -import { Finding } from '../generated/proto/alert_pb' -import { HandleTxLabel, Metrics, StatusFail, StatusOK } from '../utils/metrics/metrics' -import { ProxyWatcherSrv } from '../services/ProxyWatcher/ProxyWatcher.srv' - -export class TxHandler { - private metrics: Metrics - private csModuleSrv: CSModuleSrv - private csFeeDistributorSrv: CSFeeDistributorSrv - private csAccountingSrv: CSAccountingSrv - private csFeeOracleSrv: CSFeeOracleSrv - private proxyWatcherSrv: ProxyWatcherSrv - private healthChecker: HealthChecker - - constructor( - metrics: Metrics, - csModuleSrv: CSModuleSrv, - csFeeDistributorSrv: CSFeeDistributorSrv, - csAccountingSrv: CSAccountingSrv, - csFeeOracleSrv: CSFeeOracleSrv, - proxyWatcherSrv: ProxyWatcherSrv, - healthChecker: HealthChecker, - ) { - this.metrics = metrics - this.csModuleSrv = csModuleSrv - this.csFeeDistributorSrv = csFeeDistributorSrv - this.csAccountingSrv = csAccountingSrv - this.csFeeOracleSrv = csFeeOracleSrv - this.proxyWatcherSrv = proxyWatcherSrv - this.healthChecker = healthChecker - } - - public handleTx() { - return async ( - call: ServerUnaryCall, - callback: sendUnaryData, - ) => { - const end = this.metrics.summaryHandlers.labels({ method: HandleTxLabel }).startTimer() - this.metrics.lastAgentTouch.labels({ method: HandleTxLabel }).set(new Date().getTime()) - - const txEvent = newTransactionDto(call.request) - - const findings: Finding[] = [] - - const csModuleFindings = this.csModuleSrv.handleTransaction(txEvent) - const csFeeDistributorFindings = await this.csFeeDistributorSrv.handleTransaction(txEvent) - const csAccountingFindings = this.csAccountingSrv.handleTransaction(txEvent) - const csFeeOracleFindings = this.csFeeOracleSrv.handleTransaction(txEvent) - const proxyWatcherFindings = this.proxyWatcherSrv.handleTransaction(txEvent) - - findings.push( - ...(await csModuleFindings), - ...csFeeDistributorFindings, - ...(await csAccountingFindings), - ...csFeeOracleFindings, - ...proxyWatcherFindings, - ) - - const errCount = this.healthChecker.check(findings) - errCount === 0 - ? this.metrics.processedIterations.labels({ method: HandleTxLabel, status: StatusOK }).inc() - : this.metrics.processedIterations.labels({ method: HandleTxLabel, status: StatusFail }).inc() - - const txResponse = new EvaluateTxResponse() - txResponse.setStatus(ResponseStatus.SUCCESS) - txResponse.setPrivate(false) - txResponse.setFindingsList(findings) - const m = txResponse.getMetadataMap() - m.set('timestamp', new Date().toISOString()) - - end() - callback(null, txResponse) - } - } -} diff --git a/csm-alerts/src/logger.ts b/csm-alerts/src/logger.ts new file mode 100644 index 000000000..2b4747892 --- /dev/null +++ b/csm-alerts/src/logger.ts @@ -0,0 +1,14 @@ +import * as Winston from 'winston' + +import { LOG_FORMAT, LOG_LEVEL } from './config' + +export function getLogger(service: string) { + return Winston.createLogger({ + format: Winston.format.combine( + Winston.format.label({ label: service, message: true }), + LOG_FORMAT === 'simple' ? Winston.format.simple() : Winston.format.json(), + ), + transports: [new Winston.transports.Console()], + level: LOG_LEVEL, + }) +} diff --git a/csm-alerts/src/main.ts b/csm-alerts/src/main.ts index 3d3bb21a5..a2b8450cc 100644 --- a/csm-alerts/src/main.ts +++ b/csm-alerts/src/main.ts @@ -1,259 +1,145 @@ -import * as grpc from '@grpc/grpc-js' -import { either as E } from 'fp-ts' -import { BlockHandler } from './handlers/block.handler' -import { HealthHandler } from './handlers/health.handler' -import { TxHandler } from './handlers/tx.handler' -import { InitHandler } from './handlers/init.handler' -import { AlertHandler } from './handlers/alert.handler' -import { AgentService } from './generated/proto/agent_grpc_pb' -import { Express, Request, Response } from 'express' -import Version from './utils/version' -import { Finding } from './generated/proto/alert_pb' import { - CSModule__factory, - CSAccounting__factory, - CSFeeDistributor__factory, - CSFeeOracle__factory, -} from './generated/typechain' -import { Config } from './utils/env/env' -import * as Winston from 'winston' -import { ethers } from 'ethers' -import { ETHProvider } from './clients/eth_provider' -import { getCSFeeDistributorEvents } from './utils/events/cs_fee_distributor_events' -import { getCSFeeOracleEvents, getHashConsensusEvents } from './utils/events/cs_fee_oracle_events' -import { getCSModuleEvents } from './utils/events/cs_module_events' -import { getOssifiedProxyEvents } from './utils/events/ossified_proxy_events' -import { getPausableEvents } from './utils/events/pausable_events' -import { getCSAccountingEvents } from './utils/events/cs_accounting_events' -import { getAssetRecovererEvents } from './utils/events/asset_recoverer_events' -import { getRolesMonitoringEvents } from './utils/events/roles_monitoring_events' -import * as promClient from 'prom-client' -import { Metrics } from './utils/metrics/metrics' -import { CSModuleSrv } from './services/CSModule/CSModule.srv' -import { CSFeeDistributorSrv } from './services/CSFeeDistributor/CSFeeDistributor.srv' + BlockEvent, + Finding, + TransactionEvent, + ethers, + getProvider, + isProduction, + scanEthereum, +} from '@fortanetwork/forta-bot' + +import { RPC_URL } from './config' +import { getLogger } from './logger' import { CSAccountingSrv } from './services/CSAccounting/CSAccounting.srv' +import { CSFeeDistributorSrv } from './services/CSFeeDistributor/CSFeeDistributor.srv' import { CSFeeOracleSrv } from './services/CSFeeOracle/CSFeeOracle.srv' -import { BorderTime, HealthChecker, MaxNumberErrorsPerBorderTime } from './services/health-checker/health-checker.srv' -import { getEthersProvider } from 'forta-agent/dist/sdk/utils' -import express = require('express') -import { ProxyWatcherSrv } from './services/ProxyWatcher/ProxyWatcher.srv' -import { - CONTRACTS_WITH_ASSET_RECOVERER, - CSM_PROXY_CONTRACTS, - PAUSABLE_CONTRACTS, - DeploymentAddresses, - ROLES_MONITORING_CONTRACTS, -} from './utils/constants.mainnet' -import { - CONTRACTS_WITH_ASSET_RECOVERER as HOLESKY_CONTRACTS_WITH_ASSET_RECOVERER, - CSM_PROXY_CONTRACTS as HOLESKY_CSM_PROXY_CONTRACTS, - PAUSABLE_CONTRACTS as HOLESKY_PAUSABLE_CONTRACTS, - DeploymentAddresses as HoleskyDeploymentAddresses, - ROLES_MONITORING_CONTRACTS as HOLESKY_ROLES_MONITORING_CONTRACTS, -} from './utils/constants.holesky' +import { CSModuleSrv } from './services/CSModule/CSModule.srv' +import { EventsWatcherSrv } from './services/EventsWatcher/EventsWatcher.srv' +import { errorAlert, launchAlert } from './utils/findings' -const loadDeploymentData = (chainId: number) => { - switch (chainId) { - case 1: - return { - deploymentAddresses: DeploymentAddresses, - contractsWithAssetRecoverer: CONTRACTS_WITH_ASSET_RECOVERER, - csmProxyContracts: CSM_PROXY_CONTRACTS, - pausableContracts: PAUSABLE_CONTRACTS, - rolesMonitoringContracts: ROLES_MONITORING_CONTRACTS, - } - case 17000: - return { - deploymentAddresses: HoleskyDeploymentAddresses, - contractsWithAssetRecoverer: HOLESKY_CONTRACTS_WITH_ASSET_RECOVERER, - csmProxyContracts: HOLESKY_CSM_PROXY_CONTRACTS, - pausableContracts: HOLESKY_PAUSABLE_CONTRACTS, - rolesMonitoringContracts: HOLESKY_ROLES_MONITORING_CONTRACTS, - } - default: - throw new Error(`Unsupported chain ID: ${chainId}`) - } -} +const logger = getLogger('main') -const main = async () => { - const config = new Config() - if (config.dataProvider === '') { - console.log('Could not set up dataProvider') - process.exit(1) - } +async function main() { + const { handleTransaction, handleBlock } = await getHandlers() - const logger: Winston.Logger = Winston.createLogger({ - format: config.logFormat === 'simple' ? Winston.format.simple() : Winston.format.json(), - transports: [new Winston.transports.Console()], + scanEthereum({ + handleTransaction, + handleBlock, + rpcUrl: RPC_URL, }) - const defaultRegistry = promClient - defaultRegistry.collectDefaultMetrics({ - prefix: config.promPrefix, - }) - - const customRegister = new promClient.Registry() - const mergedRegistry = promClient.Registry.merge([defaultRegistry.register, customRegister]) - mergedRegistry.setDefaultLabels({ instance: config.instance, dataProvider: config.dataProvider }) - - const metrics = new Metrics(mergedRegistry, config.promPrefix) - - const ethProvider = new ethers.providers.JsonRpcProvider(config.ethereumRpcUrl) - let fortaEthersProvider = getEthersProvider() - if (!config.useFortaProvider) { - fortaEthersProvider = ethProvider + if (!isProduction) { + return } - const { - deploymentAddresses, - contractsWithAssetRecoverer, - csmProxyContracts, - pausableContracts, - rolesMonitoringContracts, - } = loadDeploymentData(config.chainId) - - const address = deploymentAddresses - - const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) - const csAccountingRunner = CSAccounting__factory.connect(address.CS_ACCOUNTING_ADDRESS, fortaEthersProvider) - const csFeeDistributorRunner = CSFeeDistributor__factory.connect( - address.CS_FEE_DISTRIBUTOR_ADDRESS, - fortaEthersProvider, - ) - const csFeeOracleRunner = CSFeeOracle__factory.connect(address.CS_FEE_ORACLE_ADDRESS, fortaEthersProvider) - - const ethClient = new ETHProvider( - logger, - metrics, - fortaEthersProvider, - csModuleRunner, - csAccountingRunner, - csFeeDistributorRunner, - csFeeOracleRunner, - ) - - const csModuleSrv = new CSModuleSrv( - logger, - ethClient, - address.CS_MODULE_ADDRESS, - address.STAKING_ROUTER_ADDRESS, - getCSModuleEvents(address.CS_MODULE_ADDRESS), - ) - - const csFeeDistributorSrv = new CSFeeDistributorSrv( - logger, - ethClient, - getCSFeeDistributorEvents(address.CS_FEE_DISTRIBUTOR_ADDRESS), - address.CS_ACCOUNTING_ADDRESS, - address.CS_FEE_DISTRIBUTOR_ADDRESS, - address.LIDO_STETH_ADDRESS, - address.HASH_CONSENSUS_ADDRESS, - ) - - const csAccountingSrv = new CSAccountingSrv( - logger, - ethClient, - getCSAccountingEvents(address.CS_ACCOUNTING_ADDRESS), - address.CS_ACCOUNTING_ADDRESS, - address.LIDO_STETH_ADDRESS, - address.CS_MODULE_ADDRESS, - ) - - const csFeeOracleSrv = new CSFeeOracleSrv( - logger, - ethClient, - getHashConsensusEvents(address.HASH_CONSENSUS_ADDRESS), - getCSFeeOracleEvents(address.CS_FEE_ORACLE_ADDRESS), - address.HASH_CONSENSUS_ADDRESS, - address.CS_FEE_ORACLE_ADDRESS, - ) + // Run metrics server here if needed. +} - const proxyWatcherSrv = new ProxyWatcherSrv( - logger, - ethClient, - getOssifiedProxyEvents(csmProxyContracts), - getPausableEvents(pausableContracts), - getAssetRecovererEvents(contractsWithAssetRecoverer), - getRolesMonitoringEvents(rolesMonitoringContracts), - ) +if (require.main === module) { + main().catch(logger.error) +} - const onAppFindings: Finding[] = [] +async function getHandlers() { + const { blockIdentifier } = await parseArgs() + + const services = [ + new CSFeeDistributorSrv(), + new EventsWatcherSrv(), + new CSAccountingSrv(), + new CSFeeOracleSrv(), + new CSModuleSrv(), + ] + + for (const srv of services) { + if ('initialize' in srv) { + await srv.initialize( + blockIdentifier ?? 'latest', + await getProvider({ + rpcUrl: RPC_URL, + }), + ) + } + } - const healthChecker = new HealthChecker(logger, metrics, BorderTime, MaxNumberErrorsPerBorderTime) + logger.debug('Initialization complete') + let isLaunchReported = false + + async function handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider) { + // prettier-ignore + const results = await Promise.allSettled( + services.filter((srv) => 'handleTransaction' in srv) + .map((srv) => srv.handleTransaction(txEvent, provider)), + ) + + const out: Finding[] = [] + for (const r of results) { + if (r.status === 'fulfilled') { + out.push(...r.value) + } else { + // TODO: Some exceptions should crash an application in fact. + // out.push(errorAlert(`Error processing tx ${txEvent.transaction.hash}`, r.reason)) + logger.error(r.reason) + } + } + return out + } - const gRPCserver = new grpc.Server() - const blockH = new BlockHandler( - logger, - metrics, - csModuleSrv, - csAccountingSrv, - csFeeDistributorSrv, - csFeeOracleSrv, - healthChecker, - onAppFindings, - ) - const txH = new TxHandler( - metrics, - csModuleSrv, - csFeeDistributorSrv, - csAccountingSrv, - csFeeOracleSrv, - proxyWatcherSrv, - healthChecker, - ) - const healthH = new HealthHandler(healthChecker, metrics, logger, config.ethereumRpcUrl, config.chainId) + async function handleBlock(blockEvent: BlockEvent, provider: ethers.Provider) { + logger.debug(`Running handlers for block ${blockEvent.blockNumber}`) + + // prettier-ignore + const results = await Promise.allSettled( + services.filter((srv) => 'handleBlock' in srv) + .map((srv) => srv.handleBlock(blockEvent, provider)), + ) + + const out: Finding[] = [] + for (const r of results) { + if (r.status === 'fulfilled') { + out.push(...r.value) + } else { + // TODO: Some exceptions should crash an application in fact. + // out.push(errorAlert(`Error processing block ${blockEvent.block.hash}`, r.reason)) + logger.error(r.reason) + } + } - const latestBlockNumber = await ethClient.getBlockNumber() - if (E.isLeft(latestBlockNumber)) { - logger.error(latestBlockNumber.left) + if (!isLaunchReported) { + out.push(launchAlert()) + isLaunchReported = true + } - process.exit(1) + return out } - const initH = new InitHandler( - config.appName, - logger, - csModuleSrv, - csFeeDistributorSrv, - csAccountingSrv, - csFeeOracleSrv, - proxyWatcherSrv, - onAppFindings, - latestBlockNumber.right, - ) - const alertH = new AlertHandler() - - gRPCserver.addService(AgentService, { - initialize: initH.handleInit(), - evaluateBlock: blockH.handleBlock(), - evaluateTx: txH.handleTx(), - healthCheck: healthH.healthGrpc(), - evaluateAlert: alertH.handleAlert(), - }) + return { + handleTransaction, + handleBlock, + } +} - metrics.buildInfo.set({ commitHash: Version.commitHash }, 1) +async function parseArgs() { + let blockIdentifier: string | number | undefined = process.env['FORTA_CLI_BLOCK'] + if (blockIdentifier && !blockIdentifier.startsWith('0x')) { + blockIdentifier = parseInt(blockIdentifier) + } - gRPCserver.bindAsync(`0.0.0.0:${config.grpcPort}`, grpc.ServerCredentials.createInsecure(), (err, port) => { - if (err != null) { - logger.error(err) + const txIdentifier = process.env['FORTA_CLI_TX'] + if (txIdentifier) { + const provider = await getProvider({ + rpcUrl: RPC_URL, + }) - process.exit(1) + const tx = await provider.getTransaction(txIdentifier) + if (!tx?.blockHash) { + throw Error(`Transaction ${txIdentifier} not mined`) } - logger.info(`${config.appName} is listening on ${port}`) - }) - - const httpService: Express = express() - httpService.get('/metrics', async (req: Request, res: Response) => { - res.set('Content-Type', mergedRegistry.contentType) - res.send(await mergedRegistry.metrics()) - }) - - httpService.get('/health', healthH.healthHttp()) + blockIdentifier = tx.blockHash + } - httpService.listen(config.httpPort, () => { - logger.info(`Http server is running at http://localhost:${config.httpPort}`) - }) + return { + blockIdentifier, + txIdentifier, + } } - -main() diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts index bbe138902..71344945c 100644 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts @@ -11,7 +11,7 @@ import { getCSAccountingEvents } from '../../utils/events/cs_accounting_events' import { CSAccountingSrv, ICSAccountingClient } from './CSAccounting.srv' import * as Winston from 'winston' import { ETHProvider } from '../../clients/eth_provider' -import { ethers } from 'forta-agent' +import { ethers } from '@fortanetwork/forta-bot' import { getFortaConfig } from 'forta-agent/dist/sdk/utils' import promClient from 'prom-client' import { Metrics } from '../../utils/metrics/metrics' diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts index dc21a84b7..604dd404c 100644 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts @@ -1,237 +1,244 @@ -import { elapsedTime } from '../../utils/time' -import { either as E } from 'fp-ts' +import { + BlockEvent, + Finding, + FindingSeverity, + FindingType, + TransactionEvent, + ethers, + filterLog, +} from '@fortanetwork/forta-bot' import { Logger } from 'winston' -import { BlockDto, EventOfNotice, TransactionDto, handleEventsOfNotice } from '../../entity/events' -import { Finding } from '../../generated/proto/alert_pb' -import { ethers, filterLog, getEthersProvider } from 'forta-agent' -import { APPROVAL_EVENT } from '../../utils/events/cs_accounting_events' -import CS_MODULE_ABI from '../../brief/abi/CSModule.json' -import CS_ACCOUNTING_ABI from '../../brief/abi/CSAccounting.json' -import { getLogsByChunks } from '../../utils/utils' -import { Config } from '../../utils/env/env' -import { AVERAGE_BOND_TRESHOLD, ONE_DAY, UNBONDED_KEYS_TRESHOLD } from '../../utils/constants' - -export abstract class ICSAccountingClient { - public abstract getBlockByNumber(blockNumber: number): Promise> -} + +import { IS_CLI } from '../../config' +import { CSAccounting__factory, CSModule__factory, Lido__factory } from '../../generated/typechain' +import { getLogger } from '../../logger' +import { SECONDS_PER_DAY, WEI_PER_ETH } from '../../shared/constants' +import { sourceFromEvent } from '../../utils/findings' +import { RedefineMode, requireWithTier } from '../../utils/require' +import { formatEther } from '../../utils/string' +import * as Constants from '../constants' + +const { DEPLOYED_ADDRESSES } = requireWithTier(module, '../constants', RedefineMode.Merge) + +const CHECK_ACCOUNTING_INTERVAL_BLOCKS = 301 // ~ every hour +const CHECK_OPERATORS_INTERVAL_BLOCKS = 2401 // ~ 3 times a day +const BOND_AVG_WEI_MIN = WEI_PER_ETH * 1n +const LOCK_TOTAL_WEI_MAX = WEI_PER_ETH * 32n +const ACCOUNTING_BALANCE_EXCESS_SHARES_MAX = WEI_PER_ETH / 10n +const CURVE_EARLY_ADOPTION_ID = 1n +const CURVE_DEFAULT_ID = 0n export class CSAccountingSrv { - private readonly name = 'CSAccountingSrv' private readonly logger: Logger - private readonly csAccountingClient: ICSAccountingClient - - private readonly csAccountingEvents: EventOfNotice[] - private readonly csAccountingAddress: string - private readonly stETHAddress: string - private readonly csModuleAddress: string - - private nodeOperatorAddedEvents: ethers.Event[] = [] - private lastAverageBondValueAlertTimestamp: number = 0 - - constructor( - logger: Logger, - ethProvider: ICSAccountingClient, - csAccountingEvents: EventOfNotice[], - csAccountingAddress: string, - stETHAddress: string, - csModuleAddress: string, - ) { - this.logger = logger - this.csAccountingClient = ethProvider - - this.csAccountingEvents = csAccountingEvents - this.csAccountingAddress = csAccountingAddress - this.stETHAddress = stETHAddress - this.csModuleAddress = csModuleAddress - } - public async initialize(currentBlock: number): Promise { - const start = new Date().getTime() - - const config = new Config() - - const currBlock = await this.csAccountingClient.getBlockByNumber(currentBlock) - if (E.isLeft(currBlock)) { - this.logger.error(elapsedTime(`Failed [${this.name}.initialize]`, start)) - return currBlock.left - } + private lastFiredAt = { + accountingExcessShares: 0, + totalLockAlert: 0, + avgBondAlert: 0, + } - const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) - const startBlock = config.csModuleInitBlock - const csModuleNodeOperatorAddedFilter = csModule.filters.NodeOperatorAdded() - this.nodeOperatorAddedEvents = await getLogsByChunks( - csModule, - csModuleNodeOperatorAddedFilter, - startBlock, - currentBlock, - ) + constructor() { + this.logger = getLogger(CSAccountingSrv.name) + } - this.logger.info(elapsedTime(`[${this.name}.initialize]`, start)) - return null + async handleBlock(blockEvent: BlockEvent, provider: ethers.Provider): Promise { + return [ + ...(await this.checkAccountingSharesDiscrepancy(blockEvent, provider)), + ...(await this.handleBondAndLockValues(blockEvent, provider)), + ] } - public getName(): string { - return this.name + public async handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider): Promise { + return [...this.handleStETHApprovalEvents(txEvent), ...this.handleSetBondCurveEvent(txEvent)] } - async handleBlock(blockDto: BlockDto): Promise { - const start = new Date().getTime() - const findings: Finding[] = [] + public async handleBondAndLockValues(blockEvent: BlockEvent, provider: ethers.Provider): Promise { + if (blockEvent.blockNumber % CHECK_OPERATORS_INTERVAL_BLOCKS !== 0 && !IS_CLI) { + return [] + } - const averageBondValueFindings = this.handleAverageBondValue(blockDto) - const unbondedValidatorsFindings = this.handleUnbondedValidators(blockDto) + const accounting = CSAccounting__factory.connect(DEPLOYED_ADDRESSES.CS_ACCOUNTING, provider) + const csm = CSModule__factory.connect(DEPLOYED_ADDRESSES.CS_MODULE, provider) + const ethCallOpts = { blockTag: blockEvent.blockHash } - findings.push(...averageBondValueFindings, ...unbondedValidatorsFindings) + const operatorsCount = await csm.getNodeOperatorsCount(ethCallOpts) + this.logger.debug(`Total operators count: ${operatorsCount}`) - this.logger.info(elapsedTime(CSAccountingSrv.name + '.' + this.handleBlock.name, start)) - this.logger.info(blockDto.timestamp) + let totalValidators = 0n + let totalBondWei = 0n + let totalLockWei = 0n - return findings - } + for (let noId = 0; noId < operatorsCount; noId++) { + totalValidators += await csm.getNodeOperatorNonWithdrawnKeys(noId, ethCallOpts) + totalBondWei += (await accounting.getBondSummary(noId, ethCallOpts)).current + totalLockWei += await accounting.getActualLockedBond(noId, ethCallOpts) + } + this.logger.debug(`Read ${operatorsCount} operators info`) + + const avgBondWei = totalBondWei / totalValidators + + this.logger.debug(`Averave bond is ${formatEther(avgBondWei)}`) + this.logger.debug(`Total bond is ${formatEther(totalBondWei)}`) + this.logger.debug(`Total lock is ${formatEther(totalLockWei)}`) - public handleAverageBondValue(blockDto: BlockDto): Finding[] { + const now = blockEvent.block.timestamp const out: Finding[] = [] - const now = blockDto.timestamp - - const csAccounting = new ethers.Contract(this.csAccountingAddress, CS_ACCOUNTING_ABI, getEthersProvider()) - let bondValueTotal = 0 - - this.nodeOperatorAddedEvents.forEach(async (event) => { - const noId = event.args?.nodeOperatorId - const bondValue = await csAccounting.getBondSummary(noId).current - bondValueTotal += bondValue - }) - const averageBondValue = bondValueTotal / this.nodeOperatorAddedEvents.length - - const timeSinceLastAlert = now - this.lastAverageBondValueAlertTimestamp - - if (timeSinceLastAlert > ONE_DAY) { - if (averageBondValue >= AVERAGE_BOND_TRESHOLD) { - const f: Finding = new Finding() - f.setName(`🟒 CSAccounting: Average bond value for a validator is below threshold.`) - f.setDescription(`Average bond value for a validator is below ${AVERAGE_BOND_TRESHOLD}`) - f.setAlertid('CS-ACCOUNTING-AVERAGE-BOND-VALUE') - f.setSeverity(Finding.Severity.LOW) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') - out.push(f) + if (now - this.lastFiredAt.avgBondAlert > SECONDS_PER_DAY) { + if (avgBondWei < BOND_AVG_WEI_MIN) { + const f = Finding.fromObject({ + name: `🟒 CSAccounting: Average bond value for a validator is below threshold.`, + description: `Average bond value for a validator is less than ${formatEther(BOND_AVG_WEI_MIN)}`, + alertId: 'CS-ACCOUNTING-AVERAGE-BOND-VALUE', + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) - this.lastAverageBondValueAlertTimestamp = now + out.push(f) + this.lastFiredAt.avgBondAlert = now } + } - // * unfinished implementation - const totalBondLock = bondValueTotal - const SOME_VALUE = 1000 // ! Replace with actual value - if (totalBondLock > SOME_VALUE) { - const f: Finding = new Finding() - f.setName(`🟒 LOW: Total bond lock exceeds threshold.`) - f.setDescription(`Total bond lock is more than ${SOME_VALUE}`) - f.setAlertid('CS-ACCOUNTING-TOTAL-BOND-LOCK') - f.setSeverity(Finding.Severity.LOW) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') + if (now - this.lastFiredAt.totalLockAlert > SECONDS_PER_DAY) { + if (totalLockWei > LOCK_TOTAL_WEI_MAX) { + const f = Finding.fromObject({ + name: `🟒 Total bond lock exceeds threshold.`, + description: `Total bond lock is more than ${formatEther(LOCK_TOTAL_WEI_MAX)}`, + alertId: 'CS-ACCOUNTING-TOTAL-BOND-LOCK', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) out.push(f) + this.lastFiredAt.totalLockAlert = now } } return out } - public handleUnbondedValidators(blockDto: BlockDto): Finding[] { - const out: Finding[] = [] - - const csAccounting = new ethers.Contract(this.csAccountingAddress, CS_ACCOUNTING_ABI, getEthersProvider()) - - this.nodeOperatorAddedEvents.forEach(async (event) => { - const noId = event.args?.nodeOperatorId - const unbondedKeysCount = await csAccounting.getUnbondedKeysCount(noId) - if (unbondedKeysCount >= UNBONDED_KEYS_TRESHOLD) { - const f: Finding = new Finding() - f.setName(`🟒 CSAccounting: Too many unbonded validators since last block.`) - f.setDescription( - `Node Operator #${noId} has ${unbondedKeysCount} unbonded validators since ${blockDto.number} block.`, - ) - f.setAlertid('CS-ACCOUNTING-TOO-MANY-UNBONDED-KEYS') - f.setSeverity(Finding.Severity.LOW) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') + async checkAccountingSharesDiscrepancy(blockEvent: BlockEvent, provider: ethers.Provider): Promise { + if (blockEvent.blockNumber % CHECK_ACCOUNTING_INTERVAL_BLOCKS !== 0 && !IS_CLI) { + return [] + } - out.push(f) - } - }) + const accounting = CSAccounting__factory.connect(DEPLOYED_ADDRESSES.CS_ACCOUNTING, provider) + const steth = Lido__factory.connect(DEPLOYED_ADDRESSES.LIDO_STETH, provider) - return out - } + const totalBondShares = await accounting.totalBondShares({ blockTag: blockEvent.blockHash }) + const actualBalance = await steth.sharesOf(accounting, { blockTag: blockEvent.blockHash }) + const diff = totalBondShares - actualBalance - // * unfinished implementation - public async handleBondShareDiscrepancy(): Promise { + const now = blockEvent.block.timestamp const out: Finding[] = [] - const csAccounting = new ethers.Contract(this.csAccountingAddress, CS_ACCOUNTING_ABI, getEthersProvider()) - const totalBondShares = await csAccounting.totalBondShares() - const sharesOf = await csAccounting.sharesOf(this.csAccountingAddress) - - if (sharesOf.sub(totalBondShares).gt(ethers.BigNumber.from('100'))) { - const f: Finding = new Finding() - f.setName(`🟒 LOW: Bond share discrepancy detected.`) - f.setDescription(`Difference between sharesOf(${this.csAccountingAddress}) and totalBondShares exceeds 100 wei.`) - f.setAlertid('CS-ACCOUNTING-BOND-SHARE-DISCREPANCY') - f.setSeverity(Finding.Severity.LOW) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') + if (now - this.lastFiredAt.accountingExcessShares > SECONDS_PER_DAY) { + if (diff > ACCOUNTING_BALANCE_EXCESS_SHARES_MAX) { + const f = Finding.fromObject({ + name: `🟒 Shares to recover on CSAccounting.`, + description: `There's a valuable amount of shares to recover on CSAccounting.`, + alertId: 'CS-ACCOUNTING-EXCESS-SHARES', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) + out.push(f) + this.lastFiredAt.accountingExcessShares = now + } + } + // NOTE: This is a critical invariant, so we fire every CHECK_ACCOUNTING_INTERVAL_BLOCKS. + if (diff < 0n) { + const f = Finding.fromObject({ + name: '🚨 Not enough shares on CSAccounting', + description: 'sharesOf(CSAccounting) < CSAccounting.totalBondShares', + alertId: 'CS-ACCOUNTING-NOT-ENOUGH-SHARES', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Critical, + type: FindingType.Info, + }) out.push(f) } return out } - public handleStETHApprovalEvents(txEvent: TransactionDto): Finding[] { - const out: Finding[] = [] - - const approvalEvents = filterLog(txEvent.logs, APPROVAL_EVENT, this.stETHAddress) - if (approvalEvents.length === 0) { - return [] - } + // TODO: Does it makes sense for us at all? + handleStETHApprovalEvents(txEvent: TransactionEvent): Finding[] { + const approvalEvents = filterLog( + txEvent.logs, + Lido__factory.createInterface().getEvent('TransferShares').format('full'), + DEPLOYED_ADDRESSES.LIDO_STETH, + ) + const out: Finding[] = [] for (const event of approvalEvents) { - if (event.args.owner === this.csAccountingAddress) { - const f: Finding = new Finding() - f.setName(`πŸ”΅ Lido stETH: Approval`) - f.setDescription(`${event.args.spender} received allowance from ${event.args.owner} to ${event.args.value}`) - f.setAlertid('STETH-APPROVAL') - f.setSeverity(Finding.Severity.INFO) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') - + if (event.args.owner === DEPLOYED_ADDRESSES.CS_ACCOUNTING) { + const f = Finding.fromObject({ + name: `πŸ”΅ Lido stETH: Approval`, + description: `${event.args.spender} received allowance from ${event.args.owner} to ${event.args.value}`, + alertId: 'STETH-APPROVAL', + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) out.push(f) } } return out } - public async handleTransaction(txEvent: TransactionDto): Promise { - const out: Finding[] = [] + handleSetBondCurveEvent(txEvent: TransactionEvent): Finding[] { + const events = filterLog( + txEvent.logs, + CSAccounting__factory.createInterface().getEvent('BondCurveSet').format('full'), + DEPLOYED_ADDRESSES.CS_ACCOUNTING, + ) - const csAccountingFindings = handleEventsOfNotice(txEvent, this.csAccountingEvents) - const stETHApprovalFindings = this.handleStETHApprovalEvents(txEvent) + const out: Finding[] = [] - const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) - const csModuleNodeOperatorAddedFilter = csModule.filters.NodeOperatorAdded() - const [events] = await getLogsByChunks( - csModule, - csModuleNodeOperatorAddedFilter, - txEvent.block.number, // start block, - txEvent.block.number, // end block, - ) - if (events) { - this.nodeOperatorAddedEvents.push(events) + for (const e of events) { + if (e.args.curveId == CURVE_EARLY_ADOPTION_ID) { + out.push( + Finding.fromObject({ + alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', + name: 'πŸ”΅ CSAccounting: Bond curve set', + description: `Early adoption bond curve set for Node Operator #${e.args.nodeOperatorId}`, + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Info, + type: FindingType.Info, + }), + ) + } else if (e.args.curveId == CURVE_DEFAULT_ID) { + out.push( + Finding.fromObject({ + alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', + name: 'πŸ”΅ CSAccounting: Bond curve set', + description: `Bond curve was reset for Node Operator #${e.args.nodeOperatorId}`, + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Info, + type: FindingType.Info, + }), + ) + } else { + out.push( + Finding.fromObject({ + alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', + name: 'πŸ”΅ CSAccounting: Bond curve set', + description: `Bond curve set for Node Operator #${e.args.nodeOperatorId} with curve ID ${e.args.curveId}`, + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Info, + type: FindingType.Info, + }), + ) + } } - out.push(...csAccountingFindings, ...stETHApprovalFindings) - return out } } diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts index b8f31a995..b006e740b 100644 --- a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts @@ -11,7 +11,7 @@ import { getCSFeeDistributorEvents } from '../../utils/events/cs_fee_distributor import { CSFeeDistributorSrv, ICSFeeDistributorClient } from './CSFeeDistributor.srv' import * as Winston from 'winston' import { ETHProvider } from '../../clients/eth_provider' -import { ethers } from 'forta-agent' +import { ethers } from '@fortanetwork/forta-bot' import { getFortaConfig } from 'forta-agent/dist/sdk/utils' import promClient from 'prom-client' import { Metrics } from '../../utils/metrics/metrics' diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts index f64085819..1e2faeec8 100644 --- a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts @@ -1,270 +1,237 @@ -import { elapsedTime } from '../../utils/time' -import { BlockDto, EventOfNotice, TransactionDto, handleEventsOfNotice } from '../../entity/events' +import { + BlockEvent, + Finding, + FindingSeverity, + FindingType, + TransactionEvent, + ethers, + filterLog, +} from '@fortanetwork/forta-bot' +import { Provider } from 'ethers' import { Logger } from 'winston' -import { either as E } from 'fp-ts' -import { Finding } from '../../generated/proto/alert_pb' -import CS_FEE_DISTRIBUTOR_ABI from '../../brief/abi/CSFeeDistributor.json' -import HASH_CONSENSUS_ABI from '../../brief/abi/HashConsensus.json' -import { ONE_DAY, SECONDS_PER_SLOT } from '../../utils/constants' -import { ethers, filterLog, getEthersProvider } from 'forta-agent' -import { DISTRIBUTION_DATA_UPDATED_EVENT, TRANSFER_SHARES_EVENT } from '../../utils/events/cs_fee_distributor_events' -import { getLogsByChunks } from '../../utils/utils' -import { toKebabCase } from '../../utils/string' - -export abstract class ICSFeeDistributorClient { - public abstract getBlockByNumber(blockNumber: number): Promise> -} -export class CSFeeDistributorSrv { - private name = `CSFeeDistributorSrv` +import { CSFeeDistributor__factory, HashConsensus__factory, Lido__factory } from '../../generated/typechain' +import { getLogger } from '../../logger' +import { SECONDS_PER_DAY, SECONDS_PER_SLOT, SLOTS_PER_EPOCH } from '../../shared/constants' +import { getEpoch } from '../../utils/epochs' +import { failedTxAlert, invariantAlert, sourceFromEvent } from '../../utils/findings' +import { getLogsByChunks } from '../../utils/logs' +import { RedefineMode, requireWithTier } from '../../utils/require' +import { formatDelay } from '../../utils/time' +import * as Constants from '../constants' +const { DEPLOYED_ADDRESSES } = requireWithTier(module, '../constants', RedefineMode.Merge) +const ICSFeeDistributor = CSFeeDistributor__factory.createInterface() + +export class CSFeeDistributorSrv { private readonly logger: Logger - private readonly csFeeDistributorClient: ICSFeeDistributorClient - - private readonly csFeeDistributorEvents: EventOfNotice[] - private readonly csAccountingAddress: string - private readonly csFeeDistributorAddress: string - private readonly stETHAddress: string - private readonly hashConsensusAddress: string - - private lastDistributionDataUpdatedTimestamp: number = 0 - private lastNoDistributionDataUpdatedAlertTimestamp: number = 0 - - constructor( - logger: Logger, - ethProvider: ICSFeeDistributorClient, - csFeeDistributorEvents: EventOfNotice[], - csAccountingAddress: string, - csFeeDistributorAddress: string, - stETHAddress: string, - hashConsensusAddress: string, - ) { - this.logger = logger - this.csFeeDistributorClient = ethProvider - this.csFeeDistributorEvents = csFeeDistributorEvents - this.csAccountingAddress = csAccountingAddress - this.csFeeDistributorAddress = csFeeDistributorAddress - this.stETHAddress = stETHAddress - this.hashConsensusAddress = hashConsensusAddress + + private lastFiredAt = { + distributionUpdateOverdue: 0, } - async initialize(currentBlock: number): Promise { - const start = new Date().getTime() + private state = { + lastDistributionUpdatedAt: 0, + frameInitialEpoch: 0, + frameInSlots: 0, + } - const currBlock = await this.csFeeDistributorClient.getBlockByNumber(currentBlock) - if (E.isLeft(currBlock)) { - this.logger.error(elapsedTime(`Failed [${this.name}.initialize]`, start)) - return currBlock.left - } + constructor() { + this.logger = getLogger(CSFeeDistributorSrv.name) + } - const csFeeDistributor = new ethers.Contract( - this.csFeeDistributorAddress, - CS_FEE_DISTRIBUTOR_ABI, - getEthersProvider(), - ) - const hashConsensus = new ethers.Contract(this.hashConsensusAddress, HASH_CONSENSUS_ABI, getEthersProvider()) - const frameConfig = await hashConsensus.functions.getFrameConfig() - const frameInSeconds = frameConfig.epochsPerFrame * 32 * SECONDS_PER_SLOT - const startBlock = currentBlock - Math.ceil(frameInSeconds / SECONDS_PER_SLOT) - const csFeeDistributorDistributionDataUpdatedFilter = csFeeDistributor.filters.DistributionDataUpdated() - const distributionDataUpdatedEvents = await getLogsByChunks( - csFeeDistributor, - csFeeDistributorDistributionDataUpdatedFilter, - startBlock, - currentBlock, - ) + async initialize(blockIdentifier: ethers.BlockTag, provider: ethers.Provider): Promise { + const hc = HashConsensus__factory.connect(DEPLOYED_ADDRESSES.HASH_CONSENSUS, provider) + const frameConfig = await hc.getFrameConfig({ blockTag: blockIdentifier }) + this.state.frameInitialEpoch = Number(frameConfig.initialEpoch) - if (distributionDataUpdatedEvents.length > 0) { - this.lastDistributionDataUpdatedTimestamp = currBlock.right.timestamp + const frameInSlots = Number(frameConfig.epochsPerFrame) * SLOTS_PER_EPOCH + this.state.frameInSlots = frameInSlots + + const distributor = CSFeeDistributor__factory.connect(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, provider) + if ((await distributor.treeRoot({ blockTag: blockIdentifier })) === ethers.ZeroHash) { + this.logger.debug('No distribution happened so far') + return } - this.logger.info(elapsedTime(`[${this.name}.initialize]`, start)) - return null - } + const toBlock = await provider.getBlock(blockIdentifier) + if (!toBlock) { + throw Error('Unable to get the latest block') + } - public getName(): string { - return this.name - } + const distributedEvents = await getLogsByChunks( + distributor as any, + distributor.filters.DistributionDataUpdated, + toBlock.number - frameInSlots * 2, + toBlock.number, + ) - async handleBlock(blockDto: BlockDto): Promise { - const start = new Date().getTime() - const findings: Finding[] = [] - - // * Invariants - // const csFeeDistributor = new ethers.Contract( - // this.csFeeDistributorAddress, - // CS_FEE_DISTRIBUTOR_ABI, - // getEthersProvider(), - // ) - //Check that total distributed shares do not exceed total shares distributed by oracle - // assertInvariant( - // totalDistributedShares.lte(treeValues.reduce((acc, val) => acc.add(val), BigNumber.from(0))), - // 'Claimed more than distributed by oracle.', - // findings, - // ) - // assertInvariant(!(treeRoot === ZERO_HASH && treeCid !== ''), 'Tree exists, but no CID.', findings) - - if (blockDto.number % 10 === 0) { - const distributionDataUpdatedFindings = await this.handleDistributionDataUpdated(blockDto) - findings.push(...distributionDataUpdatedFindings) + const lastDistributionEvent = distributedEvents.sort((a, b) => a.blockNumber - b.blockNumber).pop() + if (!lastDistributionEvent) { + this.logger.debug('No distribution event found') + return } - this.logger.info(elapsedTime(CSFeeDistributorSrv.name + '.' + this.handleBlock.name, start)) + this.state.lastDistributionUpdatedAt = (await lastDistributionEvent.getBlock())?.timestamp ?? 0 + this.logger.debug(`Last distribution observed at timestamp ${this.state.lastDistributionUpdatedAt}`) + } - return findings + async handleBlock(blockEvent: BlockEvent, provider: Provider): Promise { + return [...this.handleDistributionOverdue(blockEvent), ...(await this.checkInvariants(blockEvent, provider))] } - private async handleRevertedTx(txEvent: TransactionDto): Promise { - const out: Finding[] = [] + public async handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider): Promise { + const distributionDataUpdatedEvents = filterLog( + txEvent.logs, + ICSFeeDistributor.getEvent('DistributionDataUpdated').format('full'), + DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, + ) - const txReceipt = await getEthersProvider().getTransactionReceipt(txEvent.hash) - - // Checks if transaction reverted - if (txReceipt.status === 0) { - for (const log of txReceipt.logs) { - try { - const decodedLog = ethers.utils.defaultAbiCoder.decode(['string'], log.data) - const reason = decodedLog[0] - - if (reason) { - switch (reason) { - case 'InvalidShares': - out.push( - this.createCriticalFindingForRevertedTx( - 'CSFeeOracle reports incorrect amount of shares to distribute', - 'InvalidShares', - ), - ) - break - case 'NotEnoughShares': - out.push( - this.createCriticalFindingForRevertedTx( - 'CSFeeDistributor internal accounting error', - 'NotEnoughShares', - ), - ) - break - case 'InvalidTreeRoot': - out.push( - this.createCriticalFindingForRevertedTx('CSFeeOracle built incorrect report', 'InvalidTreeRoot'), - ) - break - case 'InvalidTreeCID': - out.push( - this.createCriticalFindingForRevertedTx('CSFeeOracle built incorrect report', 'InvalidTreeCID'), - ) - break - default: - this.logger.warn(`Unrecognized revert reason: ${reason}`) - break - } - } - } catch (error) { - this.logger.error(`Failed to decode log data: ${error}`) - } - } + if (distributionDataUpdatedEvents.length > 0) { + this.state.lastDistributionUpdatedAt = txEvent.block.timestamp } - return out + return ( + await Promise.all([this.handleTransferSharesInvalidReceiver(txEvent), this.handleRevertedTx(txEvent, provider)]) + ).flat() } - private createCriticalFindingForRevertedTx(description: string, reason: string): Finding { - const f = new Finding() - f.setName(`🟣 CRITICAL: ${reason}`) - f.setDescription(`Transaction reverted. ${description}`) - f.setAlertid(`CSFEE-${toKebabCase(reason)}`) - f.setSeverity(Finding.Severity.CRITICAL) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') - return f - } + private handleDistributionOverdue(blockEvent: BlockEvent): Finding[] { + if (this.state.lastDistributionUpdatedAt === 0) { + this.logger.debug('No previous distribution observed so far') + return [] + } - private async handleDistributionDataUpdated(blockDto: BlockDto): Promise { - const out: Finding[] = [] + const now = blockEvent.block.timestamp - const hashConsensus = new ethers.Contract(this.hashConsensusAddress, HASH_CONSENSUS_ABI, getEthersProvider()) - const frameConfig = await hashConsensus.functions.getFrameConfig() - const frameInSeconds = frameConfig.epochsPerFrame * 32 * SECONDS_PER_SLOT + if (getEpoch(blockEvent.chainId, now) < this.state.frameInitialEpoch) { + this.logger.debug('Initial epoch has not been reached yet') + return [] + } - const now = blockDto.timestamp + if (now - this.lastFiredAt.distributionUpdateOverdue < SECONDS_PER_DAY) { + return [] + } - const chainConfig = hashConsensus.getChainConfig() - const genesisTimestamp = chainConfig.genesisTime - const currentEpoch = Math.floor((now - genesisTimestamp) / 32 / SECONDS_PER_SLOT) - if (currentEpoch < frameConfig.initialEpoch + frameConfig.epochsPerFrame) { - return out + // Just add 1 day to the frame length because it seems as a good approximation of more complex approach. + // TODO: Fetch the current frame every time? + const distributionIntervalSecondsMax = this.state.frameInSlots * SECONDS_PER_SLOT + SECONDS_PER_DAY + const distributionDelaySeconds = now - this.state.lastDistributionUpdatedAt + if (distributionDelaySeconds < distributionIntervalSecondsMax) { + return [] } - const timeSinceLastAlert = now - this.lastNoDistributionDataUpdatedAlertTimestamp + this.lastFiredAt.distributionUpdateOverdue = now + + return [ + Finding.fromObject({ + name: `πŸ”΄ CSFeeDistributor: Distribution overdue`, + description: `There has been no DistributionDataUpdated event for more than ${formatDelay(distributionIntervalSecondsMax)}.`, + alertId: 'CSFEE-DISTRIBUTION-OVERDUE', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.High, + type: FindingType.Info, + }), + ] + } - if (timeSinceLastAlert > ONE_DAY) { - if (now - this.lastDistributionDataUpdatedTimestamp > frameInSeconds) { - const daysSinceLastUpdate = Math.floor((now - this.lastDistributionDataUpdatedTimestamp) / ONE_DAY) + public handleTransferSharesInvalidReceiver(txEvent: TransactionEvent): Finding[] { + const transferSharesEvents = filterLog( + txEvent.logs, + Lido__factory.createInterface().getEvent('TransferShares').format('full'), + DEPLOYED_ADDRESSES.LIDO_STETH, + ) - const f = new Finding() - f.setName(`πŸ”΄ CSFeeDistributor: No DistributionDataUpdated Event`) - f.setDescription(`There has been no DistributionDataUpdated event for ${daysSinceLastUpdate} days.`) - f.setAlertid('CSFEE-NO-DISTRIBUTION-DATA-UPDATED') - f.setSeverity(Finding.Severity.HIGH) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') + const out: Finding[] = [] + for (const event of transferSharesEvents) { + if ( + event.args.from.toLowerCase() === DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR.toLowerCase() && + event.args.to.toLowerCase() !== DEPLOYED_ADDRESSES.CS_ACCOUNTING.toLowerCase() + ) { + const f = Finding.fromObject({ + name: `🚨 CSFeeDistributor: Invalid TransferShares receiver`, + description: `TransferShares from CSFeeDistributor to an invalid address ${event.args.to} (expected CSAccounting)`, + alertId: 'CSFEE-DISTRIBUTOR-INVALID-TRANSFER', + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Critical, + type: FindingType.Info, + }) out.push(f) - - this.lastNoDistributionDataUpdatedAlertTimestamp = now } } return out } - public async handleTransaction(txEvent: TransactionDto): Promise { - const out: Finding[] = [] - - const distributionDataUpdatedEvents = filterLog( - txEvent.logs, - DISTRIBUTION_DATA_UPDATED_EVENT, - this.csFeeDistributorAddress, - ) - - if (distributionDataUpdatedEvents.length > 0) { - this.lastDistributionDataUpdatedTimestamp = txEvent.block.timestamp - } - - const csFeeDistributorFindings = handleEventsOfNotice(txEvent, this.csFeeDistributorEvents) - const transferSharesInvalidReceiverFindings = this.handleTransferSharesInvalidReceiver(txEvent) - const revertedTxFindings = await this.handleRevertedTx(txEvent) + private async handleRevertedTx(txEvent: TransactionEvent, provider: ethers.Provider): Promise { + // if (!(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR.toLowerCase() in txEvent.addresses)) { + // return [] + // } + // + // const txReceipt = await provider.getTransactionReceipt(txEvent.hash) + // // Nothing to do if the transaction succeeded. + // if (txReceipt?.status === 0) { + // this.logger.debug(`Skipping successful transaction ${txEvent.hash}`) + // return [] + // } + // + // // FIXME: I can't find a node with getTransactionResult call working. + // let decodedLog: ethers.ErrorDescription | null = null + // try { + // const data = await txReceipt?.getResult() + // decodedLog = CSFeeDistributorInterface.parseError(data ?? '') + // } catch (error: any) { + // if (error.code === 'UNSUPPORTED_OPERATION') { + // this.logger.debug('Ethereum RPC does not support `getTransactionResult`') + // return [] + // } + // + // throw error + // } + // + // const reason = decodedLog?.name + // if (!reason) { + // return [] + // } + // + // switch (reason) { + // case 'InvalidShares': + // return [failedTxAlert(txEvent, 'CSFeeOracle reports incorrect amount of shares to distribute', 'InvalidShares')] + // case 'NotEnoughShares': + // return [failedTxAlert(txEvent, 'CSFeeDistributor internal accounting error', 'NotEnoughShares')] + // case 'InvalidTreeRoot': + // return [failedTxAlert(txEvent, 'CSFeeOracle built incorrect report', 'InvalidTreeRoot')] + // case 'InvalidTreeCID': + // return [failedTxAlert(txEvent, 'CSFeeOracle built incorrect report', 'InvalidTreeCID')] + // default: + // this.logger.warn(`Unrecognized revert reason: ${reason}`) + // } + + return [] + } - out.push(...csFeeDistributorFindings, ...transferSharesInvalidReceiverFindings, ...revertedTxFindings) + private async checkInvariants(blockEvent: BlockEvent, provider: ethers.Provider) { + const distributor = CSFeeDistributor__factory.connect(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, provider) + const steth = Lido__factory.connect(DEPLOYED_ADDRESSES.LIDO_STETH, provider) - return out - } + const blockTag = blockEvent.blockHash - public handleTransferSharesInvalidReceiver(txEvent: TransactionDto): Finding[] { const out: Finding[] = [] - const transferSharesEvents = filterLog(txEvent.logs, TRANSFER_SHARES_EVENT, this.stETHAddress) - if (transferSharesEvents.length === 0) { - return [] + const treeRoot = await distributor.treeRoot({ blockTag }) + const treeCid = await distributor.treeCid({ blockTag }) + if (treeRoot !== ethers.ZeroHash && treeCid === '') { + out.push(invariantAlert(blockEvent, 'Tree exists, but no CID.')) } - for (const event of transferSharesEvents) { - if ( - event.args.from.toLowerCase() === this.csFeeDistributorAddress.toLowerCase() && - event.args.to.toLowerCase() !== this.csAccountingAddress.toLowerCase() - ) { - const f: Finding = new Finding() - f.setName(`🚨 CSFeeDistributor: Invalid TransferShares receiver`) - f.setDescription( - `TransferShares from CSFeeDistributor to an invalid address ${event.args.to} (expected CSAccounting)`, - ) - f.setAlertid('CSFEE-DISTRIBUTOR-INVALID-TRANSFER') - f.setSeverity(Finding.Severity.CRITICAL) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') - - out.push(f) - } + if ( + (await steth.sharesOf(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, { blockTag })) < + (await distributor.totalClaimableShares({ blockTag })) + ) { + out.push(invariantAlert(blockEvent, "distributed more than the contract's balance")) } + return out } } diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts index b8c20c6a4..8a30b8e90 100644 --- a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts +++ b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts @@ -10,7 +10,7 @@ import { import { CSFeeOracleSrv, ICSFeeOracleClient } from './CSFeeOracle.srv' import * as Winston from 'winston' import { ETHProvider } from '../../clients/eth_provider' -import { ethers } from 'forta-agent' +import { ethers } from '@fortanetwork/forta-bot' import { getFortaConfig } from 'forta-agent/dist/sdk/utils' import promClient from 'prom-client' import { Metrics } from '../../utils/metrics/metrics' diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts index 4f26a6be8..4e1656c12 100644 --- a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts +++ b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts @@ -1,235 +1,111 @@ -import { elapsedTime } from '../../utils/time' -import { either as E } from 'fp-ts' -import { Logger } from 'winston' -import { BlockDto, EventOfNotice, TransactionDto, handleEventsOfNotice } from '../../entity/events' -import { Finding } from '../../generated/proto/alert_pb' -import { ethers, filterLog, getEthersProvider } from 'forta-agent' -import { ONE_DAY, ONE_MONTH, SECONDS_PER_SLOT } from '../../utils/constants' -import CS_FEE_ORACLE_ABI from '../../brief/abi/CSFeeOracle.json' -import HASH_CONSENSUS_ABI from '../../brief/abi/HashConsensus.json' -import { getLogsByChunks } from '../../utils/utils' -import { - CS_FEE_ORACLE_REPORT_SUBMITTED_EVENT, - HASH_CONSENSUS_REPORT_RECEIVED_EVENT, -} from '../../utils/events/cs_fee_oracle_events' -import BigNumber from 'bignumber.js' -export abstract class ICSFeeOracleClient { - public abstract getBlockByNumber(blockNumber: number): Promise> -} +import { Finding, FindingSeverity, FindingType, TransactionEvent, ethers, filterLog } from '@fortanetwork/forta-bot' -interface MemberReport { - refSlot: BigNumber - report: string - blockNumber: number -} +import { CSFeeOracle__factory, HashConsensus__factory } from '../../generated/typechain' +import { sourceFromEvent } from '../../utils/findings' +import { RedefineMode, requireWithTier } from '../../utils/require' +import { etherscanAddress } from '../../utils/string' +import * as Constants from '../constants' -export class CSFeeOracleSrv { - private readonly name = 'CSFeeOracleSrv' - private readonly logger: Logger - private readonly csFeeOracleClient: ICSFeeOracleClient - - private readonly hashConsensusEvents: EventOfNotice[] - private readonly csFeeOracleEvents: EventOfNotice[] - - private readonly hashConsensusAddress: string - private readonly csFeeOracleAddress: string - - private lastReportSubmitTimestamp: number = 0 - private lastReportOverdueAlertTimestamp: number = 0 - private membersAddresses: string[] = [] - private membersLastReport: Map = new Map() - - constructor( - logger: Logger, - ethProvider: ICSFeeOracleClient, - hashConsensusEvents: EventOfNotice[], - csFeeOracleEvents: EventOfNotice[], - hashConsensusAddress: string, - csFeeOracleAddress: string, - ) { - this.logger = logger - this.csFeeOracleClient = ethProvider - - this.hashConsensusAddress = hashConsensusAddress - this.csFeeOracleAddress = csFeeOracleAddress - - this.hashConsensusEvents = hashConsensusEvents - this.csFeeOracleEvents = csFeeOracleEvents - } - - async getOracleMembers(blockNumber: number, hashConsensus: ethers.Contract): Promise { - const members = await hashConsensus.functions.getMembers({ - blockTag: blockNumber, - }) - return members.addresses - } +const { DEPLOYED_ADDRESSES, ORACLE_MEMBERS } = requireWithTier( + module, + '../constants', + RedefineMode.Merge, +) +const IHashConsensus = HashConsensus__factory.createInterface() +const ICSFeeOracle = CSFeeOracle__factory.createInterface() - public async initialize(currentBlock: number): Promise { - const start = new Date().getTime() +// TODO: Extract HashConsensus part maybe? - const currBlock = await this.csFeeOracleClient.getBlockByNumber(currentBlock) - if (E.isLeft(currBlock)) { - this.logger.error(elapsedTime(`Failed [${this.name}.initialize]`, start)) - return currBlock.left +export class CSFeeOracleSrv { + private membersLastReport: Map< + string, + { + refSlot: bigint + report: string } - - const hashConsensus = new ethers.Contract(this.hashConsensusAddress, HASH_CONSENSUS_ABI, getEthersProvider()) - this.membersAddresses = await this.getOracleMembers(currentBlock, hashConsensus) - const hashConsensusReportReceivedFilter = hashConsensus.filters.ReportReceived() - const frameConfig = await hashConsensus.functions.getFrameConfig() - const reportReceivedStartBlock = currentBlock - Math.ceil(frameConfig.epochsPerFrame * 32) - const reportReceivedEvents = await getLogsByChunks( - hashConsensus, - hashConsensusReportReceivedFilter, - reportReceivedStartBlock, - currentBlock, - ) - reportReceivedEvents.sort((a, b) => a.blockNumber - b.blockNumber) - - this.membersAddresses.forEach((member: string) => { - const memberReports = reportReceivedEvents.filter((event) => { - if (event.args) { - return event.args.member == member - } + > = new Map() + + public async initialize(blockIdentifier: ethers.BlockTag, provider: ethers.Provider): Promise { + const hc = HashConsensus__factory.connect(DEPLOYED_ADDRESSES.HASH_CONSENSUS, provider) + const [members] = await hc.getMembers({ blockTag: blockIdentifier }) + for (const m of members) { + const lastReport = await hc.getConsensusStateForMember(m, { blockTag: blockIdentifier }) + this.membersLastReport.set(m, { + refSlot: lastReport.lastMemberReportRefSlot, + report: lastReport.currentFrameMemberReport, }) - if (memberReports.length > 0) { - const lastReport = memberReports[memberReports.length - 1] - if (lastReport.args) { - this.membersLastReport.set(member, { - refSlot: lastReport.args.refSlot, - report: lastReport.args.report, - blockNumber: lastReport.blockNumber, - }) - } - } else { - this.membersLastReport.set(member, { - refSlot: new BigNumber(0), - report: '', - blockNumber: 0, - }) - } - }) - - const reportSubmits = await this.getReportSubmits( - currentBlock - Math.ceil(ONE_MONTH / SECONDS_PER_SLOT), - currentBlock, - ) - - if (reportSubmits.length > 0) { - this.lastReportSubmitTimestamp = (await reportSubmits[reportSubmits.length - 1].getBlock()).timestamp } - - this.logger.info(elapsedTime(`[${this.name}.initialize]`, start)) - return null - } - - public getName(): string { - return this.name } - async getReportSubmits(blockFrom: number, blockTo: number) { - const csFeeOracle = new ethers.Contract(this.csFeeOracleAddress, CS_FEE_ORACLE_ABI, getEthersProvider()) - const oracleReportFilter = csFeeOracle.filters.ReportSubmitted() - return await getLogsByChunks(csFeeOracle, oracleReportFilter, blockFrom, blockTo) - } - - async handleBlock(blockDto: BlockDto): Promise { - const start = new Date().getTime() - const findings: Finding[] = [] - - const [reportOverdueFindings] = await Promise.all([this.handleReportOverdue(blockDto)]) - - findings.push(...reportOverdueFindings) - - this.logger.info(elapsedTime(CSFeeOracleSrv.name + '.' + this.handleBlock.name, start)) - - return findings + public async handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider): Promise { + return [...this.handleAlternativeHashReceived(txEvent), ...(await this.handleReportSubmitted(txEvent, provider))] } - public async handleReportOverdue(blockDto: BlockDto): Promise { + private handleAlternativeHashReceived(txEvent: TransactionEvent): Finding[] { const out: Finding[] = [] - const now = blockDto.timestamp - - const hashConsensus = new ethers.Contract(this.hashConsensusAddress, HASH_CONSENSUS_ABI, getEthersProvider()) - const frameConfig = await hashConsensus.functions.getFrameConfig() - const MAX_REPORT_DELAY = frameConfig.epochsPerFrame * 32 * SECONDS_PER_SLOT - - const reportDelay = now - (this.lastReportSubmitTimestamp ? this.lastReportSubmitTimestamp : 0) - - const chainConfig = hashConsensus.getChainConfig() - const genesisTimestamp = chainConfig.genesisTime - const currentEpoch = Math.floor((now - genesisTimestamp) / 32 / SECONDS_PER_SLOT) - if (currentEpoch < frameConfig.initialEpoch + frameConfig.epochsPerFrame) { - // If we are still within the initial epochs, skip the overdue check - return out - } - - const timeSinceLastAlert = now - this.lastReportOverdueAlertTimestamp - - if (timeSinceLastAlert > ONE_DAY) { - if (reportDelay > MAX_REPORT_DELAY) { - const f: Finding = new Finding() - f.setName(`πŸ”΄ CSFeeOracle: Report overdue`) - f.setDescription(`Report is overdue by ${Math.floor(reportDelay / ONE_DAY)} days`) - f.setAlertid('CS-FEE-ORACLE-REPORT-OVERDUE') - f.setSeverity(Finding.Severity.HIGH) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') - - out.push(f) - - this.lastReportOverdueAlertTimestamp = now - } - } - return out - } - - public handleAlternativeHashReceived(txEvent: TransactionDto): Finding[] { - const out: Finding[] = [] + const [event] = filterLog( + txEvent.logs, + IHashConsensus.getEvent('ReportReceived').format('full'), + DEPLOYED_ADDRESSES.HASH_CONSENSUS, + ) - const [event] = filterLog(txEvent.logs, HASH_CONSENSUS_REPORT_RECEIVED_EVENT, this.hashConsensusAddress) - if (event && event.args) { + if (event) { const currentReportHashes = [...this.membersLastReport.values()] - .filter((r) => r.refSlot.eq(event.args.refSlot)) + .filter((r) => r.refSlot === event.args.refSlot) .map((r) => r.report) if (currentReportHashes.length > 0 && !currentReportHashes.includes(event.args.report)) { - const f = new Finding() - f.setName('πŸ”΄ HashConsensus: Another report variant appeared (alternative hash)') - f.setDescription( - `More than one distinct report hash received for slot ${event.args.refSlot}. Member: ${event.args.member}. Report: ${event.args.report}`, - ) - f.setAlertid('HASH-CONSENSUS-REPORT-RECEIVED') - f.setSeverity(Finding.Severity.HIGH) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') + const f = Finding.fromObject({ + name: 'πŸ”΄ HashConsensus: Another report variant appeared (alternative hash)', + description: `More than one distinct report hash received for slot ${event.args.refSlot}. Member: ${event.args.member}. Report: ${event.args.report}`, + alertId: 'HASH-CONSENSUS-REPORT-RECEIVED', + source: sourceFromEvent(txEvent), + severity: FindingSeverity.High, + type: FindingType.Info, + }) + out.push(f) } this.membersLastReport.set(event.args.member, { refSlot: event.args.refSlot, report: event.args.report, - blockNumber: txEvent.block.number, }) } return out } - public handleTransaction(txEvent: TransactionDto): Finding[] { - const out: Finding[] = [] + private async handleReportSubmitted(txEvent: TransactionEvent, provider: ethers.Provider): Promise { + const [event] = filterLog( + txEvent.logs, + ICSFeeOracle.getEvent('ReportSubmitted').format('full'), + DEPLOYED_ADDRESSES.CS_FEE_ORACLE, + ) - const reportEvent = filterLog(txEvent.logs, CS_FEE_ORACLE_REPORT_SUBMITTED_EVENT, this.csFeeOracleAddress) - if (reportEvent.length > 0) { - this.lastReportSubmitTimestamp = txEvent.block.timestamp + if (!event) { + return [] } - const hashConsensusFindings = handleEventsOfNotice(txEvent, this.hashConsensusEvents) - const csFeeOracleFindings = handleEventsOfNotice(txEvent, this.csFeeOracleEvents) - const alternativeHashReceivedFindings = this.handleAlternativeHashReceived(txEvent) + const out: Finding[] = [] - out.push(...hashConsensusFindings, ...csFeeOracleFindings, ...alternativeHashReceivedFindings) + const hc = HashConsensus__factory.connect(DEPLOYED_ADDRESSES.HASH_CONSENSUS, provider) + const [addresses, lastReportedRefSlots] = await hc.getFastLaneMembers({ blockTag: txEvent.block.hash }) + addresses.forEach(function (addr, index) { + if (event.args.refSlot !== lastReportedRefSlots[index]) { + out.push( + Finding.fromObject({ + name: 'πŸ”΄ CSM: Sloppy oracle fast lane member', + description: `Member ${etherscanAddress(addr)} (${ORACLE_MEMBERS[addr] || 'unknown'}) was in the fast lane but did not report`, + alertId: 'HASH-CONSENSUS-SLOPPY-MEMBER', + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Medium, + type: FindingType.Info, + }), + ) + } + }) return out } diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts b/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts index 80474ee20..cfd467963 100644 --- a/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts +++ b/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts @@ -11,7 +11,7 @@ import { CSModuleSrv, ICSModuleClient } from './CSModule.srv' import { getCSModuleEvents } from '../../utils/events/cs_module_events' import * as Winston from 'winston' import { ETHProvider } from '../../clients/eth_provider' -import { ethers } from 'forta-agent' +import { ethers } from '@fortanetwork/forta-bot' import { getFortaConfig } from 'forta-agent/dist/sdk/utils' import promClient from 'prom-client' import { Metrics } from '../../utils/metrics/metrics' diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.ts b/csm-alerts/src/services/CSModule/CSModule.srv.ts index c72b7db42..6e8ffc6ab 100644 --- a/csm-alerts/src/services/CSModule/CSModule.srv.ts +++ b/csm-alerts/src/services/CSModule/CSModule.srv.ts @@ -1,444 +1,239 @@ -import { either as E } from 'fp-ts' -import { EventOfNotice, TransactionDto, handleEventsOfNotice, BlockDto } from '../../entity/events' -import { elapsedTime } from '../../utils/time' -import { Logger } from 'winston' -import { Finding } from '../../generated/proto/alert_pb' -import { ethers, filterLog, getEthersProvider } from 'forta-agent' -import CS_MODULE_ABI from '../../brief/abi/CSModule.json' -import BigNumber from 'bignumber.js' import { - BASIS_POINTS_DIVIDER, - MAX_EMPTY_BATCHES_IN_THE_QUEUE, - MAX_OPERATORS_WITH_SAME_MANAGER_OR_REWARD_ADDRESS, - MAX_TARGET_SHARE_PERCENT_USED, - MAX_VALIDATORS_IN_THE_QUEUE, - ONE_DAY, -} from '../../utils/constants' -import { assertInvariant, getLogsByChunks } from '../../utils/utils' -import STAKING_ROUTER_ABI from '../../brief/abi/StakingRouter.json' -import { Config } from '../../utils/env/env' -import { NODE_OPERATOR_ADDED_EVENT_ABI } from '../../utils/events/cs_module_events' - -export abstract class ICSModuleClient { - public abstract getBlockByNumber(blockNumber: number): Promise> -} + BlockEvent, + Finding, + FindingSeverity, + FindingType, + TransactionEvent, + ethers, + filterLog, +} from '@fortanetwork/forta-bot' +import { Logger } from 'winston' + +import { IS_CLI } from '../../config' +import { CSModule__factory, StakingRouter__factory } from '../../generated/typechain' +import { getLogger } from '../../logger' +import { BASIS_POINT_MUL, SECONDS_PER_DAY } from '../../shared/constants' +import { sourceFromEvent } from '../../utils/findings' +import { RedefineMode, requireWithTier } from '../../utils/require' +import * as Constants from '../constants' + +const { DEPLOYED_ADDRESSES } = requireWithTier(module, '../constants', RedefineMode.Merge) +const ICSModule = CSModule__factory.createInterface() + +const CHECK_QUEUE_INTERVAL_BLOCKS = 1801 // ~ 4 times a day +const TARGET_SHARE_USED_PERCENT_MAX = 95 +const QUEUE_EMPTY_BATCHES_MAX = 30 +const QUEUE_VALIDATORS_MAX = 200 class Batch { - value: BigNumber + value: bigint - constructor(v: BigNumber) { + constructor(v: bigint) { this.value = v } noId(): bigint { - return BigInt(this.value.toString()) >> BigInt(192) + return this.value >> 192n } keys(): bigint { - return (BigInt(this.value.toString()) >> BigInt(128)) & BigInt('0xFFFFFFFFFFFFFFFF') + return (this.value >> 128n) & BigInt('0xFFFFFFFFFFFFFFFF') } next(): bigint { - return BigInt(this.value.toString()) & BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF') + return this.value & BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF') } } -interface StakingModule { - stakingModuleAddress: string - targetShare: number // in basis points -} - export class CSModuleSrv { - private readonly name = 'CSModuleSrv' private readonly logger: Logger - private readonly csModuleClient: ICSModuleClient - private readonly csModuleAddress: string - private readonly stakingRouterAddress: string - private readonly csModuleEvents: EventOfNotice[] - private lastDuplicateAddressesAlertTimestamp: number = 0 - private lastModuleShareIsCloseToTargetShareAlertTimestamp: number = 0 - private lastTooManyEmptyBatchesAlertTimestamp: number = 0 - private lastTooManyValidatorsAlertTimestamp: number = 0 - private addressCounts: { [address: string]: number } = {} - private nodeOperatorAddedEvents: ethers.Event[] = [] - - constructor( - logger: Logger, - csModuleClient: ICSModuleClient, - csModuleAddress: string, - stakingRouterAddress: string, - csModuleEvents: EventOfNotice[], - ) { - this.logger = logger - this.csModuleClient = csModuleClient - this.csModuleAddress = csModuleAddress - this.stakingRouterAddress = stakingRouterAddress - this.csModuleEvents = csModuleEvents - } - public async initialize(currentBlock: number): Promise { - const start = new Date().getTime() - - const config = new Config() - - const currBlock = await this.csModuleClient.getBlockByNumber(currentBlock) - if (E.isLeft(currBlock)) { - this.logger.error(elapsedTime(`Failed [${this.name}.initialize]`, start)) - return currBlock.left - } + private lastFiredAt = { + moduleShareIsCloseToTargetShare: 0, + tooManyEmptyBatches: 0, + tooManyValidators: 0, + } - const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) - const startBlock = config.csModuleInitBlock - const csModuleNodeOperatorAddedFilter = csModule.filters.NodeOperatorAdded() - this.nodeOperatorAddedEvents = await getLogsByChunks( - csModule, - csModuleNodeOperatorAddedFilter, - startBlock, - currentBlock, - ) + constructor() { + this.logger = getLogger(CSModuleSrv.name) + } - this.logger.info(elapsedTime(`[${this.name}.initialize]`, start)) - return null + async handleBlock(blockEvent: BlockEvent, provider: ethers.Provider): Promise { + return [ + ...(await this.checkDepositQueue(blockEvent, provider)), + ...(await this.checkModuleShare(blockEvent, provider)), + ] } - public getName(): string { - return this.name + async handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider): Promise { + return this.handleNotableOperatorsCreated(txEvent) } - public handleEveryHundredOperatorsCreated(txEvent: TransactionDto) { + private handleNotableOperatorsCreated(txEvent: TransactionEvent) { const out: Finding[] = [] - const nodeOperatorAddedEvents = filterLog(txEvent.logs, NODE_OPERATOR_ADDED_EVENT_ABI, this.csModuleAddress) - nodeOperatorAddedEvents.forEach((event) => { - if (Number(event.args.nodeOperatorId) % 100 === 0 || Number(event.args.nodeOperatorId) === 69) { - const f: Finding = new Finding() - f.setName(`πŸ”΅ CSModule: Notable Node Operator creation`) - f.setDescription(`Operator #${event.args.nodeOperatorId} was created.`) - f.setAlertid('CS-MODULE-NOTABLE-NODE-OPERATOR-CREATION') - f.setSeverity(Finding.Severity.INFO) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') + const nodeOperatorAddedEvents = filterLog( + txEvent.logs, + ICSModule.getEvent('NodeOperatorAdded').format('full'), + DEPLOYED_ADDRESSES.CS_MODULE, + ) + for (const event of nodeOperatorAddedEvents) { + if (event.args.nodeOperatorId % 100n === 0n || event.args.nodeOperatorId === 69n) { + const f = Finding.fromObject({ + name: `πŸ”΅ CSModule: Notable Node Operator creation`, + description: `Operator #${event.args.nodeOperatorId} was created.`, + alertId: 'CS-MODULE-NOTABLE-NODE-OPERATOR-CREATION', + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Info, + type: FindingType.Info, + }) out.push(f) } - }) - - return out - } - - async handleTransaction(txEvent: TransactionDto): Promise { - const out: Finding[] = [] - - const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) - // Important to get events of type ethers.Event specificly - // therefore fetching current block - const csModuleNodeOperatorAddedFilter = csModule.filters.NodeOperatorAdded() - const [events] = await getLogsByChunks( - csModule, - csModuleNodeOperatorAddedFilter, - txEvent.block.number, // start block, - txEvent.block.number, // end block, - ) - if (events) { - this.nodeOperatorAddedEvents.push(events) } - const csModuleFindings = handleEventsOfNotice(txEvent, this.csModuleEvents) - const everyHundredOperatorsCreatedFindings = this.handleEveryHundredOperatorsCreated(txEvent) - - out.push(...csModuleFindings, ...everyHundredOperatorsCreatedFindings) - return out } - async getTotalActiveValidators(blockDto: BlockDto) { - const stakingRouter = new ethers.Contract(this.stakingRouterAddress, STAKING_ROUTER_ABI, getEthersProvider()) - const [smDigests] = await stakingRouter.functions.getAllStakingModuleDigests({ - blockTag: blockDto.number, - }) - let totalActiveValidators = 0 - for (const smDigest of smDigests) { - const summary = smDigest.summary - const totalDepositedValidators = (summary.totalDepositedValidators as BigNumber).toNumber() - const totalExitedValidators = (summary.totalExitedValidators as BigNumber).toNumber() - totalActiveValidators += totalDepositedValidators - totalExitedValidators - } + private async checkModuleShare(blockEvent: BlockEvent, provider: ethers.Provider): Promise { + const stakingRouter = StakingRouter__factory.connect(DEPLOYED_ADDRESSES.STAKING_ROUTER, provider) - return totalActiveValidators - } + let totalActiveValidators = 0n + let csmActiveValidators = 0n + let csmTargetShareBP = 0n - public async handleModuleShareIsCloseToTargetShare( - blockDto: BlockDto, - totalActiveValidators: number, - ): Promise { - const out: Finding[] = [] - const now = blockDto.timestamp + const digests = await stakingRouter.getAllStakingModuleDigests({ blockTag: blockEvent.blockHash }) - const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) - const stakingRouter = new ethers.Contract(this.stakingRouterAddress, STAKING_ROUTER_ABI, getEthersProvider()) + for (const d of digests) { + const moduleActiveValidators = d.summary.totalDepositedValidators - d.summary.totalExitedValidators + totalActiveValidators += moduleActiveValidators - const summary = await csModule.functions.getStakingModuleSummary() - const csTotalDepositedValidators = (summary.totalDepositedValidators as BigNumber).toNumber() - const csTotalExitedValidators = (summary.totalExitedValidators as BigNumber).toNumber() - const csTotalActiveValidators = csTotalDepositedValidators - csTotalExitedValidators + if (d.state.stakingModuleAddress === DEPLOYED_ADDRESSES.CS_MODULE) { + csmActiveValidators = moduleActiveValidators + csmTargetShareBP = d.state.targetShare + } + } - const stakingModules = await stakingRouter.functions.getStakingModules() - const csModuleInfo = stakingModules.find( - (module: StakingModule) => module.stakingModuleAddress === this.csModuleAddress, - ) + if (totalActiveValidators === 0n || csmActiveValidators === 0n) { + this.logger.debug('No validators in modules or in the CSM') + return [] + } - const currentShare = Math.ceil((csTotalActiveValidators / totalActiveValidators) * 100) - const targetShare = Math.ceil(csModuleInfo.targetShare / BASIS_POINTS_DIVIDER) - const percentUsed = Math.ceil((currentShare / targetShare) * 100) + if (csmTargetShareBP === 0n) { + this.logger.debug('CSM has no target share') + return [] + } - const timeSinceLastAlert = now - this.lastModuleShareIsCloseToTargetShareAlertTimestamp + const csmCurrentShareBP = (csmActiveValidators * BASIS_POINT_MUL) / totalActiveValidators + const percentUsed = (csmCurrentShareBP * 100n) / csmTargetShareBP - if (timeSinceLastAlert > ONE_DAY) { - if (percentUsed >= MAX_TARGET_SHARE_PERCENT_USED) { - const f: Finding = new Finding() - f.setName(`🟒 CSModule: Module's share is close to the targetShare.`) - f.setDescription( - `The module's share is close to the target share (${percentUsed}% used). The module has ${csTotalActiveValidators} validators against ${totalActiveValidators} total. Target share: ${csModule.targetShare}`, - ) - f.setAlertid('CS-MODULE-CLOSE-TO-TARGET-SHARE') - f.setSeverity(Finding.Severity.LOW) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') + const now = blockEvent.block.timestamp + const out: Finding[] = [] + if (now - this.lastFiredAt.moduleShareIsCloseToTargetShare > SECONDS_PER_DAY) { + if (percentUsed > TARGET_SHARE_USED_PERCENT_MAX) { + const f = Finding.fromObject({ + name: `🟒 CSModule: Module's share is close to the target share.`, + description: `The module's share is close to the target share (${percentUsed}% utilization). Current share is ${(Number(csmCurrentShareBP * 100n) / Number(BASIS_POINT_MUL)).toFixed(2)}%. Target share is ${(Number(csmTargetShareBP * 100n) / Number(BASIS_POINT_MUL)).toFixed(2)}%`, + alertId: 'CS-MODULE-CLOSE-TO-TARGET-SHARE', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) out.push(f) - - this.lastModuleShareIsCloseToTargetShareAlertTimestamp = now + this.lastFiredAt.moduleShareIsCloseToTargetShare = now } } + return out } - public async handleDuplicateAddresses(blockDto: BlockDto) { - const out: Finding[] = [] - const now = blockDto.timestamp - - this.nodeOperatorAddedEvents.forEach((event) => { - const addresses = [event.args?.managerAddress, event.args?.rewardAddress] - addresses.forEach((address) => { - if (address) { - this.addressCounts[address] = (this.addressCounts[address] ?? 0) + 1 - } - }) - }) - - const timeSinceLastAlert = now - this.lastDuplicateAddressesAlertTimestamp - - if (timeSinceLastAlert > ONE_DAY) { - Object.entries(this.addressCounts).forEach(([address, count]) => { - if (count > MAX_OPERATORS_WITH_SAME_MANAGER_OR_REWARD_ADDRESS) { - const f: Finding = new Finding() - f.setName( - `🟒 CSModule: More than ${MAX_OPERATORS_WITH_SAME_MANAGER_OR_REWARD_ADDRESS} operators have the same manager or reward address.`, - ) - f.setDescription(`${count} operators have ${address} as manager or reward address.`) - f.setAlertid('CS-MODULE-DUPLICATE-MANAGER-OR-REWARD-ADDRESS') - f.setSeverity(Finding.Severity.LOW) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') - - out.push(f) - - this.lastDuplicateAddressesAlertTimestamp = now - } - }) + private async checkDepositQueue(blockEvent: BlockEvent, provider: ethers.Provider): Promise { + if (blockEvent.blockNumber % CHECK_QUEUE_INTERVAL_BLOCKS !== 0 && !IS_CLI) { + return [] } - return out - } - public async handleDepositQueueAlerts(blockDto: BlockDto) { - const out: Finding[] = [] - const now = blockDto.timestamp + const csm = CSModule__factory.connect(DEPLOYED_ADDRESSES.CS_MODULE, provider) + const ethCallOpts = { blockTag: blockEvent.blockHash } - const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) const queueLookup: Map = new Map() + let validatorsInQueue = 0n let emptyBatchCount = 0 - const queue = await csModule.depositQueue() - let validatorsInQueue = 0 + + const queue = await csm.depositQueue(ethCallOpts) let index = queue.head - while (index < queue.tail) { - const batchValue: BigNumber = await csModule.depositQueueItem(index) + this.logger.debug(`Queue head: ${queue.head}`) + this.logger.debug(`Queue tail: ${queue.tail}`) + + while (index >= queue.head && index < queue.tail) { + const batchValue = await csm.depositQueueItem(index, ethCallOpts) const batch = new Batch(batchValue) - if (batch.next() === BigInt(0)) { + + // Covers zero-batch case as well. + if (batch.next() === 0n) { break } + const nodeOperatorId = batch.noId() const keysInBatch = batch.keys() - const nodeOperator = await csModule.getNodeOperator(nodeOperatorId, { blockTag: blockDto.number }) - const depositableKeys = nodeOperator.depositableValidatorsCount + const no = await csm.getNodeOperator(nodeOperatorId, ethCallOpts) - const keysSeenForOperator = queueLookup.get(nodeOperatorId) || 0 - - if (BigInt(keysSeenForOperator) >= depositableKeys) { + const keysSeenForOperator = queueLookup.get(nodeOperatorId) ?? 0n + if (keysSeenForOperator >= no.depositableValidatorsCount) { emptyBatchCount++ } else { - queueLookup.set(nodeOperatorId, BigInt(keysSeenForOperator) + keysInBatch) - validatorsInQueue += Number(keysInBatch) + const depositableFromBatch = + keysSeenForOperator + keysInBatch > no.depositableValidatorsCount + ? no.depositableValidatorsCount - keysSeenForOperator + : keysInBatch + validatorsInQueue += depositableFromBatch + queueLookup.set(nodeOperatorId, depositableFromBatch) } + // TODO: Think about how it works in on-chain code. index = batch.next() } - const timeSinceLastEmptyBatchesAlert = now - this.lastTooManyEmptyBatchesAlertTimestamp + this.logger.debug(`Empty batches: ${emptyBatchCount}`) + this.logger.debug(`Validators in the queue: ${validatorsInQueue}`) - if (timeSinceLastEmptyBatchesAlert > ONE_DAY) { - if (emptyBatchCount > MAX_EMPTY_BATCHES_IN_THE_QUEUE) { - const f: Finding = new Finding() - f.setName(`🟒 CSModule: Too many empty batces in the deposit queue.`) - f.setDescription(`${emptyBatchCount} empty batces in the deposit queue.`) - f.setAlertid('CS-MODULE-TOO-MANY-EMPTY-BATCHES-IN-THE-QUEUE') - f.setSeverity(Finding.Severity.LOW) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') + const now = blockEvent.block.timestamp + const out: Finding[] = [] + if (now - this.lastFiredAt.tooManyEmptyBatches > SECONDS_PER_DAY) { + if (emptyBatchCount > QUEUE_EMPTY_BATCHES_MAX) { + const f = Finding.fromObject({ + name: `🟒 CSModule: Too many empty batches in the deposit queue.`, + description: `More than ${QUEUE_EMPTY_BATCHES_MAX} empty batches in the deposit queue.`, + alertId: 'CS-MODULE-TOO-MANY-EMPTY-BATCHES-IN-THE-QUEUE', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) out.push(f) - - this.lastTooManyEmptyBatchesAlertTimestamp = now + this.lastFiredAt.tooManyEmptyBatches = now } } - const timeSinceLastMaxValidatorsAlert = now - this.lastTooManyValidatorsAlertTimestamp - - if (timeSinceLastMaxValidatorsAlert > ONE_DAY) { - if (validatorsInQueue > MAX_VALIDATORS_IN_THE_QUEUE) { - const f: Finding = new Finding() - f.setName('🟒 CSModule: Too many validators in the queue.') - f.setDescription(`CSModule has ${validatorsInQueue} keys in the deposit queue.`) - f.setAlertid('CS-MODULE-TOO-MANY-VALIDATORS-IN-THE-QUEUE') - f.setSeverity(Finding.Severity.LOW) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') - + if (now - this.lastFiredAt.tooManyValidators > SECONDS_PER_DAY) { + if (validatorsInQueue > QUEUE_VALIDATORS_MAX) { + const f = Finding.fromObject({ + name: '🟒 CSModule: Too many validators in the queue.', + description: `There's ${validatorsInQueue} keys waiting for deposit in CSM.`, + alertId: 'CS-MODULE-TOO-MANY-VALIDATORS-IN-THE-QUEUE', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) out.push(f) - - this.lastTooManyValidatorsAlertTimestamp = now + this.lastFiredAt.tooManyValidators = now } } return out } - - async handleBlock(blockDto: BlockDto): Promise { - const start = new Date().getTime() - const findings: Finding[] = [] - - const csModule = new ethers.Contract(this.csModuleAddress, CS_MODULE_ABI, getEthersProvider()) - - // Invariants - let totalDepositedValidators = 0 - let totalExitedValidators = 0 - let depositableValidatorsCount = 0 - - for (let noId = 0; noId < csModule.getNodeOperatorsCount(); noId++) { - const noSummary = csModule.getNodeOperatorSummary(noId) - - if (!csModule.publicRelease) { - assertInvariant( - noSummary.totalAddedKeys > csModule.MAX_SIGNING_KEYS_PER_OPERATOR_BEFORE_PUBLIC_RELEASE, - `Invariant failed: Node Operator ${noId} has more keys than allowed before public release.`, - findings, - ) - } - - const no = await csModule.getNodeOperator(noId) - - assertInvariant( - !(no.totalAddedKeys >= no.totalDepositedKeys && no.totalDepositedKeys >= no.totalWithdrawnKeys), - `Invariant failed: totalAddedKeys >= totalDepositedKeys >= totalWithdrawnKeys for Node Operator ${noId}`, - findings, - ) - assertInvariant( - !(no.totalDepositedKeys <= no.totalVettedKeys && no.totalVettedKeys <= no.totalAddedKeys), - `Invariant failed: totalDepositedKeys <= totalVettedKeys <= totalAddedKeys for Node Operator ${noId}`, - findings, - ) - assertInvariant( - !(no.stuckValidatorsCount + no.totalWithdrawnKeys <= no.totalDepositedKeys), - `Invariant failed: stuckValidatorsCount + totalWithdrawnKeys <= totalDepositedKeys for Node Operator ${noId}`, - findings, - ) - assertInvariant( - !(no.depositableValidatorsCount + no.totalExitedKeys <= no.totalAddedKeys), - `Invariant failed: depositableValidatorsCount + totalExitedKeys <= totalAddedKeys for Node Operator ${noId}`, - findings, - ) - assertInvariant( - no.proposedManagerAddress === no.managerAddress, - `Invariant failed: proposedManagerAddress should not equal managerAddress for Node Operator ${noId}`, - findings, - ) - assertInvariant( - no.proposedRewardAddress === no.rewardAddress, - `Invariant failed: proposedRewardAddress should not equal rewardAddress for Node Operator ${noId}`, - findings, - ) - assertInvariant( - no.managerAddress === ethers.constants.AddressZero, - `Invariant failed: managerAddress should not be zero address for Node Operator ${noId}`, - findings, - ) - assertInvariant( - no.rewardAddress === ethers.constants.AddressZero, - `Invariant failed: rewardAddress should not be zero address for Node Operator ${noId}`, - findings, - ) - - const queue = await csModule.depositQueue() - let index = queue.head - const tail = queue.tail - let enqueuedCount = BigInt(0) - while (index < tail) { - const batchValue: BigNumber = await csModule.depositQueueItem(index) - const batch = new Batch(batchValue) - if (batch.noId() === BigInt(noId)) { - enqueuedCount += batch.keys() - } - index = batch.next() - if (index === BigInt(0)) { - break - } - } - - assertInvariant( - no.enqueuedCount !== enqueuedCount, - `Invariant failed: enqueuedCount mismatch for Node Operator ${noId}`, - findings, - ) - - totalDepositedValidators += new BigNumber(noSummary.totalDepositedKeys.toString()).toNumber() - totalExitedValidators += new BigNumber(noSummary.totalExitedKeys.toString()).toNumber() - depositableValidatorsCount += new BigNumber(noSummary.depositableValidatorsCount.toString()).toNumber() - } - - const smSummary = await csModule.functions.getStakingModuleSummary() - assertInvariant( - smSummary.totalDepositedValidators !== totalDepositedValidators || - smSummary.totalExitedValidators !== totalExitedValidators || - smSummary.depositableValidatorsCount !== depositableValidatorsCount, - `Invariant failed: Global summary values do not match the accumulated node operator summaries.`, - findings, - ) - - const moduleShareIsCloseToTargetShareFindings = this.handleModuleShareIsCloseToTargetShare( - blockDto, - await this.getTotalActiveValidators(blockDto), - ) - const duplicateAddressesFindings = this.handleDuplicateAddresses(blockDto) - const depositQueueFindings = this.handleDepositQueueAlerts(blockDto) - - findings.push( - ...(await moduleShareIsCloseToTargetShareFindings), - ...(await duplicateAddressesFindings), - ...(await depositQueueFindings), - ) - - this.logger.info(elapsedTime(CSModuleSrv.name + '.' + this.handleBlock.name, start)) - - return findings - } } diff --git a/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.spec.ts b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.spec.ts similarity index 99% rename from csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.spec.ts rename to csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.spec.ts index 46bd8fff3..8092f4241 100644 --- a/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.spec.ts +++ b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.spec.ts @@ -21,7 +21,7 @@ import { getRolesMonitoringEvents } from '../../utils/events/roles_monitoring_ev import { ProxyWatcherSrv, IProxyWatcherClient } from './ProxyWatcher.srv' import * as Winston from 'winston' import { ETHProvider } from '../../clients/eth_provider' -import { ethers } from 'forta-agent' +import { ethers } from '@fortanetwork/forta-bot' import { getFortaConfig } from 'forta-agent/dist/sdk/utils' import promClient from 'prom-client' import { Metrics } from '../../utils/metrics/metrics' diff --git a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts new file mode 100644 index 000000000..46d891539 --- /dev/null +++ b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts @@ -0,0 +1,68 @@ +import { Finding, TransactionEvent, ethers } from '@fortanetwork/forta-bot' + +import { handleEventsOfNotice } from '../../entity/events' +import { DeployedAddresses, EventOfNotice } from '../../shared/types' +import { RedefineMode, requireWithTier } from '../../utils/require' +import * as Constants from '../constants' +import * as Events from './events' + +const { ALIASES, DEPLOYED_ADDRESSES, ORACLE_MEMBERS } = requireWithTier( + module, + '../constants', + RedefineMode.Merge, +) + +function asContract(key: keyof DeployedAddresses): { name: string; address: string } { + return { name: ALIASES[key], address: DEPLOYED_ADDRESSES[key] } +} + +const CSM_PROXY_CONTRACTS = [ + asContract('CS_MODULE'), + asContract('CS_ACCOUNTING'), + asContract('CS_FEE_DISTRIBUTOR'), + asContract('CS_FEE_ORACLE'), +] + +const CSM_ACL_CONTRACTS = [ + asContract('CS_MODULE'), + asContract('CS_ACCOUNTING'), + asContract('CS_FEE_DISTRIBUTOR'), + asContract('CS_FEE_ORACLE'), + asContract('HASH_CONSENSUS'), +] + +const CSM_ASSET_RECOVERER_CONTRACTS = [ + asContract('CS_MODULE'), + asContract('CS_ACCOUNTING'), + asContract('CS_FEE_DISTRIBUTOR'), + asContract('CS_FEE_ORACLE'), +] + +// prettier-ignore +const CSM_PAUSABLE_CONTRACTS = [ + asContract('CS_MODULE'), + asContract('CS_ACCOUNTING'), + asContract('CS_FEE_ORACLE'), +] + +export class EventsWatcherSrv { + private readonly eventsOfNotice: EventOfNotice[] + + constructor() { + this.eventsOfNotice = [ + ...Events.getHashConsensusEvents(DEPLOYED_ADDRESSES.HASH_CONSENSUS, ORACLE_MEMBERS), + ...Events.getCSFeeDistributorEvents(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR), + ...Events.getCSAccountingEvents(DEPLOYED_ADDRESSES.CS_ACCOUNTING), + ...Events.getCSFeeOracleEvents(DEPLOYED_ADDRESSES.CS_FEE_ORACLE), + ...Events.getCSModuleEvents(DEPLOYED_ADDRESSES.CS_MODULE), + ...Events.getAssetRecovererEvents(CSM_ASSET_RECOVERER_CONTRACTS), + ...Events.getOssifiedProxyEvents(CSM_PROXY_CONTRACTS), + ...Events.getRolesMonitoringEvents(CSM_ACL_CONTRACTS), + ...Events.getPausableEvents(CSM_PAUSABLE_CONTRACTS), + ] + } + + public handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider): Finding[] { + return handleEventsOfNotice(txEvent, this.eventsOfNotice) + } +} diff --git a/csm-alerts/src/services/ProxyWatcher/__snapshots__/ProxyWatcher.srv.spec.ts.snap b/csm-alerts/src/services/EventsWatcher/__snapshots__/ProxyWatcher.srv.spec.ts.snap similarity index 100% rename from csm-alerts/src/services/ProxyWatcher/__snapshots__/ProxyWatcher.srv.spec.ts.snap rename to csm-alerts/src/services/EventsWatcher/__snapshots__/ProxyWatcher.srv.spec.ts.snap diff --git a/csm-alerts/src/services/EventsWatcher/events/accounting.ts b/csm-alerts/src/services/EventsWatcher/events/accounting.ts new file mode 100644 index 000000000..c8896643c --- /dev/null +++ b/csm-alerts/src/services/EventsWatcher/events/accounting.ts @@ -0,0 +1,46 @@ +import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' + +import { CSAccounting__factory } from '../../../generated/typechain' +import { EventOfNotice } from '../../../shared/types' +import { etherscanAddress, formatEther } from '../../../utils/string' + +const ICSAccounting = CSAccounting__factory.createInterface() + +export function getCSAccountingEvents(accounting: string): EventOfNotice[] { + return [ + { + address: accounting, + abi: ICSAccounting.getEvent('ChargePenaltyRecipientSet').format('full'), + alertId: 'CS-ACCOUNTING-CHARGE-PENALTY-RECIPIENT-SET', + name: '🚨 CSAccounting: Charge penalty recipient set', + description: (args: ethers.Result) => + `Charge penalty recipient set to ${etherscanAddress(args.chargeRecipient)} (expecting the treasury)`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: accounting, + abi: ICSAccounting.getEvent('BondCurveUpdated').format('full'), + alertId: 'CS-ACCOUNTING-BOND-CURVE-UPDATED', + name: '🚨 CSAccounting: Bond curve updated', + description: (args: ethers.Result) => { + const bondCurveString = args.bondCurve.map((value: bigint) => formatEther(value)).join(', ') + return `Bond curve #${args.curveId} updated. New values: [${bondCurveString}]` + }, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: accounting, + abi: ICSAccounting.getEvent('BondCurveAdded').format('full'), + alertId: 'CS-ACCOUNTING-BOND-CURVE-ADDED', + name: 'πŸ”΄ CSAccounting: Bond curve added', + description: (args: ethers.Result) => { + const bondCurveString = args.bondCurve.map((value: bigint) => formatEther(value)).join(', ') + return `Bond curve added: [${bondCurveString}]` + }, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + ] +} diff --git a/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts b/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts new file mode 100644 index 000000000..07a4196c9 --- /dev/null +++ b/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts @@ -0,0 +1,78 @@ +import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' + +import { AssetRecoverer__factory } from '../../../generated/typechain' +import { EventOfNotice } from '../../../shared/types' +import { etherscanAddress, formatEther, formatShares } from '../../../utils/string' + +const IAssetRecoverer = AssetRecoverer__factory.createInterface() + +export function getAssetRecovererEvents(contracts: { name: string; address: string }[]): EventOfNotice[] { + return contracts.flatMap((contract) => { + return [ + { + address: contract.address, + abi: IAssetRecoverer.getEvent('ERC20Recovered').format('full'), + alertId: 'ASSET-RECOVERER-ERC20-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: ERC20 recovered', + description: (args: ethers.Result) => + `ERC20 recovered on ${contract.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Token: ${etherscanAddress(args.token)}\n` + + `Amount: ${args.amount}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IAssetRecoverer.getEvent('ERC721Recovered').format('full'), + alertId: 'ASSET-RECOVERER-ERC721-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: ERC721 recovered', + description: (args: ethers.Result) => + `ERC721 recovered on ${contract.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Token: ${etherscanAddress(args.token)}\n` + + `Token ID: ${args.tokenId}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IAssetRecoverer.getEvent('ERC1155Recovered').format('full'), + alertId: 'ASSET-RECOVERER-ERC1155-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: ERC1155 recovered', + description: (args: ethers.Result) => + `ERC1155 recovered on ${contract.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Token: ${etherscanAddress(args.token)}\n` + + `Token ID: ${args.tokenId}\n` + + `Amount: ${args.amount}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IAssetRecoverer.getEvent('EtherRecovered').format('full'), + alertId: 'ASSET-RECOVERER-ETHER-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: Ether recovered', + description: (args: ethers.Result) => + `Ether recovered on ${contract.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Amount: ${formatEther(args.amount)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IAssetRecoverer.getEvent('StETHSharesRecovered').format('full'), + alertId: 'ASSET-RECOVERER-STETH-SHARES-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: StETH Shares recovered', + description: (args: ethers.Result) => + `StETH Shares recovered on ${contract.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Amount: ${formatShares(args.shares)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + ] + }) +} diff --git a/csm-alerts/src/services/EventsWatcher/events/distributor.ts b/csm-alerts/src/services/EventsWatcher/events/distributor.ts new file mode 100644 index 000000000..0c57acf43 --- /dev/null +++ b/csm-alerts/src/services/EventsWatcher/events/distributor.ts @@ -0,0 +1,32 @@ +import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' + +import { CSFeeDistributor__factory } from '../../../generated/typechain' +import { EventOfNotice } from '../../../shared/types' + +const ICSFeeDistributor = CSFeeDistributor__factory.createInterface() + +export function getCSFeeDistributorEvents(distributorAddress: string): EventOfNotice[] { + return [ + { + address: distributorAddress, + abi: ICSFeeDistributor.getEvent('DistributionDataUpdated').format('full'), + alertId: 'CSFEE-DISTRIBUTOR-DISTRIBUTION-DATA-UPDATED', + name: 'πŸ”΅ CSFeeDistributor: Distribution data updated', + description: (args: ethers.Result) => + `Total Claimable Shares: ${args.totalClaimableShares}\n` + + `Tree Root: ${args.treeRoot}\n` + + `Tree CID: ${args.treeCid}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + { + address: distributorAddress, + abi: ICSFeeDistributor.getEvent('DistributionLogUpdated').format('full'), + alertId: 'CSFEE-DISTRIBUTOR-DISTRIBUTION-LOG-UPDATED', + name: 'πŸ”΅ CSFeeDistributor: Distribution log updated', + description: (args: ethers.Result) => `Log CID: ${args.logCid}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + ] +} diff --git a/csm-alerts/src/services/EventsWatcher/events/index.ts b/csm-alerts/src/services/EventsWatcher/events/index.ts new file mode 100644 index 000000000..08df6744d --- /dev/null +++ b/csm-alerts/src/services/EventsWatcher/events/index.ts @@ -0,0 +1,8 @@ +export * from './assetRecoverer' +export * from './distributor' +export * from './accounting' +export * from './pausable' +export * from './proxies' +export * from './module' +export * from './oracle' +export * from './roles' diff --git a/csm-alerts/src/services/EventsWatcher/events/module.ts b/csm-alerts/src/services/EventsWatcher/events/module.ts new file mode 100644 index 000000000..16d8d6987 --- /dev/null +++ b/csm-alerts/src/services/EventsWatcher/events/module.ts @@ -0,0 +1,82 @@ +import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' + +import { CSModule__factory } from '../../../generated/typechain' +import { EventOfNotice } from '../../../shared/types' +import { formatEther } from '../../../utils/string' + +const ICSModule = CSModule__factory.createInterface() + +export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { + return [ + { + address: csmAddress, + abi: ICSModule.getEvent('PublicRelease').format('full'), + alertId: 'CS-MODULE-PUBLIC-RELEASE', + name: 'πŸ”΅ CSModule: Public release', + description: () => 'CSM public release is activated! πŸ₯³', + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + { + address: csmAddress, + abi: ICSModule.getEvent('VettedSigningKeysCountDecreased').format('full'), + alertId: 'CS-MODULE-VETTED-SIGNING-KEYS-DECREASED', + name: 'πŸ”΅ CSModule: Node Operator vetted signing keys decreased', + description: (args: ethers.Result) => `Vetted signing keys decreased for Node Operator #${args.nodeOperatorId}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: csmAddress, + abi: ICSModule.getEvent('TargetValidatorsCountChanged').format('full'), + alertId: 'CS-MODULE-TARGET-LIMIT-MODE-CHANGED', + name: '🟠 CSModule: Target limit mode changed', + description: (args: ethers.Result) => + `Target limit mode: ${args.targetLimitMode} (${ + args.targetLimitMode === 0n ? 'disabled' : args.targetLimitMode === 1n ? 'soft' : 'forced' + }) set for Node Operator ${args.nodeOperatorId}`, + severity: FindingSeverity.Medium, + type: FindingType.Info, + }, + { + address: csmAddress, + abi: ICSModule.getEvent('ELRewardsStealingPenaltyReported').format('full'), + alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-REPORTED', + name: 'πŸ”΄ CSModule: EL Rewards stealing penalty reported', + description: (args: ethers.Result) => + `EL Rewards stealing penalty reported for Node Operator #${args.nodeOperatorId} with ${formatEther(args.stolenAmount)} potentially stolen`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: csmAddress, + abi: ICSModule.getEvent('ELRewardsStealingPenaltyCancelled').format('full'), + alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-CANCELLED', + name: 'πŸ”΄ CSModule: EL Rewards stealing penalty cancelled', + description: (args: ethers.Result) => + `EL Rewards stealing penalty (${formatEther(args.amount)}) cancelled for Node Operator #${args.nodeOperatorId}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: csmAddress, + abi: ICSModule.getEvent('ELRewardsStealingPenaltySettled').format('full'), + alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-SETTLED', + name: 'πŸ”΄ CSModule: EL Rewards stealing penalty settled', + description: (args: ethers.Result) => + `EL Rewards stealing penalty settled for Node Operator #${args.nodeOperatorId}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: csmAddress, + abi: ICSModule.getEvent('ELRewardsStealingPenaltyCompensated').format('full'), + alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-COMPENSATED', + name: 'πŸ”΄ CSModule: EL Rewards stealing penalty compensated', + description: (args: ethers.Result) => + `${formatEther(args.stolenAmount)} of EL Rewards stealing penalty was compensated for Node Operator #${args.nodeOperatorId}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + ] +} diff --git a/csm-alerts/src/services/EventsWatcher/events/oracle.ts b/csm-alerts/src/services/EventsWatcher/events/oracle.ts new file mode 100644 index 000000000..be01d606f --- /dev/null +++ b/csm-alerts/src/services/EventsWatcher/events/oracle.ts @@ -0,0 +1,176 @@ +import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' + +import { CSFeeOracle__factory, HashConsensus__factory } from '../../../generated/typechain' +import { EventOfNotice } from '../../../shared/types' +import { etherscanAddress } from '../../../utils/string' + +const IHashConsensus = HashConsensus__factory.createInterface() +const ICSFeeOracle = CSFeeOracle__factory.createInterface() + +export function getHashConsensusEvents(address: string, knownMembers: { [key: string]: string }): EventOfNotice[] { + return [ + { + address, + abi: IHashConsensus.getEvent('MemberAdded').format('full'), + alertId: 'HASH-CONSENSUS-MEMBER-ADDED', + name: 'πŸ”΄ HashConsensus: Member added', + description: (args: ethers.Result) => + `New member ${etherscanAddress(args.addr)} (${knownMembers[args.addr] ?? 'unknown'}) added\n` + + `Total members: ${args.newTotalMembers}\n` + + `New quorum: ${args.newQuorum}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('MemberRemoved').format('full'), + alertId: 'HASH-CONSENSUS-MEMBER-REMOVED', + name: 'πŸ”΄ HashConsensus: Member removed', + description: (args: ethers.Result) => + `Member ${etherscanAddress(args.addr)} (${knownMembers[args.addr] ?? 'unknown'}) removed\n` + + `Total members: ${args.newTotalMembers}\n` + + `New quorum: ${args.newQuorum}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('QuorumSet').format('full'), + alertId: 'HASH-CONSENSUS-QUORUM-SET', + name: 'πŸ”΄ HashConsensus: Quorum set', + description: (args: ethers.Result) => + `Quorum set to ${args.newQuorum}.\n` + + `Total members: ${args.totalMembers}\n` + + `Previous quorum: ${args.prevQuorum}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('FastLaneConfigSet').format('full'), + alertId: 'HASH-CONSENSUS-FASTLANE-CONFIG-SET', + name: 'πŸ”΄ HashConsensus: Fastlane config set', + description: (args: ethers.Result) => `Fastlane configuration set with length slots: ${args.fastLaneLengthSlots}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('FrameConfigSet').format('full'), + alertId: 'HASH-CONSENSUS-FRAME-CONFIG-SET', + name: 'πŸ”΄ HashConsensus: Frame config set', + description: (args: ethers.Result) => + `Frame configuration set.\n` + + `New initial epoch: ${args.newInitialEpoch}\n` + + `Epochs per frame: ${args.newEpochsPerFrame}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('ReportProcessorSet').format('full'), + alertId: 'HASH-CONSENSUS-REPORT-PROCESSOR-SET', + name: 'πŸ”΄ HashConsensus: Report processor set', + description: (args: ethers.Result) => + `Current processor: ${etherscanAddress(args.processor)}\nPrevious processor: ${etherscanAddress(args.prevProcessor)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('ConsensusLost').format('full'), + alertId: 'HASH-CONSENSUS-LOST', + name: 'πŸ”΄ HashConsensus: Consensus lost', + description: (args: ethers.Result) => `Consensus lost for slot ${args.refSlot}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('ConsensusReached').format('full'), + alertId: 'HASH-CONSENSUS-REACHED', + name: 'πŸ”΅ HashConsensus: Consensus reached, report received', + // prettier-ignore + description: (args: ethers.Result) => + `Consensus reached for slot ${args.refSlot}\n` + + `Report hash: ${args.report}\n` + + `Support: ${args.support}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + ] +} + +export function getCSFeeOracleEvents(address: string): EventOfNotice[] { + return [ + { + address, + abi: ICSFeeOracle.getEvent('ConsensusHashContractSet').format('full'), + alertId: 'CSFEE-ORACLE-CONSENSUS-HASH-CONTRACT-SET', + name: '🚨 CSFeeOracle: Consensus hash contract set', + description: (args: ethers.Result) => + `Consensus hash contract set to ${etherscanAddress(args.addr)}, previous contract was ${etherscanAddress(args.prevAddr)}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('PerfLeewaySet').format('full'), + alertId: 'CSFEE-ORACLE-PERF-LEEWAY-SET', + name: 'πŸ”΄ CSFeeOracle: Performance leeway updated', + description: (args: ethers.Result) => `Performance leeway set to ${args.valueBP} basis points`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('FeeDistributorContractSet').format('full'), + alertId: 'CSFEE-ORACLE-FEE-DISTRIBUTOR-CONTRACT-SET', + name: 'πŸ”΄ CSFeeOracle: New CSFeeDistributor set', + description: (args: ethers.Result) => + `New CSFeeDistributor contract set to ${etherscanAddress(args.feeDistributorContract)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('ConsensusVersionSet').format('full'), + alertId: 'CSFEE-ORACLE-CONSENSUS-VERSION-SET', + name: 'πŸ”΄ CSFeeOracle: Consensus version set', + description: (args: ethers.Result) => + `Consensus version set to ${args.version}, previous version was ${args.prevVersion}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('WarnProcessingMissed').format('full'), + alertId: 'CSFEE-ORACLE-PROCESSING-MISSED', + name: 'πŸ”΅ CSFeeOracle: Processing missed', + description: (args: ethers.Result) => `Processing missed for slot ${args.refSlot}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('ReportSubmitted').format('full'), + alertId: 'CSFEE-ORACLE-REPORT-SUBMITTED', + name: 'πŸ”΅ CSFeeOracle: Report submitted', + description: (args: ethers.Result) => + `Report submitted for slot ${args.refSlot}\n` + + `Report hash: ${args.hash}\n` + + `Processing deadline time: ${args.processingDeadlineTime}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('ProcessingStarted').format('full'), + alertId: 'CSFEE-ORACLE-PROCESSING-STARTED', + name: 'πŸ”΅ CSFeeOracle: Processing started', + description: (args: ethers.Result) => `Processing started for slot ${args.refSlot}\nReport hash: ${args.hash}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + ] +} diff --git a/csm-alerts/src/services/EventsWatcher/events/pausable.ts b/csm-alerts/src/services/EventsWatcher/events/pausable.ts new file mode 100644 index 000000000..1503a88e0 --- /dev/null +++ b/csm-alerts/src/services/EventsWatcher/events/pausable.ts @@ -0,0 +1,34 @@ +import { Result } from '@ethersproject/abi/lib' +import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' + +import { PausableUntil__factory } from '../../../generated/typechain' +import { EventOfNotice } from '../../../shared/types' +import { toKebabCase } from '../../../utils/string' +import { formatDelay } from '../../../utils/time' + +const IPausableUntil = PausableUntil__factory.createInterface() + +export function getPausableEvents(contracts: { name: string; address: string }[]): EventOfNotice[] { + return contracts.flatMap((contract) => { + return [ + { + address: contract.address, + abi: IPausableUntil.getEvent('Paused').format('full'), + alertId: `${toKebabCase(contract.name)}-PAUSED`, + name: `🚨 ${contract.name}: contract was paused`, + description: (args: Result) => `Contract paused for ${formatDelay(args.duration)}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IPausableUntil.getEvent('Resumed').format('full'), + alertId: `${toKebabCase(contract.name)}-RESUMED`, + name: `🚨 ${contract.name}: contract was resumed`, + description: () => `Contract ${contract.address} was resumed`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + ] + }) +} diff --git a/csm-alerts/src/services/EventsWatcher/events/proxies.ts b/csm-alerts/src/services/EventsWatcher/events/proxies.ts new file mode 100644 index 000000000..c2391abb7 --- /dev/null +++ b/csm-alerts/src/services/EventsWatcher/events/proxies.ts @@ -0,0 +1,42 @@ +import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' + +import { OssifiableProxy__factory } from '../../../generated/typechain' +import { EventOfNotice } from '../../../shared/types' +import { etherscanAddress } from '../../../utils/string' + +const IOssifiableProxy = OssifiableProxy__factory.createInterface() + +export function getOssifiedProxyEvents(contracts: { address: string; name: string }[]): EventOfNotice[] { + return contracts.flatMap((contract) => { + return [ + { + address: contract.address, + abi: IOssifiableProxy.getEvent('ProxyOssified').format('full'), + alertId: 'PROXY-OSSIFIED', + name: `🚨 ${contract.name}: Proxy Ossified`, + description: () => `Proxy for ${contract.name}(${etherscanAddress(contract.address)}) was ossified`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IOssifiableProxy.getEvent('Upgraded').format('full'), + alertId: 'PROXY-UPGRADED', + name: `🚨 ${contract.name}: Implementation Upgraded`, + description: (args: ethers.Result) => `The proxy implementation has been upgraded to ${args.implementation}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IOssifiableProxy.getEvent('AdminChanged').format('full'), + alertId: 'PROXY-ADMIN-CHANGED', + name: `🚨 ${contract.name}: Admin Changed`, + description: (args: ethers.Result) => + `The proxy admin for ${contract.name}(${contract.address}) has been changed from ${etherscanAddress(args.previousAdmin)} to ${etherscanAddress(args.newAdmin)}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + ] + }) +} diff --git a/csm-alerts/src/services/EventsWatcher/events/roles.ts b/csm-alerts/src/services/EventsWatcher/events/roles.ts new file mode 100644 index 000000000..6e7149cd1 --- /dev/null +++ b/csm-alerts/src/services/EventsWatcher/events/roles.ts @@ -0,0 +1,32 @@ +import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' + +import { RolesMapping } from '../../../shared/roles' +import { EventOfNotice } from '../../../shared/types' +import { etherscanAddress } from '../../../utils/string' + +export function getRolesMonitoringEvents(contracts: { name: string; address: string }[]): EventOfNotice[] { + return contracts.flatMap((contract) => { + return [ + { + address: contract.address, + abi: 'event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)', + alertId: `ROLE-GRANTED`, + name: `🚨 ${contract.name}: Role granted`, + description: (args: ethers.Result) => + `Role ${args.role} (${RolesMapping[args.role] ?? 'unknown'}) was granted to ${etherscanAddress(args.account)} on ${etherscanAddress(contract.address)}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: contract.address, + abi: 'event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)', + alertId: `ROLE-REVOKED`, + name: `🚨 ${contract.name}: Role revoked`, + description: (args: ethers.Result) => + `Role ${args.role} (${RolesMapping[args.role] ?? 'unknown'}) was revoked from ${etherscanAddress(args.account)} on ${etherscanAddress(contract.address)}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + ] + }) +} diff --git a/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.ts b/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.ts deleted file mode 100644 index 083b8822f..000000000 --- a/csm-alerts/src/services/ProxyWatcher/ProxyWatcher.srv.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { elapsedTime } from '../../utils/time' -import { either as E } from 'fp-ts' -import { Logger } from 'winston' -import { BlockDto, EventOfNotice, TransactionDto, handleEventsOfNotice } from '../../entity/events' -import { Finding } from '../../generated/proto/alert_pb' - -export abstract class IProxyWatcherClient { - public abstract getBlockByNumber(blockNumber: number): Promise> -} - -export class ProxyWatcherSrv { - private readonly name = 'ProxyWatcherSrv' - private readonly logger: Logger - private readonly proxyWatcherClient: IProxyWatcherClient - - private readonly ossifiedProxyEvents: EventOfNotice[] - private readonly pausableEvents: EventOfNotice[] - private readonly assetRecovererEvents: EventOfNotice[] - private readonly rolesMonitoringEvents: EventOfNotice[] - - constructor( - logger: Logger, - ethProvider: IProxyWatcherClient, - ossifiedProxyEvents: EventOfNotice[], - pausableEvents: EventOfNotice[], - assetRecovererEvents: EventOfNotice[], - rolesMonitoringEvents: EventOfNotice[], - ) { - this.logger = logger - this.proxyWatcherClient = ethProvider - - this.ossifiedProxyEvents = ossifiedProxyEvents - this.pausableEvents = pausableEvents - this.assetRecovererEvents = assetRecovererEvents - this.rolesMonitoringEvents = rolesMonitoringEvents - } - - public async initialize(currentBlock: number): Promise { - const start = new Date().getTime() - - const currBlock = await this.proxyWatcherClient.getBlockByNumber(currentBlock) - if (E.isLeft(currBlock)) { - this.logger.error(elapsedTime(`Failed [${this.name}.initialize]`, start)) - return currBlock.left - } - this.logger.info(elapsedTime(`[${this.name}.initialize]`, start)) - return null - } - - async handleBlock(blockDto: BlockDto): Promise { - const start = new Date().getTime() - const findings: Finding[] = [] - - this.logger.info(`${blockDto.number}`) - this.logger.info(elapsedTime(ProxyWatcherSrv.name + '.' + this.handleBlock.name, start)) - - return findings - } - - public getName(): string { - return this.name - } - - public handleTransaction(txEvent: TransactionDto): Finding[] { - const out: Finding[] = [] - - const ossifiedProxyFindings = handleEventsOfNotice(txEvent, this.ossifiedProxyEvents) - const pausableEventsFindings = handleEventsOfNotice(txEvent, this.pausableEvents) - const assetRecovererFindings = handleEventsOfNotice(txEvent, this.assetRecovererEvents) - const rolesMonitoringFindings = handleEventsOfNotice(txEvent, this.rolesMonitoringEvents) - - out.push(...ossifiedProxyFindings, ...pausableEventsFindings, ...assetRecovererFindings, ...rolesMonitoringFindings) - - return out - } -} diff --git a/csm-alerts/src/services/constants.holesky.ts b/csm-alerts/src/services/constants.holesky.ts new file mode 100644 index 000000000..2b1e1b1b5 --- /dev/null +++ b/csm-alerts/src/services/constants.holesky.ts @@ -0,0 +1,28 @@ +import { DeployedAddresses } from '../shared/types' + +export const DEPLOYED_ADDRESSES: DeployedAddresses = { + CS_MODULE: '0x4562c3e63c2e586cD1651B958C22F88135aCAd4f', + CS_ACCOUNTING: '0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1', + CS_FEE_DISTRIBUTOR: '0xD7ba648C8F72669C6aE649648B516ec03D07c8ED', + CS_FEE_ORACLE: '0xaF57326C7d513085051b50912D51809ECC5d98Ee', + CS_VERIFIER: '0x6DcA479178E6Ae41CCEB72a88FfDaa3e10E83CB7', + CS_EARLY_ADOPTION: '0x71E92eA77C198a770d9f33A03277DbeB99989660', + CS_GATE_SEAL: '0x41F2677fae0222cF1f08Cd1c0AAa607B469654Ce', + LIDO_STETH: '0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034', + BURNER: '0x4E46BD7147ccf666E1d73A3A456fC7a68de82eCA', + HASH_CONSENSUS: '0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37', + STAKING_ROUTER: '0xd6EbF043D30A7fe46D1Db32BA90a0A51207FE229', +} + +export const ORACLE_MEMBERS: { [key: string]: string } = { + '0xF0F23944EfC5A63c53632C571E7377b85d5E6B6f': 'Chorus One', + '0xb29dD2f6672C0DFF2d2f173087739A42877A5172': 'Staking Facilities', + '0xD3b1e36A372Ca250eefF61f90E833Ca070559970': 'Stakefish', + '0x31fa51343297FFce0CC1E67a50B2D3428057D1b1': 'P2P', + '0xf7aE520e99ed3C41180B5E12681d31Aa7302E4e5': 'Chainlayer', + '0x4c75FA734a39f3a21C57e583c1c29942F021C6B7': 'bloXroute', + '0x81E411f1BFDa43493D7994F82fb61A415F6b8Fd4': 'Instadapp', + '0xfe43A8B0b481Ae9fB1862d31826532047d2d538c': 'MatrixedLink', + '0x12A1D74F8697b9f4F1eEBb0a9d0FB6a751366399': 'Lido', + '0xD892c09b556b547c80B7d8c8cB8d75bf541B2284': 'Lido', +} diff --git a/csm-alerts/src/services/constants.ts b/csm-alerts/src/services/constants.ts new file mode 100644 index 000000000..c76ab86b7 --- /dev/null +++ b/csm-alerts/src/services/constants.ts @@ -0,0 +1,41 @@ +import { DeployedAddresses } from '../shared/types' + +export const DEPLOYED_ADDRESSES: DeployedAddresses = { + CS_MODULE: '0x0000000000000000000000000000000000000000', + CS_ACCOUNTING: '0x0000000000000000000000000000000000000000', + CS_FEE_DISTRIBUTOR: '0x0000000000000000000000000000000000000000', + CS_FEE_ORACLE: '0x0000000000000000000000000000000000000000', + CS_VERIFIER: '0x0000000000000000000000000000000000000000', + CS_EARLY_ADOPTION: '0x0000000000000000000000000000000000000000', + CS_GATE_SEAL: '0x0000000000000000000000000000000000000000', + LIDO_STETH: '0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034', + BURNER: '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84 ', + HASH_CONSENSUS: '0x0000000000000000000000000000000000000000', + STAKING_ROUTER: '0x0000000000000000000000000000000000000000', +} + +export const ALIASES: Record = { + CS_MODULE: 'CSM', + CS_ACCOUNTING: 'CSAccounting', + CS_FEE_DISTRIBUTOR: 'CSFeeDistributor', + CS_FEE_ORACLE: 'CSFeeOracle', + CS_VERIFIER: 'CSAccounting', + CS_EARLY_ADOPTION: 'CSEarlyAdoption', + CS_GATE_SEAL: 'CSM Gate Seal', + LIDO_STETH: 'Lido', + BURNER: 'Burner', + HASH_CONSENSUS: 'CSM HashConsensus', + STAKING_ROUTER: 'StakingRouter', +} + +export const ORACLE_MEMBERS: { [key: string]: string } = { + '0x140Bd8FbDc884f48dA7cb1c09bE8A2fAdfea776E': 'Chorus One', + '0x404335BcE530400a5814375E7Ec1FB55fAff3eA2': 'Staking Facilities', + '0x946D3b081ed19173dC83Cd974fC69e1e760B7d78': 'Stakefish', + '0x007DE4a5F7bc37E2F26c0cb2E8A95006EE9B89b5': 'P2P', + '0xc79F702202E3A6B0B6310B537E786B9ACAA19BAf': 'Chainlayer', + '0x61c91ECd902EB56e314bB2D5c5C07785444Ea1c8': 'bloXroute', + '0x1Ca0fEC59b86F549e1F1184d97cb47794C8Af58d': 'Instadapp', + '0xe57B3792aDCc5da47EF4fF588883F0ee0c9835C9': 'MatrixedLink', + '0xA7410857ABbf75043d61ea54e07D57A6EB6EF186': 'Kyber Network', +} diff --git a/csm-alerts/src/services/health-checker/health-checker.srv.spec.ts b/csm-alerts/src/services/health-checker/health-checker.srv.spec.ts deleted file mode 100644 index 977b86c2c..000000000 --- a/csm-alerts/src/services/health-checker/health-checker.srv.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { networkAlert } from '../../utils/errors' -import { HealthChecker } from './health-checker.srv' -import promClient from 'prom-client' -import * as Winston from 'winston' -import { Metrics } from '../../utils/metrics/metrics' - -function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)) -} - -describe('HealthChecker', () => { - const networkFindings = [networkAlert(new Error('Some err'), 'err name', 'err desc')] - const borderTime = 1_000 - const timeForNextCheck = 250 - - const registry = new promClient.Registry() - const m = new Metrics(registry, 'test_') - const logger: Winston.Logger = Winston.createLogger({ - format: Winston.format.simple(), - transports: [new Winston.transports.Console()], - }) - - test('should become healthy', async () => { - const maxCountErrors = 6 - const healthChecker = new HealthChecker(logger, m, borderTime, maxCountErrors) - - // 0 250 500 750 1000 1250 1500 1750 2000 2250 - // | <- found 5 errors on 1000-th millisecond - // | found 5 < maxCountErrors = 6 => app is healthy - // 1 2 3 4 [5] 6 7 8 9 10 - for (let i = 1; i <= 10; i++) { - await sleep(timeForNextCheck) - healthChecker.check(networkFindings) - } - - expect(healthChecker.isHealth()).toBe(true) - }) - - test('should become unhealthy', async () => { - const maxCountErrors = 5 - const healthChecker = new HealthChecker(logger, m, borderTime, maxCountErrors) - - // 0 250 500 750 1000 1250 1500 1750 2000 2250 - // | <- found 5 errors on 1000-th millisecond - // | found 5 === maxCountErrors = 5 => app is unhealthy - // 1 2 3 4 [5] 6 7 8 9 10 - for (let i = 1; i <= 10; i++) { - await sleep(timeForNextCheck) - healthChecker.check(networkFindings) - } - - expect(healthChecker.isHealth()).toBe(false) - }) - - test('should become unhealthy', async () => { - const maxCountErrors = 3 - const healthChecker = new HealthChecker(logger, m, borderTime, maxCountErrors) - - // Found per once 3 errors -> app is unhealthy - const findings3 = [ - networkAlert(new Error('Some err'), 'err name', 'err desc'), - networkAlert(new Error('Some err'), 'err name', 'err desc'), - networkAlert(new Error('Some err'), 'err name', 'err desc'), - ] - healthChecker.check(findings3) - - expect(healthChecker.isHealth()).toBe(false) - }) -}) diff --git a/csm-alerts/src/services/health-checker/health-checker.srv.ts b/csm-alerts/src/services/health-checker/health-checker.srv.ts deleted file mode 100644 index 5f07ca97a..000000000 --- a/csm-alerts/src/services/health-checker/health-checker.srv.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { NetworkErrorFinding } from '../../utils/errors' -import { Finding } from '../../generated/proto/alert_pb' -import { Logger } from 'winston' -import { Metrics } from '../../utils/metrics/metrics' - -export const BorderTime = 15 * 60 * 1000 // 15 minutes -export const MaxNumberErrorsPerBorderTime = 25 - -export class HealthChecker { - private errorCount: number - private isAppOk: boolean - private readonly borderTime: number - private readonly maxCountErrors: number - - private errorStartedAt: number | null - private logger: Logger - private metrics: Metrics - - constructor(logger: Logger, metrics: Metrics, borderTime: number, maxCountErrors: number) { - this.logger = logger - this.metrics = metrics - - this.errorCount = 0 - this.errorStartedAt = null - this.isAppOk = true - this.borderTime = borderTime - this.maxCountErrors = maxCountErrors - } - - public check(findings: Finding[]): number { - const currentTime = Date.now() - - let errCount: number = 0 - for (const f of findings) { - if (f.getAlertid() === NetworkErrorFinding) { - this.logger.warn(f.getName(), { - desc: f.getDescription(), - err: { - stack: f.getMetadataMap()['stack'], - msg: f.getMetadataMap()['message'], - err: f.getMetadataMap()['name'], - }, - }) - errCount += 1 - - this.metrics.networkErrors.inc() - } - } - - // if for one iteration we have more than maxCountErrors - // then app is unhealthy - if (errCount >= this.maxCountErrors) { - this.isAppOk = false - return errCount - } - - if (this.errorStartedAt === null && errCount > 0) { - this.errorStartedAt = currentTime - } - - this.errorCount += errCount - - if (this.errorStartedAt !== null && currentTime - this.errorStartedAt >= this.borderTime) { - if (this.errorCount >= this.maxCountErrors) { - this.isAppOk = false - } else { - this.errorCount = 0 - this.errorStartedAt = null - } - } - - return errCount - } - - public isHealth(): boolean { - return this.isAppOk - } -} diff --git a/csm-alerts/src/shared/constants.ts b/csm-alerts/src/shared/constants.ts new file mode 100644 index 000000000..87777821d --- /dev/null +++ b/csm-alerts/src/shared/constants.ts @@ -0,0 +1,11 @@ +export const SHARES_PRECISION = 10n ** 18n +export const WEI_PER_ETH = 10n ** 18n + +export const SECONDS_PER_SLOT = 12 +export const SECONDS_PER_HOUR = 60 * 60 +export const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR +export const SECONDS_PER_WEEK = 7 * SECONDS_PER_DAY + +export const SLOTS_PER_EPOCH = 32 + +export const BASIS_POINT_MUL = 10_000n diff --git a/csm-alerts/src/shared/roles.ts b/csm-alerts/src/shared/roles.ts new file mode 100644 index 000000000..daad2963b --- /dev/null +++ b/csm-alerts/src/shared/roles.ts @@ -0,0 +1,26 @@ +import { ethers, keccak256 } from '@fortanetwork/forta-bot' + +export const RolesMapping = { + [ethers.ZeroHash]: 'DEFAULT ADMIN', + [keccak256('PAUSE_ROLE')]: 'PAUSE', + [keccak256('RESUME_ROLE')]: 'RESUME', + [keccak256('MODULE_MANAGER_ROLE')]: 'MODULE MANAGER', + [keccak256('STAKING_ROUTER_ROLE')]: 'STAKING ROUTER', + [keccak256('REPORT_EL_REWARDS_STEALING_PENALTY_ROLE')]: 'REPORT EL REWARDS STEALING PENALTY', + [keccak256('SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE')]: 'SETTLE EL REWARDS STEALING PENALTY', + [keccak256('VERIFIER_ROLE')]: 'VERIFIER', + [keccak256('RECOVERER_ROLE')]: 'RECOVERER', + [keccak256('ACCOUNTING_MANAGER_ROLE')]: 'ACCOUNTING MANAGER', + [keccak256('MANAGE_BOND_CURVES_ROLE')]: 'MANAGE BOND CURVES', + [keccak256('SET_BOND_CURVE_ROLE')]: 'SET BOND CURVE', + [keccak256('RESET_BOND_CURVE_ROLE')]: 'RESET BOND CURVE', + [keccak256('CONTRACT_MANAGER_ROLE')]: 'CONTRACT MANAGER', + [keccak256('SUBMIT_DATA_ROLE')]: 'SUBMIT DATA', + [keccak256('DISABLE_CONSENSUS_ROLE')]: 'DISABLE CONSENSUS', + [keccak256('MANAGE_MEMBERS_AND_QUORUM_ROLE')]: 'MANAGE MEMBERS AND QUORUM', + [keccak256('MANAGE_FRAME_CONFIG_ROLE')]: 'MANAGE FRAME CONFIG', + [keccak256('MANAGE_FAST_LANE_CONFIG_ROLE')]: 'MANAGE FAST LANE CONFIG', + [keccak256('MANAGE_REPORT_PROCESSOR_ROLE')]: 'MANAGE REPORT PROCESSOR', + [keccak256('MANAGE_CONSENSUS_CONTRACT_ROLE')]: 'MANAGE CONSENSUS CONTRACT', + [keccak256('MANAGE_CONSENSUS_VERSION_ROLE')]: 'MANAGE CONSENSUS VERSION', +} diff --git a/csm-alerts/src/shared/types.ts b/csm-alerts/src/shared/types.ts new file mode 100644 index 000000000..705d0b176 --- /dev/null +++ b/csm-alerts/src/shared/types.ts @@ -0,0 +1,25 @@ +import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' + +export type EventOfNotice = { + name: string + address: string + abi: string | string[] + alertId: string + description: CallableFunction + severity: FindingSeverity + type: FindingType +} + +export type DeployedAddresses = { + CS_MODULE: string + CS_ACCOUNTING: string + CS_FEE_DISTRIBUTOR: string + CS_FEE_ORACLE: string + CS_VERIFIER: string + CS_EARLY_ADOPTION: string + CS_GATE_SEAL: string + LIDO_STETH: string + BURNER: string + HASH_CONSENSUS: string + STAKING_ROUTER: string +} diff --git a/csm-alerts/src/utils/constants.holesky.ts b/csm-alerts/src/utils/constants.holesky.ts deleted file mode 100644 index 38511c639..000000000 --- a/csm-alerts/src/utils/constants.holesky.ts +++ /dev/null @@ -1,207 +0,0 @@ -// HOLESKY COMMON ADDRESSES - -export type DeploymentAddress = { - CS_MODULE_ADDRESS: string - CS_ACCOUNTING_ADDRESS: string - CS_FEE_DISTRIBUTOR_ADDRESS: string - CS_FEE_ORACLE_ADDRESS: string - CS_VERIFIER_ADDRESS: string - CS_EARLY_ADOPTION_ADDRESS: string - CSM_GATE_SEAL_ADDRESS: string - LIDO_STETH_ADDRESS: string - BURNER_ADDRESS: string - HASH_CONSENSUS_ADDRESS: string - STAKING_ROUTER_ADDRESS: string - RolesMap: Map -} - -const DEFAULT_ADMIN_ROLE_HASH: string = '0x0000000000000000000000000000000000000000000000000000000000000000' -const PAUSE_ROLE_HASH: string = '0x139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d' -const RESUME_ROLE_HASH: string = '0x2fc10cc8ae19568712f7a176fb4978616a610650813c9d05326c34abb62749c7' -const STAKING_ROUTER_ROLE_HASH: string = '0xbb75b874360e0bfd87f964eadd8276d8efb7c942134fc329b513032d0803e0c6' -const MODULE_MANAGER_ROLE_HASH: string = '0x79dfcec784e591aafcf60db7db7b029a5c8b12aac4afd4e8c4eb740430405fa6' -const REPORT_EL_REWARDS_STEALING_PENALTY_ROLE_HASH: string = - '0x59911a6aa08a72fe3824aec4500dc42335c6d0702b6d5c5c72ceb265a0de9302' -const SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE_HASH: string = - '0xe85fdec10fe0f93d0792364051df7c3d73e37c17b3a954bffe593960e3cd3012' -const VERIFIER_ROLE_HASH: string = '0x0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea09' -const RECOVERER_ROLE_HASH: string = '0xb3e25b5404b87e5a838579cb5d7481d61ad96ee284d38ec1e97c07ba64e7f6fc' -const ACCOUNTING_MANAGER_ROLE_HASH: string = '0x40579467dba486691cc62fd8536d22c6d4dc9cdc7bc716ef2518422aa554c098' -const MANAGE_BOND_CURVES_ROLE_HASH: string = '0xd35e4a788498271198ec69c34f1dc762a1eee8200c111f598da1b3dde946783d' -const SET_BOND_CURVE_ROLE_HASH: string = '0x645c9e6d2a86805cb5a28b1e4751c0dab493df7cf935070ce405489ba1a7bf72' -const RESET_BOND_CURVE_ROLE_HASH: string = '0xb5dffea014b759c493d63b1edaceb942631d6468998125e1b4fe427c99082134' -const CONTRACT_MANAGER_ROLE_HASH: string = '0x8135f02737a6b32709c1f229001b55183df0d6abcb3022e8bae091ad43fd9e6d' -const SUBMIT_DATA_ROLE_HASH: string = '0x65fa0c17458517c727737e4153dd477fa3e328cf706640b0f68b1a285c5990da' - -export const DeploymentAddresses: DeploymentAddress = { - CS_MODULE_ADDRESS: '0x4562c3e63c2e586cD1651B958C22F88135aCAd4f', - CS_ACCOUNTING_ADDRESS: '0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1', - CS_FEE_DISTRIBUTOR_ADDRESS: '0xD7ba648C8F72669C6aE649648B516ec03D07c8ED', - CS_FEE_ORACLE_ADDRESS: '0xaF57326C7d513085051b50912D51809ECC5d98Ee', - CS_VERIFIER_ADDRESS: '0x6DcA479178E6Ae41CCEB72a88FfDaa3e10E83CB7', - CS_EARLY_ADOPTION_ADDRESS: '0x71E92eA77C198a770d9f33A03277DbeB99989660', - CSM_GATE_SEAL_ADDRESS: '0x41F2677fae0222cF1f08Cd1c0AAa607B469654Ce', - LIDO_STETH_ADDRESS: '0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034', - BURNER_ADDRESS: '0x4E46BD7147ccf666E1d73A3A456fC7a68de82eCA', - HASH_CONSENSUS_ADDRESS: '0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37', - STAKING_ROUTER_ADDRESS: '0xd6EbF043D30A7fe46D1Db32BA90a0A51207FE229', - RolesMap: new Map([ - [DEFAULT_ADMIN_ROLE_HASH, 'DEFAULT ADMIN ROLE'], - [PAUSE_ROLE_HASH, 'PAUSE ROLE'], - [RESUME_ROLE_HASH, 'RESUME ROLE'], - [MODULE_MANAGER_ROLE_HASH, 'MODULE MANAGER ROLE'], - [STAKING_ROUTER_ROLE_HASH, 'STAKING ROUTER ROLE'], - [REPORT_EL_REWARDS_STEALING_PENALTY_ROLE_HASH, 'REPORT EL REWARDS STEALING PENALTY ROLE'], - [SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE_HASH, 'SETTLE EL REWARDS STEALING PENALTY ROLE'], - [VERIFIER_ROLE_HASH, 'VERIFIER ROLE'], - [RECOVERER_ROLE_HASH, 'RECOVERER ROLE'], - [ACCOUNTING_MANAGER_ROLE_HASH, 'ACCOUNTING MANAGER ROLE'], - [MANAGE_BOND_CURVES_ROLE_HASH, 'MANAGE BOND CURVES ROLE'], - [SET_BOND_CURVE_ROLE_HASH, 'SET BOND CURVE ROLE'], - [RESET_BOND_CURVE_ROLE_HASH, 'RESET BOND CURVE ROLE'], - [CONTRACT_MANAGER_ROLE_HASH, 'CONTRACT MANAGER ROLE'], - [SUBMIT_DATA_ROLE_HASH, 'SUBMIT DATA ROLE'], - ]), -} -export interface Proxy { - name: string - address: string - functions: Map -} - -export interface ContractWithAssetRecoverer { - name: string - address: string - functions: Map -} - -export interface PausableContract { - name: string - address: string - functions: Map -} - -export interface RolesMonitoringContract { - name: string - address: string -} - -export const CSM_PROXY_CONTRACTS: Proxy[] = [ - { - name: 'CSModule', - address: DeploymentAddresses.CS_MODULE_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSAccounting', - address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSFeeDistributor', - address: DeploymentAddresses.CS_FEE_DISTRIBUTOR_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSFeeOracle', - address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, -] - -export const CONTRACTS_WITH_ASSET_RECOVERER: ContractWithAssetRecoverer[] = [ - { - name: 'CSModule', - address: DeploymentAddresses.CS_MODULE_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSAccounting', - address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSFeeDistributor', - address: DeploymentAddresses.CS_FEE_DISTRIBUTOR_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSFeeOracle', - address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, -] - -export const PAUSABLE_CONTRACTS: PausableContract[] = [ - { - name: 'CSModule', - address: DeploymentAddresses.CS_MODULE_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSAccounting', - address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSFeeOracle', - address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, -] - -export const ROLES_MONITORING_CONTRACTS: RolesMonitoringContract[] = [ - { - name: 'CSModule', - address: DeploymentAddresses.CS_MODULE_ADDRESS, - }, - { - name: 'CSAccounting', - address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, - }, - { - name: 'CSFeeDistributor', - address: DeploymentAddresses.CS_FEE_DISTRIBUTOR_ADDRESS, - }, - { - name: 'CSFeeOracle', - address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, - }, - { - name: 'HashConsensus', - address: DeploymentAddresses.HASH_CONSENSUS_ADDRESS, - }, -] diff --git a/csm-alerts/src/utils/constants.mainnet.ts b/csm-alerts/src/utils/constants.mainnet.ts deleted file mode 100644 index 179e2e1c0..000000000 --- a/csm-alerts/src/utils/constants.mainnet.ts +++ /dev/null @@ -1,207 +0,0 @@ -// ETHEREUM COMMON ADDRESSES - -export type DeploymentAddress = { - CS_MODULE_ADDRESS: string - CS_ACCOUNTING_ADDRESS: string - CS_FEE_DISTRIBUTOR_ADDRESS: string - CS_FEE_ORACLE_ADDRESS: string - CS_VERIFIER_ADDRESS: string - CS_EARLY_ADOPTION_ADDRESS: string - CSM_GATE_SEAL_ADDRESS: string - LIDO_STETH_ADDRESS: string - BURNER_ADDRESS: string - ACCOUNTING_HASH_CONSENSUS_ADDRESS: string - HASH_CONSENSUS_ADDRESS: string - STAKING_ROUTER_ADDRESS: string - RolesMap: Map -} - -const DEFAULT_ADMIN_ROLE_HASH: string = '' -const PAUSE_ROLE_HASH: string = '' -const RESUME_ROLE_HASH: string = '' -const STAKING_ROUTER_ROLE_HASH: string = '' -const MODULE_MANAGER_ROLE_HASH: string = '' -const REPORT_EL_REWARDS_STEALING_PENALTY_ROLE_HASH: string = '' -const SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE_HASH: string = '' -const VERIFIER_ROLE_HASH: string = '' -const RECOVERER_ROLE_HASH: string = '' -const ACCOUNTING_MANAGER_ROLE_HASH: string = '' -const MANAGE_BOND_CURVES_ROLE_HASH: string = '' -const SET_BOND_CURVE_ROLE_HASH: string = '' -const RESET_BOND_CURVE_ROLE_HASH: string = '' -const CONTRACT_MANAGER_ROLE_HASH: string = '' -const SUBMIT_DATA_ROLE_HASH: string = '' - -export const DeploymentAddresses: DeploymentAddress = { - CS_MODULE_ADDRESS: '', - CS_ACCOUNTING_ADDRESS: '', - CS_FEE_DISTRIBUTOR_ADDRESS: '', - CS_FEE_ORACLE_ADDRESS: '', - CS_VERIFIER_ADDRESS: '', - CS_EARLY_ADOPTION_ADDRESS: '', - CSM_GATE_SEAL_ADDRESS: '', - LIDO_STETH_ADDRESS: '', - BURNER_ADDRESS: '', - ACCOUNTING_HASH_CONSENSUS_ADDRESS: '', - HASH_CONSENSUS_ADDRESS: '', - STAKING_ROUTER_ADDRESS: '', - RolesMap: new Map([ - [DEFAULT_ADMIN_ROLE_HASH, 'DEFAULT ADMIN ROLE'], - [PAUSE_ROLE_HASH, 'PAUSE ROLE'], - [RESUME_ROLE_HASH, 'RESUME ROLE'], - [MODULE_MANAGER_ROLE_HASH, 'MODULE MANAGER ROLE'], - [STAKING_ROUTER_ROLE_HASH, 'STAKING ROUTER ROLE'], - [REPORT_EL_REWARDS_STEALING_PENALTY_ROLE_HASH, 'REPORT EL REWARDS STEALING PENALTY ROLE'], - [SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE_HASH, 'SETTLE EL REWARDS STEALING PENALTY ROLE'], - [VERIFIER_ROLE_HASH, 'VERIFIER ROLE'], - [RECOVERER_ROLE_HASH, 'RECOVERER ROLE'], - [ACCOUNTING_MANAGER_ROLE_HASH, 'ACCOUNTING MANAGER ROLE'], - [MANAGE_BOND_CURVES_ROLE_HASH, 'MANAGE BOND CURVES ROLE'], - [SET_BOND_CURVE_ROLE_HASH, 'SET BOND CURVE ROLE'], - [RESET_BOND_CURVE_ROLE_HASH, 'RESET BOND CURVE ROLE'], - [CONTRACT_MANAGER_ROLE_HASH, 'CONTRACT MANAGER ROLE'], - [SUBMIT_DATA_ROLE_HASH, 'SUBMIT DATA ROLE'], - ]), -} -export interface Proxy { - name: string - address: string - functions: Map -} - -export interface ContractWithAssetRecoverer { - name: string - address: string - functions: Map -} - -export interface PausableContract { - name: string - address: string - functions: Map -} - -export interface RolesMonitoringContract { - name: string - address: string -} - -export const CSM_PROXY_CONTRACTS: Proxy[] = [ - { - name: 'CSModule', - address: DeploymentAddresses.CS_MODULE_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSAccounting', - address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSFeeDistributor', - address: DeploymentAddresses.CS_FEE_DISTRIBUTOR_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSFeeOracle', - address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, -] - -export const CONTRACTS_WITH_ASSET_RECOVERER: ContractWithAssetRecoverer[] = [ - { - name: 'CSModule', - address: DeploymentAddresses.CS_MODULE_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSAccounting', - address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSFeeDistributor', - address: DeploymentAddresses.CS_FEE_DISTRIBUTOR_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSFeeOracle', - address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, -] - -export const PAUSABLE_CONTRACTS: PausableContract[] = [ - { - name: 'CSModule', - address: DeploymentAddresses.CS_MODULE_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSAccounting', - address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, - { - name: 'CSFeeOracle', - address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, - functions: new Map([ - ['admin', 'proxy__getAdmin'], - ['implementation', 'proxy__getImplementation'], - ]), - }, -] - -export const ROLES_MONITORING_CONTRACTS: RolesMonitoringContract[] = [ - { - name: 'CSModule', - address: DeploymentAddresses.CS_MODULE_ADDRESS, - }, - { - name: 'CSAccounting', - address: DeploymentAddresses.CS_ACCOUNTING_ADDRESS, - }, - { - name: 'CSFeeDistributor', - address: DeploymentAddresses.CS_FEE_DISTRIBUTOR_ADDRESS, - }, - { - name: 'CSFeeOracle', - address: DeploymentAddresses.CS_FEE_ORACLE_ADDRESS, - }, - { - name: 'HashConsensus', - address: DeploymentAddresses.HASH_CONSENSUS_ADDRESS, - }, -] diff --git a/csm-alerts/src/utils/constants.ts b/csm-alerts/src/utils/constants.ts deleted file mode 100644 index a4453b18a..000000000 --- a/csm-alerts/src/utils/constants.ts +++ /dev/null @@ -1,21 +0,0 @@ -import BigNumber from 'bignumber.js' - -export const ETH_DECIMALS = new BigNumber(10).pow(18) -export const SECONDS_PER_SLOT = 12 -export const ONE_HOUR = 60 * 60 -export const ONE_DAY = 24 * ONE_HOUR -export const ONE_WEEK = 7 * ONE_DAY -export const ONE_MONTH = ONE_WEEK * 4 - -// CSModule.srv thresholds -export const MAX_TARGET_SHARE_PERCENT_USED = 95 -export const MAX_EMPTY_BATCHES_IN_THE_QUEUE = 30 -export const MAX_VALIDATORS_IN_THE_QUEUE = 200 -export const MAX_OPERATORS_WITH_SAME_MANAGER_OR_REWARD_ADDRESS = 3 - -export const BASIS_POINTS_DIVIDER = 100 - -// CSAccountinf.srv thresholds -// ! example values, consider to change -export const AVERAGE_BOND_TRESHOLD = 1000 -export const UNBONDED_KEYS_TRESHOLD = 20 diff --git a/csm-alerts/src/utils/env/env.ts b/csm-alerts/src/utils/env/env.ts deleted file mode 100644 index 18a73c7b6..000000000 --- a/csm-alerts/src/utils/env/env.ts +++ /dev/null @@ -1,45 +0,0 @@ -import 'dotenv/config' - -export class Config { - public readonly appName: string - public readonly nodeEnv: string - public readonly instance: string - public readonly ethereumRpcUrl: string - public readonly dataProvider: string - - public readonly grpcPort: number - public readonly httpPort: number - public readonly logFormat: string - public readonly logLevel: string - - public readonly chainId: number - public readonly csModuleInitBlock: number - public readonly promPrefix: string - public readonly useFortaProvider: boolean - - constructor() { - this.appName = process.env.APP_NAME || 'csm-alerts' - this.nodeEnv = process.env.NODE_ENV || 'production' - this.instance = process.env.INSTANCE || 'forta' - - this.grpcPort = parseInt(process.env.AGENT_GRPC_PORT!, 10) || 50051 - this.httpPort = parseInt(process.env.HTTP_PORT!, 10) || 3000 - this.logFormat = process.env.LOG_FORMAT || 'simple' - this.logLevel = process.env.LOG_LEVEL || 'info' - - this.chainId = parseInt(process.env.FORTA_CHAIN_ID!, 10) || 17000 - this.csModuleInitBlock = 1774651 - this.ethereumRpcUrl = process.env.ETHEREUM_RPC_URL || 'https://holesky.drpc.org' - - this.promPrefix = this.appName.replace('-', '_') + '_' - this.useFortaProvider = process.env.USE_FORTA_RPC_URL === 'true' - - const urlRegex = /^(?:https?:\/\/)?(?:www\.)?([^/\n]+)/ - - this.dataProvider = '' - const match = this.ethereumRpcUrl.match(urlRegex) - if (match) { - this.dataProvider = match[1] - } - } -} diff --git a/csm-alerts/src/utils/epochs.ts b/csm-alerts/src/utils/epochs.ts new file mode 100644 index 000000000..93973828f --- /dev/null +++ b/csm-alerts/src/utils/epochs.ts @@ -0,0 +1,18 @@ +import { SECONDS_PER_SLOT, SLOTS_PER_EPOCH } from '../shared/constants' + +export function getEpoch(chainId: number, timestamp: number) { + let genesisTimestamp: number | undefined + + switch (chainId) { + case 1: + genesisTimestamp = 1606824023 + break + case 17_000: + genesisTimestamp = 1695902400 + break + default: + throw Error(`Unsupported chain ${chainId} to get genesis timestamp`) + } + + return Math.floor((timestamp - genesisTimestamp) / SECONDS_PER_SLOT / SLOTS_PER_EPOCH) +} diff --git a/csm-alerts/src/utils/errors.ts b/csm-alerts/src/utils/errors.ts deleted file mode 100644 index d374b1387..000000000 --- a/csm-alerts/src/utils/errors.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Finding } from '../generated/proto/alert_pb' - -export const NetworkErrorFinding = 'NETWORK-ERROR' - -export function networkAlert(err: Error, name: string, desc: string): Finding { - const f: Finding = new Finding() - f.setName(name) - f.setDescription(desc) - f.setAlertid(NetworkErrorFinding) - f.setSeverity(Finding.Severity.UNKNOWN) - f.setType(Finding.FindingType.DEGRADED) - f.setProtocol('ethereum') - - const m = f.getMetadataMap() - m.set('stack', `${err.stack}`) - m.set('message', `${err.message}`) - m.set('name', `${err.name}`) - - return f -} - -export function dbAlert(err: Error, name: string, desc: string): Finding { - const f: Finding = new Finding() - f.setName(name) - f.setDescription(desc) - f.setAlertid('DB-ERROR') - f.setSeverity(Finding.Severity.UNKNOWN) - f.setType(Finding.FindingType.DEGRADED) - f.setProtocol('ethereum') - - const m = f.getMetadataMap() - m.set('stack', `${err.stack}`) - m.set('message', `${err.message}`) - m.set('name', `${err.name}`) - - return f -} - -export class NetworkError extends Error { - constructor(e: unknown, name?: string) { - super() - - if (name !== undefined) { - this.name = name - } - - if (e instanceof Error) { - this.stack = e.stack - this.message = e.message - } else { - this.message = `${e}` - } - } -} diff --git a/csm-alerts/src/utils/events/asset_recoverer_events.ts b/csm-alerts/src/utils/events/asset_recoverer_events.ts deleted file mode 100644 index 45969ef4d..000000000 --- a/csm-alerts/src/utils/events/asset_recoverer_events.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { EventOfNotice } from '../../entity/events' -import { Result } from '@ethersproject/abi/lib' -import { etherscanAddress } from '../string' -import { Finding } from '../../generated/proto/alert_pb' - -interface ContractWithAssetRecoverer { - name: string - address: string - functions: Map -} - -export function getAssetRecovererEvents(CONTRACTS_WITH_ASSET_RECOVERER: ContractWithAssetRecoverer[]): EventOfNotice[] { - return CONTRACTS_WITH_ASSET_RECOVERER.flatMap((ContractWithAssetRecovererInfo: ContractWithAssetRecoverer) => { - return [ - { - address: ContractWithAssetRecovererInfo.address, - abi: 'event ERC20Recovered(address indexed token, address indexed recipient, uint256 amount)', - alertId: 'ASSET-RECOVERER-ERC20-RECOVERED', - name: 'πŸ”΄ AssetRecoverer: ERC20 recovered', - description: (args: Result) => - `ERC20 recovered on ${ContractWithAssetRecovererInfo.name}:\n` + - `Recipient: ${etherscanAddress(args.recipient)}\n` + - `Token: ${etherscanAddress(args.token)}\n` + - `Amount: ${args.amount}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: ContractWithAssetRecovererInfo.address, - abi: 'event ERC721Recovered(address indexed token, uint256 tokenId, address indexed recipient)', - alertId: 'ASSET-RECOVERER-ERC721-RECOVERED', - name: 'πŸ”΄ AssetRecoverer: ERC721 recovered', - description: (args: Result) => - `ERC721 recovered on ${ContractWithAssetRecovererInfo.name}:\n` + - `Recipient: ${etherscanAddress(args.recipient)}\n` + - `Token: ${etherscanAddress(args.token)}\n` + - `Token ID: ${args.tokenId}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: ContractWithAssetRecovererInfo.address, - abi: 'event ERC1155Recovered(address indexed token, uint256 tokenId, address indexed recipient, uint256 amount)', - alertId: 'ASSET-RECOVERER-ERC1155-RECOVERED', - name: 'πŸ”΄ AssetRecoverer: ERC1155 recovered', - description: (args: Result) => - `ERC1155 recovered on ${ContractWithAssetRecovererInfo.name}:\n` + - `Recipient: ${etherscanAddress(args.recipient)}\n` + - `Token: ${etherscanAddress(args.token)}\n` + - `Token ID: ${args.tokenId}\n` + - `Amount: ${args.amount}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: ContractWithAssetRecovererInfo.address, - abi: 'event EtherRecovered(address indexed recipient, uint256 amount)', - alertId: 'ASSET-RECOVERER-ETHER-RECOVERED', - name: 'πŸ”΄ AssetRecoverer: Ether recovered', - description: (args: Result) => - `Ether recovered on ${ContractWithAssetRecovererInfo.name}:\n` + - `Recipient: ${etherscanAddress(args.recipient)}\n` + - `Amount: ${args.amount}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: ContractWithAssetRecovererInfo.address, - abi: 'event StETHSharesRecovered(address indexed recipient, uint256 shares)', - alertId: 'ASSET-RECOVERER-STETH-SHARES-RECOVERED', - name: 'πŸ”΄ AssetRecoverer: StETH Shares recovered', - description: (args: Result) => - `StETH Shares recovered on ${ContractWithAssetRecovererInfo.name}:\n` + - `Recipient: ${etherscanAddress(args.recipient)}\n` + - `Shares: ${args.shares}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - ] - }) -} diff --git a/csm-alerts/src/utils/events/cs_accounting_events.ts b/csm-alerts/src/utils/events/cs_accounting_events.ts deleted file mode 100644 index 1dc1cf295..000000000 --- a/csm-alerts/src/utils/events/cs_accounting_events.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { EventOfNotice } from '../../entity/events' -import { Result } from '@ethersproject/abi/lib' -import { etherscanAddress, toEthString } from '../string' -import { Finding } from '../../generated/proto/alert_pb' -import BigNumber from 'bignumber.js' - -export const APPROVAL_EVENT = 'event Approval(address indexed owner, address indexed spender, uint256 value)' - -export function getCSAccountingEvents(CS_ACCOUNTING_ADDRESS: string): EventOfNotice[] { - return [ - { - address: CS_ACCOUNTING_ADDRESS, - abi: 'event ChargePenaltyRecipientSet(address chargeRecipient)', - alertId: 'CS-ACCOUNTING-CHARGE-PENALTY-RECIPIENT-SET', - name: '🚨 CSAccounting: Charge penalty recipient set', - description: (args: Result) => - `Charge penalty recipient set to ${etherscanAddress(args.chargeRecipient)} (expecting the treasury)`, - severity: Finding.Severity.CRITICAL, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_ACCOUNTING_ADDRESS, - abi: 'event BondCurveUpdated(uint256 indexed curveId, uint256[] bondCurve)', - alertId: 'CS-ACCOUNTING-BOND-CURVE-UPDATED', - name: '🚨 CSAccounting: Bond curve updated', - description: (args: Result) => { - const bondCurveString = args.bondCurve.map((value: string) => toEthString(BigNumber(Number(value)))).join(', ') - return `Bond curve updated with curve ID ${args.curveId}. Bond curve: [${bondCurveString}]` - }, - severity: Finding.Severity.CRITICAL, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_ACCOUNTING_ADDRESS, - abi: 'event BondCurveAdded(uint256[] bondCurve)', - alertId: 'CS-ACCOUNTING-BOND-CURVE-ADDED', - name: 'πŸ”΄ CSAccounting: Bond curve added', - description: (args: Result) => { - const bondCurveString = args.bondCurve.map((value: string) => toEthString(BigNumber(Number(value)))).join(', ') - return `Bond curve added: [${bondCurveString}]` - }, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_ACCOUNTING_ADDRESS, - abi: 'event BondCurveSet(uint256 indexed nodeOperatorId, uint256 curveId)', - alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', - name: 'πŸ”΄ CSAccounting: Bond curve set', - description: (args: Result) => - `Bond curve set for node operator ID ${args.nodeOperatorId} with curve ID ${args.curveId}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - ] -} diff --git a/csm-alerts/src/utils/events/cs_fee_distributor_events.ts b/csm-alerts/src/utils/events/cs_fee_distributor_events.ts deleted file mode 100644 index 1cdebcc43..000000000 --- a/csm-alerts/src/utils/events/cs_fee_distributor_events.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { EventOfNotice } from '../../entity/events' -import { Result } from '@ethersproject/abi/lib' -import { Finding } from '../../generated/proto/alert_pb' - -export const TRANSFER_SHARES_EVENT = - 'event TransferShares(address indexed from, address indexed to, uint256 sharesValue)' -export const DISTRIBUTION_DATA_UPDATED_EVENT = - 'event DistributionDataUpdated(uint256 totalClaimableShares, bytes32 treeRoot, string treeCid)' - -export function getCSFeeDistributorEvents(CS_FEE_DISTRIBUTOR_ADDRESS: string): EventOfNotice[] { - return [ - { - address: CS_FEE_DISTRIBUTOR_ADDRESS, - abi: DISTRIBUTION_DATA_UPDATED_EVENT, - alertId: 'CSFEE-DISTRIBUTOR-DISTRIBUTION-DATA-UPDATED', - name: 'πŸ”΅ CSFeeDistributor: Distribution data updated', - description: (args: Result) => - `Distribution data updated:\n` + - `Total Claimable Shares: ${args.totalClaimableShares}\n` + - `Tree Root: ${args.treeRoot}\n` + - `Tree CID: ${args.treeCid}`, - severity: Finding.Severity.INFO, - type: Finding.FindingType.INFORMATION, - }, - ] -} diff --git a/csm-alerts/src/utils/events/cs_fee_oracle_events.ts b/csm-alerts/src/utils/events/cs_fee_oracle_events.ts deleted file mode 100644 index 7268dbc13..000000000 --- a/csm-alerts/src/utils/events/cs_fee_oracle_events.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { EventOfNotice } from '../../entity/events' -import { Result } from '@ethersproject/abi/lib' -import { etherscanAddress } from '../string' -import { Finding } from '../../generated/proto/alert_pb' - -export const HASH_CONSENSUS_REPORT_RECEIVED_EVENT = - 'event ReportReceived(uint256 indexed refSlot, address indexed member, bytes32 report)' - -export const CS_FEE_ORACLE_REPORT_SUBMITTED_EVENT = - 'event ReportSubmitted(uint256 indexed refSlot, bytes32 hash, uint256 processingDeadlineTime)' - -export function getHashConsensusEvents(HASH_CONSENSUS_ADDRESS: string): EventOfNotice[] { - return [ - { - address: HASH_CONSENSUS_ADDRESS, - abi: 'event MemberAdded(address indexed addr, uint256 newTotalMembers, uint256 newQuorum)', - alertId: 'HASH-CONSENSUS-MEMBER-ADDED', - name: 'πŸ”΄ HashConsensus: Member added', - description: (args: Result) => - `New member ${etherscanAddress(args.addr)} added. Total members: ${args.newTotalMembers}, New quorum: ${args.newQuorum}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: HASH_CONSENSUS_ADDRESS, - abi: 'event MemberRemoved(address indexed addr, uint256 newTotalMembers, uint256 newQuorum)', - alertId: 'HASH-CONSENSUS-MEMBER-REMOVED', - name: 'πŸ”΄ HashConsensus: Member removed', - description: (args: Result) => - `Member ${etherscanAddress(args.addr)} removed. Total members: ${args.newTotalMembers}, New quorum: ${args.newQuorum}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: HASH_CONSENSUS_ADDRESS, - abi: 'event QuorumSet(uint256 newQuorum, uint256 totalMembers, uint256 prevQuorum)', - alertId: 'HASH-CONSENSUS-QUORUM-SET', - name: 'πŸ”΄ HashConsensus: Quorum set', - description: (args: Result) => - `Quorum set to ${args.newQuorum}. Total members: ${args.totalMembers}, Previous quorum: ${args.prevQuorum}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: HASH_CONSENSUS_ADDRESS, - abi: 'event FastLaneConfigSet(uint256 fastLaneLengthSlots)', - alertId: 'HASH-CONSENSUS-FASTLANE-CONFIG-SET', - name: 'πŸ”΄ HashConsensus: Fastlane config set', - description: (args: Result) => `Fastlane configuration set with length slots: ${args.fastLaneLengthSlots}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: HASH_CONSENSUS_ADDRESS, - abi: 'event FrameConfigSet(uint256 newInitialEpoch, uint256 newEpochsPerFrame)', - alertId: 'HASH-CONSENSUS-FRAME-CONFIG-SET', - name: 'πŸ”΄ HashConsensus: Frame config set', - description: (args: Result) => - `Frame configuration set. New initial epoch: ${args.newInitialEpoch}, Epochs per frame: ${args.newEpochsPerFrame}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: HASH_CONSENSUS_ADDRESS, - abi: 'event ReportProcessorSet(address indexed processor, address indexed prevProcessor)', - alertId: 'HASH-CONSENSUS-REPORT-PROCESSOR-SET', - name: 'πŸ”΄ HashConsensus: Report processor set', - description: (args: Result) => - `Report processor set. New processor: ${etherscanAddress(args.processor)}, Previous processor: ${etherscanAddress(args.prevProcessor)}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: HASH_CONSENSUS_ADDRESS, - abi: 'event ConsensusLost(uint256 indexed refSlot)', - alertId: 'HASH-CONSENSUS-LOST', - name: 'πŸ”΄ HashConsensus: Consensus lost', - description: (args: Result) => `Consensus lost for slot ${args.refSlot}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: HASH_CONSENSUS_ADDRESS, - abi: 'event ConsensusReached(uint256 indexed refSlot, bytes32 report, uint256 support)', - alertId: 'HASH-CONSENSUS-REACHED', - name: 'πŸ”΅ HashConsensus: Consensus reached, report received', - description: (args: Result) => - `Consensus reached for slot ${args.refSlot}. Report hash: ${args.report}, Support: ${args.support}`, - severity: Finding.Severity.INFO, - type: Finding.FindingType.INFORMATION, - }, - ] -} - -export function getCSFeeOracleEvents(CS_FEE_ORACLE_ADDRESS: string): EventOfNotice[] { - return [ - { - address: CS_FEE_ORACLE_ADDRESS, - abi: 'event ConsensusHashContractSet(address indexed addr, address indexed prevAddr)', - alertId: 'CSFEE-ORACLE-CONSENSUS-HASH-CONTRACT-SET', - name: '🚨 CSFeeOracle: Consensus hash contract set', - description: (args: Result) => - `Consensus hash contract set to ${etherscanAddress(args.addr)}, previous contract was ${etherscanAddress(args.prevAddr)}`, - severity: Finding.Severity.CRITICAL, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_FEE_ORACLE_ADDRESS, - abi: 'event PerfLeewaySet(uint256 valueBP)', - alertId: 'CSFEE-ORACLE-PERF-LEEWAY-SET', - name: 'πŸ”΄ CSFeeOracle: Performance leeway updated', - description: (args: Result) => `Performance leeway set to ${args.valueBP} basis points`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_FEE_ORACLE_ADDRESS, - abi: 'event FeeDistributorContractSet(address feeDistributorContract)', - alertId: 'CSFEE-ORACLE-FEE-DISTRIBUTOR-CONTRACT-SET', - name: 'πŸ”΄ CSFeeOracle: New CSFeeDistributor set', - description: (args: Result) => - `New CSFeeDistributor contract set to ${etherscanAddress(args.feeDistributorContract)}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_FEE_ORACLE_ADDRESS, - abi: 'event ConsensusVersionSet(uint256 indexed version, uint256 indexed prevVersion)', - alertId: 'CSFEE-ORACLE-CONSENSUS-VERSION-SET', - name: 'πŸ”΄ CSFeeOracle: Consensus version set', - description: (args: Result) => - `Consensus version set to ${args.version}, previous version was ${args.prevVersion}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_FEE_ORACLE_ADDRESS, - abi: 'event WarnProcessingMissed(uint256 indexed refSlot)', - alertId: 'CSFEE-ORACLE-PROCESSING-MISSED', - name: 'πŸ”΄ CSFeeOracle: Processing missed', - description: (args: Result) => `Processing missed for slot ${args.refSlot}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_FEE_ORACLE_ADDRESS, - abi: CS_FEE_ORACLE_REPORT_SUBMITTED_EVENT, - alertId: 'CSFEE-ORACLE-REPORT-SUBMITTED', - name: 'πŸ”΅ CSFeeOracle: Report submitted', - description: (args: Result) => - `Report submitted for slot ${args.refSlot}. Hash: ${args.hash}, Processing deadline time: ${args.processingDeadlineTime}`, - severity: Finding.Severity.INFO, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_FEE_ORACLE_ADDRESS, - abi: 'event ProcessingStarted(uint256 indexed refSlot, bytes32 hash)', - alertId: 'CSFEE-ORACLE-PROCESSING-STARTED', - name: 'πŸ”΅ CSFeeOracle: Processing started', - description: (args: Result) => `Processing started for slot ${args.refSlot}. Hash: ${args.hash}`, - severity: Finding.Severity.INFO, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_FEE_ORACLE_ADDRESS, - abi: 'event ReportSettled(uint256 indexed refSlot, uint256 distributed, bytes32 treeRoot, string treeCid)', - alertId: 'CSFEE-ORACLE-REPORT-SETTLED', - name: 'πŸ”΅ CSFeeOracle: Report settled', - description: (args: Result) => - `Report settled for slot ${args.refSlot}. Distributed: ${args.distributed}, Tree root: ${args.treeRoot}, Tree CID: ${args.treeCid}`, - severity: Finding.Severity.INFO, - type: Finding.FindingType.INFORMATION, - }, - ] -} diff --git a/csm-alerts/src/utils/events/cs_module_events.ts b/csm-alerts/src/utils/events/cs_module_events.ts deleted file mode 100644 index eddbe98cf..000000000 --- a/csm-alerts/src/utils/events/cs_module_events.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { EventOfNotice } from '../../entity/events' -import { Result } from '@ethersproject/abi/lib' -import { Finding } from '../../generated/proto/alert_pb' -import { toEthString } from '../string' -import BigNumber from 'bignumber.js' - -export const NODE_OPERATOR_ADDED_EVENT_ABI = - 'event NodeOperatorAdded(uint256 indexed nodeOperatorId, address indexed managerAddress, address indexed rewardAddress)' - -export function getCSModuleEvents(CS_MODULE_ADDRESS: string): EventOfNotice[] { - return [ - { - address: CS_MODULE_ADDRESS, - abi: 'event PublicRelease()', - alertId: 'CS-MODULE-PUBLIC-RELEASE', - name: 'πŸ”΅ CSModule: Public release', - description: () => `Public release is activated on ${CS_MODULE_ADDRESS}`, - severity: Finding.Severity.INFO, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_MODULE_ADDRESS, - abi: 'event VettedSigningKeysCountDecreased(uint256 indexed nodeOperatorId)', - alertId: 'CS-MODULE-VETTED-SIGNING-KEYS-DECREASED', - name: 'πŸ”΅ CSModule: Node Operator vetted signing keys decreased', - description: (args: Result) => `Vetted signing keys decreased for Node Operator #${args.nodeOperatorId}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_MODULE_ADDRESS, - abi: 'event TargetValidatorsCountChanged(uint256 indexed nodeOperatorId, uint256 targetLimitMode, uint256 targetValidatorsCount)', - alertId: 'CS-MODULE-TARGET-LIMIT-MODE-CHANGED', - name: '🟠 CSModule: Target limit mode changed', - description: (args: Result) => - `Target limit mode: ${args.targetLimitMode} (${ - Number(args.targetLimitMode) === 0 - ? 'disabled' - : Number(args.targetLimitMode) === 1 - ? 'soft mode' - : 'forced mode' - })`, - severity: Finding.Severity.MEDIUM, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_MODULE_ADDRESS, - abi: 'event ELRewardsStealingPenaltyReported(uint256 indexed nodeOperatorId, bytes32 proposedBlockHash, uint256 stolenAmount)', - alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-REPORTED', - name: 'πŸ”΄ CSModule: EL Rewards stealing penalty reported', - description: (args: Result) => - `EL Rewards stealing penalty reported for Node Operator #${args.nodeOperatorId} with ${toEthString(BigNumber(Number(args.stolenAmount)))} potentially stolen`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_MODULE_ADDRESS, - abi: 'event ELRewardsStealingPenaltyCancelled(uint256 indexed nodeOperatorId, uint256 amount)', - alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-CANCELLED', - name: 'πŸ”΄ CSModule: EL Rewards stealing penalty cancelled', - description: (args: Result) => - `EL Rewards stealing penalty (${toEthString(args.amount)}) cancelled for Node Operator #${args.nodeOperatorId}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - { - address: CS_MODULE_ADDRESS, - abi: 'event ELRewardsStealingPenaltySettled(uint256 indexed nodeOperatorId)', - alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-SETTLED', - name: 'πŸ”΄ CSModule: EL Rewards stealing penalty settled', - description: (args: Result) => `EL Rewards stealing penalty settled for Node Operator #${args.nodeOperatorId}`, - severity: Finding.Severity.HIGH, - type: Finding.FindingType.INFORMATION, - }, - ] -} diff --git a/csm-alerts/src/utils/events/mocks/events.mock.ts b/csm-alerts/src/utils/events/mocks/events.mock.ts deleted file mode 100644 index 30ab8867d..000000000 --- a/csm-alerts/src/utils/events/mocks/events.mock.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Result } from '@ethersproject/abi' -import { LogDescription } from 'forta-agent' -import { faker } from '@faker-js/faker' - -export function createLogDescriptionMock(args?: Result): jest.Mocked { - return { - address: faker.finance.ethereumAddress(), - // eslint-disable-next-line - // @ts-expect-error - args: args ?? {}, - // eslint-disable-next-line - // @ts-expect-error - eventFragment: jest.fn(), - logIndex: faker.number.int(), - name: faker.string.uuid(), - signature: faker.finance.ethereumAddress(), - topic: faker.finance.ethereumAddress(), - } -} diff --git a/csm-alerts/src/utils/events/ossified_proxy_events.ts b/csm-alerts/src/utils/events/ossified_proxy_events.ts deleted file mode 100644 index 47a00632b..000000000 --- a/csm-alerts/src/utils/events/ossified_proxy_events.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { EventOfNotice } from '../../entity/events' -import { Result } from '@ethersproject/abi/lib' -import { etherscanAddress } from '../string' -import { Finding } from '../../generated/proto/alert_pb' - -interface Proxy { - name: string - address: string - functions: Map -} - -export function getOssifiedProxyEvents(CSM_PROXY_CONTRACTS: Proxy[]): EventOfNotice[] { - return CSM_PROXY_CONTRACTS.flatMap((proxyInfo: Proxy) => { - return [ - { - address: proxyInfo.address, - abi: 'event ProxyOssified()', - alertId: 'PROXY-OSSIFIED', - name: `🚨 ${proxyInfo.name}: Proxy Ossified`, - description: () => `Proxy for ${proxyInfo.name}(${etherscanAddress(proxyInfo.address)}) was ossified`, - severity: Finding.Severity.CRITICAL, - type: Finding.FindingType.INFORMATION, - }, - { - address: proxyInfo.address, - abi: 'event Upgraded(address indexed implementation)', - alertId: 'PROXY-UPGRADED', - name: `🚨 ${proxyInfo.name}: Implementation Upgraded`, - description: (args: Result) => - `The proxy implementation has been upgraded to ${args.implementation.toLowerCase()}`, - severity: Finding.Severity.CRITICAL, - type: Finding.FindingType.INFORMATION, - }, - { - address: proxyInfo.address, - abi: 'event AdminChanged(address previousAdmin, address newAdmin)', - alertId: 'PROXY-ADMIN-CHANGED', - name: `🚨 ${proxyInfo.name}: Admin Changed`, - description: (args: Result) => - `The proxy admin for ${proxyInfo.name}(${proxyInfo.address}) has been changed from ${etherscanAddress(args.previousAdmin)} to ${etherscanAddress(args.newAdmin)}`, - severity: Finding.Severity.CRITICAL, - type: Finding.FindingType.INFORMATION, - }, - { - address: proxyInfo.address, - abi: 'event BeaconUpgraded(address indexed beacon)', - alertId: 'PROXY-BEACON-UPGRADED', - name: `🚨 ${proxyInfo.address}: Beacon Upgraded`, - description: (args: Result) => `The proxy beacon has been upgraded to ${etherscanAddress(args.beacon)}`, - severity: Finding.Severity.CRITICAL, - type: Finding.FindingType.INFORMATION, - }, - ] - }) -} diff --git a/csm-alerts/src/utils/events/pausable_events.ts b/csm-alerts/src/utils/events/pausable_events.ts deleted file mode 100644 index 877ff644a..000000000 --- a/csm-alerts/src/utils/events/pausable_events.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Result } from '@ethersproject/abi/lib' -import { EventOfNotice } from '../../entity/events' -import { Finding } from '../../generated/proto/alert_pb' -import { toKebabCase } from '../string' -import { ONE_HOUR } from '../constants' - -interface PausableContract { - name: string - address: string - functions: Map -} - -export function getPausableEvents(PAUSABLE_CONTRACTS: PausableContract[]): EventOfNotice[] { - return PAUSABLE_CONTRACTS.flatMap((pausableContractInfo: PausableContract) => { - return [ - { - address: pausableContractInfo.address, - abi: 'event Paused(uint256 duration)', - alertId: `${toKebabCase(pausableContractInfo.name)}-PAUSED`, - name: `🚨 ${pausableContractInfo.name}: contract was paused`, - description: (args: Result) => `For ${args.duration / ONE_HOUR} hours`, - severity: Finding.Severity.CRITICAL, - type: Finding.FindingType.INFORMATION, - }, - { - address: pausableContractInfo.address, - abi: 'event Resumed()', - alertId: `${toKebabCase(pausableContractInfo.name)}-UNPAUSED`, - name: `🚨 ${pausableContractInfo.name}: contract was resumed`, - description: () => 'Contract was resumed', - severity: Finding.Severity.CRITICAL, - type: Finding.FindingType.INFORMATION, - }, - ] - }) -} diff --git a/csm-alerts/src/utils/events/roles_monitoring_events.ts b/csm-alerts/src/utils/events/roles_monitoring_events.ts deleted file mode 100644 index 8ad567da6..000000000 --- a/csm-alerts/src/utils/events/roles_monitoring_events.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { EventOfNotice } from '../../entity/events' -import { Finding } from '../../generated/proto/alert_pb' -import { Result } from '@ethersproject/abi/lib' -import { DeploymentAddresses } from '../constants.holesky' - -interface RolesMonitoringContract { - name: string - address: string -} - -export function getRolesMonitoringEvents(ROLES_MONITORING_CONTRACTS: RolesMonitoringContract[]): EventOfNotice[] { - return ROLES_MONITORING_CONTRACTS.flatMap((contractInfo: RolesMonitoringContract) => { - return [ - { - address: contractInfo.address, - abi: 'event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)', - alertId: `ROLE-GRANTED`, - name: `🚨 ${contractInfo.name}: Role granted`, - description: (args: Result) => - `Role ${args.role}(${DeploymentAddresses.RolesMap.get(args.role) || 'unknown'}) was granted to ${args.account} by ${args.sender}`, - severity: Finding.Severity.CRITICAL, - type: Finding.FindingType.INFORMATION, - }, - { - address: contractInfo.address, - abi: 'event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)', - alertId: `ROLE-REVOKED`, - name: `🚨 ${contractInfo.name}: Role revoked`, - description: (args: Result) => - `Role ${args.role}(${DeploymentAddresses.RolesMap.get(args.role) || 'unknown'}) was revoked to ${args.account} by ${args.sender}`, - severity: Finding.Severity.CRITICAL, - type: Finding.FindingType.INFORMATION, - }, - ] - }) -} diff --git a/csm-alerts/src/utils/findings.ts b/csm-alerts/src/utils/findings.ts new file mode 100644 index 000000000..186c282ce --- /dev/null +++ b/csm-alerts/src/utils/findings.ts @@ -0,0 +1,115 @@ +import { BlockEvent, Finding, FindingSeverity, FindingType, TransactionEvent } from '@fortanetwork/forta-bot' +import { FindingSource } from '@fortanetwork/forta-bot/dist/findings/finding.source' + +import { toKebabCase } from './string' +import { APP_NAME } from '../config' +import Version from './version' + +export function sourceFromEvent(event: TransactionEvent | BlockEvent): FindingSource { + const source: FindingSource = {} + + if ('transaction' in event) source.transactions = [{ chainId: event.chainId, hash: event.transaction.hash }] + source.blocks = [{ chainId: event.chainId, hash: event.block.hash, number: event.block.number }] + + return source +} + +export function launchAlert(): Finding { + return Finding.fromObject({ + name: `πŸš€πŸš€πŸš€ Bot ${APP_NAME} launched`, + description: `Commit ${Version.commitHashShort}`, + alertId: 'BOT-LAUNCH', + severity: FindingSeverity.Info, + type: FindingType.Info, + }) +} + +export function invariantAlert(event: BlockEvent | TransactionEvent, message: string): Finding { + return Finding.fromObject({ + name: '🚨 Assert invariant failed', + description: message, + alertId: 'ASSERT-FAILED', + source: sourceFromEvent(event), + severity: FindingSeverity.Critical, + type: FindingType.Info, + }) +} + +export function errorAlert(name: string, err: string | Error | undefined): Finding { + return Finding.fromObject({ + name: name, + description: String(err), + alertId: 'CODE-ERROR', + severity: FindingSeverity.Unknown, + type: FindingType.Degraded, + metadata: { + stack: `${err instanceof Error ? err.stack : null}`, + message: `${err instanceof Error ? err.message : null}`, + name: `${err instanceof Error ? err.name : null}`, + }, + }) +} + +export function failedTxAlert(txEvent: TransactionEvent, description: string, reason: string): Finding { + return Finding.fromObject({ + name: `🟣 CRITICAL: ${reason}`, + description: `Transaction reverted. ${description}`, + alertId: `CSFEE-${toKebabCase(reason)}`, + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Critical, + type: FindingType.Info, + }) +} + +export const NetworkErrorFinding = 'NETWORK-ERROR' + +export function networkAlert(err: Error, name: string, desc: string): Finding { + const f = Finding.fromObject({ + name: name, + description: desc, + alertId: NetworkErrorFinding, + severity: FindingSeverity.Unknown, + type: FindingType.Degraded, + metadata: { + stack: `${err.stack}`, + message: `${err.message}`, + name: `${err.name}`, + }, + }) + + return f +} + +export function dbAlert(err: Error, name: string, desc: string): Finding { + const f = Finding.fromObject({ + name: name, + description: desc, + alertId: 'DB-ERROR', + severity: FindingSeverity.Unknown, + type: FindingType.Degraded, + metadata: { + stack: `${err.stack}`, + message: `${err.message}`, + name: `${err.name}`, + }, + }) + + return f +} + +export class NetworkError extends Error { + constructor(e: unknown, name?: string) { + super() + + if (name !== undefined) { + this.name = name + } + + if (e instanceof Error) { + this.stack = e.stack + this.message = e.message + } else { + this.message = `${e}` + } + } +} diff --git a/csm-alerts/src/utils/logs.ts b/csm-alerts/src/utils/logs.ts new file mode 100644 index 000000000..9ebdd0015 --- /dev/null +++ b/csm-alerts/src/utils/logs.ts @@ -0,0 +1,22 @@ +import { ethers } from '@fortanetwork/forta-bot' + +const LOG_FILTER_CHUNK = 2000 + +export async function getLogsByChunks( + contract: ethers.Contract, + filter: ethers.ContractEventName, + startblock: number, + endBlock: number, +) { + const events: ethers.Log[] = [] + let endBlockChunk + let startBlockChunk = startblock + do { + endBlockChunk = + endBlock > startBlockChunk + LOG_FILTER_CHUNK - 1 ? startBlockChunk + LOG_FILTER_CHUNK - 1 : endBlock + const eventsChunk = await contract.queryFilter(filter, startBlockChunk, endBlockChunk) + events.push(...eventsChunk) + startBlockChunk = endBlockChunk + 1 + } while (endBlockChunk < endBlock) + return events +} diff --git a/csm-alerts/src/utils/mutex.ts b/csm-alerts/src/utils/mutex.ts deleted file mode 100644 index 377f148fe..000000000 --- a/csm-alerts/src/utils/mutex.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Mutex, MutexInterface, withTimeout } from 'async-mutex' - -export class DataRW { - private mutex: MutexInterface - private value: T[] - - constructor(initialValue: T[]) { - this.mutex = withTimeout(new Mutex(), 100) - this.value = initialValue - } - - async read(): Promise { - await this.mutex.acquire() - try { - const out = this.value - this.value = [] - - return out - } finally { - this.mutex.release() - } - } - - async write(newValue: T[]): Promise { - await this.mutex.acquire() - try { - this.value.push(...newValue) - } finally { - this.mutex.release() - } - } -} diff --git a/csm-alerts/src/utils/require.ts b/csm-alerts/src/utils/require.ts new file mode 100644 index 000000000..4d1ff8591 --- /dev/null +++ b/csm-alerts/src/utils/require.ts @@ -0,0 +1,51 @@ +import { RUN_TIER } from '../config' + +export enum RedefineMode { + Strict = 'strict', + Merge = 'merge', +} + +/** + * Special wrapper under `require` function that allows to + * redefine variables from a file with the same name and `.` suffix. + * `` is a string that is passed by `FORTA_AGENT_RUN_TIER` environment variable. + * @param module module object to get the path from. + * @param path relative to module path to the main file to import. + * @param mode `strict` or `merge`. Default: `strict`. + */ +export function requireWithTier(module: NodeModule, path: string, mode: RedefineMode = RedefineMode.Strict): T { + const defaultContent = require(`${module.path}/${path}`) + if (!RUN_TIER) return defaultContent + let tieredContent: any + // NOTE: It fails if it can't find the requested tier. + tieredContent = require(`${module.path}/${path}.${RUN_TIER}`) + module.exports.__tier__ = RUN_TIER + if (mode == RedefineMode.Strict) { + const valid = (key: string) => { + return key in tieredContent && typeof defaultContent[key] == typeof tieredContent[key] + } + if (Object.keys(defaultContent).every((key) => valid(key))) { + return tieredContent + } else { + throw new Error( + `Failed to import module: '${module.path}/${path}.${RUN_TIER}' doesn't contain all keys or unmatched types + with '${module.path}/${path}'`, + ) + } + } + if (mode == RedefineMode.Merge) { + const valid = (key: string) => { + if (key in defaultContent) { + return typeof defaultContent[key] == typeof tieredContent[key] + } else { + return true + } + } + if (Object.keys(tieredContent).every((key) => valid(key))) { + return { ...defaultContent, ...tieredContent } + } else { + throw new Error(`Failed to import module: '${path}.${RUN_TIER}' unmatched types with '${path}'`) + } + } + throw new Error(`Unknown require mode: ${mode}`) +} diff --git a/csm-alerts/src/utils/string.ts b/csm-alerts/src/utils/string.ts index 3c441dc12..fe1333ecd 100644 --- a/csm-alerts/src/utils/string.ts +++ b/csm-alerts/src/utils/string.ts @@ -1,15 +1,23 @@ -import { ETH_DECIMALS } from './constants' -import BigNumber from 'bignumber.js' +import { ethers } from '@fortanetwork/forta-bot' + +import { RUN_TIER } from '../config' +import { SHARES_PRECISION, WEI_PER_ETH } from '../shared/constants' export function etherscanAddress(address: string): string { - const subpath = process.env.FORTA_AGENT_RUN_TIER == 'testnet' ? 'holesky.' : '' + const subpath = RUN_TIER == 'holesky' ? 'holesky.' : '' return `[${address}](https://${subpath}etherscan.io/address/${address})` } -export function toEthString(wei: BigNumber): string { - return wei.dividedBy(ETH_DECIMALS).toFixed(3) + ' ETH' -} - export function toKebabCase(str: string): string { return str.replace(/_/g, '-') } + +export function formatShares(amount: bigint): string { + amount = amount - (amount % (SHARES_PRECISION / 100n)) + return `${ethers.formatEther(amount)} Γ— 1e18 shares` +} + +export function formatEther(amount: bigint): string { + amount = amount - (amount % (WEI_PER_ETH / 100n)) + return `${ethers.formatEther(amount)} ether` +} diff --git a/csm-alerts/src/utils/time.ts b/csm-alerts/src/utils/time.ts index 2b2433be3..aa02ad33b 100644 --- a/csm-alerts/src/utils/time.ts +++ b/csm-alerts/src/utils/time.ts @@ -11,22 +11,40 @@ export function elapsedTime(methodName: string, startTime: number): string { } function formatTimeToHumanReadable(date: Date): string { - return `${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}` + return date.toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false, + }) } -export function formatDelay(fullDelaySec: number): string { - const sign = fullDelaySec >= 0 ? 1 : -1 - let delayHours = 0 - let delayMin = Math.floor((sign * fullDelaySec) / 60) - const delaySec = sign * fullDelaySec - delayMin * 60 +export function formatDelay(fullDelaySec: bigint | number): string { + fullDelaySec = BigInt(fullDelaySec) + + const sign = fullDelaySec >= 0 ? 1n : -1n + fullDelaySec = sign * fullDelaySec + + let delayDays = 0n + let delayHours = 0n + + let delayMin = fullDelaySec / 60n + const delaySec = fullDelaySec - delayMin * 60n + if (delayMin >= 60) { - delayHours = Math.floor(delayMin / 60) - delayMin -= delayHours * 60 + delayHours = delayMin / 60n + delayMin -= delayHours * 60n + } + if (delayHours >= 24) { + delayDays = delayHours / 24n + delayHours -= delayDays * 24n } + return ( - (sign == 1 ? '' : '-') + - (delayHours > 0 ? `${delayHours} hrs ` : '') + - (delayMin > 0 ? `${delayMin} min ` : '') + - `${delaySec} sec` + (sign == 1n ? '' : '-') + + (delayDays > 0 ? `${delayDays} day` : '') + + (delayHours > 0 ? ` ${delayHours} hr` : '') + + (delayMin > 0 ? ` ${delayMin} min` : '') + + (delaySec > 0 ? ` ${delaySec} sec` : '') ) } diff --git a/csm-alerts/src/utils/utils.ts b/csm-alerts/src/utils/utils.ts deleted file mode 100644 index e1cc0a3c9..000000000 --- a/csm-alerts/src/utils/utils.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Contract, EventFilter, Event } from 'ethers' -import { Finding } from '../generated/proto/alert_pb' - -const LOG_FILTER_CHUNK = 2000 - -export async function getLogsByChunks(contract: Contract, filter: EventFilter, startblock: number, endBlock: number) { - const events: Event[] = [] - let endBlockChunk - let startBlockChunk = startblock - do { - endBlockChunk = - endBlock > startBlockChunk + LOG_FILTER_CHUNK - 1 ? startBlockChunk + LOG_FILTER_CHUNK - 1 : endBlock - const eventsChunk = await contract.queryFilter(filter, startBlockChunk, endBlockChunk) - events.push(...eventsChunk) - startBlockChunk = endBlockChunk + 1 - } while (endBlockChunk < endBlock) - return events -} - -export function assertInvariant(condition: boolean, message: string, findings: Finding[]) { - if (condition) { - const f = new Finding() - f.setName('🚨 Assert invariant failed') - f.setDescription(`${message}`) - f.setAlertid('ASSERT-FAILED') - f.setSeverity(Finding.Severity.CRITICAL) - f.setType(Finding.FindingType.INFORMATION) - f.setProtocol('ethereum') - - findings.push(f) - } -} diff --git a/csm-alerts/src/utils/version.ts b/csm-alerts/src/utils/version.ts index 34c3048c8..3fd42b5c3 100644 --- a/csm-alerts/src/utils/version.ts +++ b/csm-alerts/src/utils/version.ts @@ -9,7 +9,7 @@ export interface Version { isWdClean: boolean } -export default readVersion(path.join(__dirname, '..', './version.json')) +export default readVersion(path.join(__dirname, '..', '..', 'version.json')) function readVersion(versionFilePath: string): Version { try { diff --git a/csm-alerts/tools/go.mod b/csm-alerts/tools/go.mod deleted file mode 100644 index 4e1f44367..000000000 --- a/csm-alerts/tools/go.mod +++ /dev/null @@ -1,173 +0,0 @@ -module tools - -go 1.22.3 - -require github.com/prometheus/prometheus v0.52.1 - -require ( - cloud.google.com/go/auth v0.2.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.0 // indirect - cloud.google.com/go/compute/metadata v0.3.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.6.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect - github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect - github.com/Code-Hex/go-generics-cache v1.5.1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/alecthomas/kingpin/v2 v2.4.0 // indirect - github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect - github.com/armon/go-metrics v0.4.1 // indirect - github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go v1.51.25 // indirect - github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dennwc/varint v1.0.0 // indirect - github.com/digitalocean/godo v1.113.0 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v26.0.1+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/envoyproxy/go-control-plane v0.12.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect - github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/analysis v0.22.2 // indirect - github.com/go-openapi/errors v0.22.0 // indirect - github.com/go-openapi/jsonpointer v0.20.2 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect - github.com/go-openapi/loads v0.21.5 // indirect - github.com/go-openapi/spec v0.20.14 // indirect - github.com/go-openapi/strfmt v0.23.0 // indirect - github.com/go-openapi/swag v0.22.9 // indirect - github.com/go-openapi/validate v0.23.0 // indirect - github.com/go-resty/resty/v2 v2.12.0 // indirect - github.com/go-zookeeper/zk v1.0.3 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20240416155748-26353dc0451f // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.3 // indirect - github.com/gophercloud/gophercloud v1.11.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/hashicorp/consul/api v1.28.2 // indirect - github.com/hashicorp/cronexpr v1.1.2 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.5.0 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect - github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/golang-lru v0.6.0 // indirect - github.com/hashicorp/nomad/api v0.0.0-20240418183417-ea5f2f6748c7 // indirect - github.com/hashicorp/serf v0.10.1 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.7.2 // indirect - github.com/imdario/mergo v0.3.16 // indirect - github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/jpillora/backoff v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect - github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect - github.com/kylelemons/godebug v1.1.0 // indirect - github.com/linode/linodego v1.32.0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/miekg/dns v1.1.59 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moby/docker-image-spec v1.3.1 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1 // indirect - github.com/oklog/ulid v1.3.1 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/ovh/go-ovh v1.4.3 // indirect - github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/alertmanager v0.27.0 // indirect - github.com/prometheus/client_golang v1.19.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/exporter-toolkit v0.11.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.26 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.9.0 // indirect - github.com/vultr/govultr/v2 v2.17.2 // indirect - github.com/xhit/go-str2duration/v2 v2.1.0 // indirect - go.mongodb.org/mongo-driver v1.14.0 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector/featuregate v1.5.0 // indirect - go.opentelemetry.io/collector/pdata v1.5.0 // indirect - go.opentelemetry.io/collector/semconv v0.98.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect - go.opentelemetry.io/otel v1.25.0 // indirect - go.opentelemetry.io/otel/metric v1.25.0 // indirect - go.opentelemetry.io/otel/trace v1.25.0 // indirect - go.uber.org/atomic v1.11.0 // indirect - go.uber.org/goleak v1.3.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/oauth2 v0.19.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.20.0 // indirect - google.golang.org/api v0.174.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be // indirect - google.golang.org/grpc v1.63.2 // indirect - google.golang.org/protobuf v1.33.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.29.3 // indirect - k8s.io/apimachinery v0.29.3 // indirect - k8s.io/client-go v0.29.3 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/csm-alerts/tools/go.sum b/csm-alerts/tools/go.sum deleted file mode 100644 index a072fec9b..000000000 --- a/csm-alerts/tools/go.sum +++ /dev/null @@ -1,969 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/auth v0.2.0 h1:y6oTcpMSbOcXbwYgUUrvI+mrQ2xbrcdpPgtVbCGTLTk= -cloud.google.com/go/auth v0.2.0/go.mod h1:+yb+oy3/P0geX6DLKlqiGHARGR6EX2GRtYCzWOCQSbU= -cloud.google.com/go/auth/oauth2adapt v0.2.0 h1:FR8zevgQwu+8CqiOT5r6xCmJa3pJC/wdXEEPF1OkNhA= -cloud.google.com/go/auth/oauth2adapt v0.2.0/go.mod h1:AfqujpDAlTfLfeCIl/HJZZlIxD8+nJoZ5e0x1IxGq5k= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.6.0 h1:ui3YNbxfW7J3tTFIZMH6LIGRjCngp+J+nIFlnizfNTE= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.6.0/go.mod h1:gZmgV+qBqygoznvqo2J9oKZAFziqhLZ2xE/WVUmzkHA= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1 h1:7CBQ+Ei8SP2c6ydQTGCCrS35bDxgTMfoP2miAwK++OU= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= -github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= -github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.51.25 h1:DjTT8mtmsachhV6yrXR8+yhnG6120dazr720nopRsls= -github.com/aws/aws-sdk-go v1.51.25/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= -github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= -github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= -github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= -github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/digitalocean/godo v1.113.0 h1:CLtCxlP4wDAjKIQ+Hshht/UNbgAp8/J/XBH1ZtDCF9Y= -github.com/digitalocean/godo v1.113.0/go.mod h1:Z2mTP848Vi3IXXl5YbPekUgr4j4tOePomA+OE1Ag98w= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/docker v26.0.1+incompatible h1:t39Hm6lpXuXtgkF0dm1t9a5HkbUfdGy6XbWexmGr+hA= -github.com/docker/docker v26.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1SCxNI1/Tieq/NFvh6dzLdgi7eu0tM= -github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= -github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= -github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= -github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= -github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= -github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= -github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= -github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= -github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= -github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= -github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= -github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= -github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= -github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= -github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= -github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= -github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= -github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20240416155748-26353dc0451f h1:WpZiq8iqvGjJ3m3wzAVKL6+0vz7VkE79iSy9GII00II= -github.com/google/pprof v0.0.0-20240416155748-26353dc0451f/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= -github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= -github.com/gophercloud/gophercloud v1.11.0 h1:ls0O747DIq1D8SUHc7r2vI8BFbMLeLFuENaAIfEx7OM= -github.com/gophercloud/gophercloud v1.11.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= -github.com/hashicorp/consul/api v1.28.2 h1:mXfkRHrpHN4YY3RqL09nXU1eHKLNiuAN4kHvDQ16k/8= -github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= -github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8= -github.com/hashicorp/consul/sdk v0.16.0/go.mod h1:7pxqqhqoaPqnBnzXD1StKed62LqJeClzVsUEy85Zr0A= -github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= -github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.6 h1:RSG8rKU28VTUTvEKghe5gIhIQpv8evvNpnDEyqO4u9I= -github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= -github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20240418183417-ea5f2f6748c7 h1:pjE59CS2C9Bg+Xby0ROrnZSSBWtKwx3Sf9gqsrvIFSA= -github.com/hashicorp/nomad/api v0.0.0-20240418183417-ea5f2f6748c7/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= -github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hetznercloud/hcloud-go/v2 v2.7.2 h1:UlE7n1GQZacCfyjv9tDVUN7HZfOXErPIfM/M039u9A0= -github.com/hetznercloud/hcloud-go/v2 v2.7.2/go.mod h1:49tIV+pXRJTUC7fbFZ03s45LKqSQdOPP5y91eOnJo/k= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= -github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= -github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= -github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= -github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/linode/linodego v1.32.0 h1:OmZzB3iON6uu84VtLFf64uKmAQqJJarvmsVguroioPI= -github.com/linode/linodego v1.32.0/go.mod h1:y8GDP9uLVH4jTB9qyrgw79qfKdYJmNCGUOJmfuiOcmI= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= -github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= -github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= -github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1 h1:dOYG7LS/WK00RWZc8XGgcUTlTxpp3mKhdR2Q9z9HbXM= -github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= -github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/prometheus/alertmanager v0.27.0 h1:V6nTa2J5V4s8TG4C4HtrBP/WNSebCCTYGGv4qecA/+I= -github.com/prometheus/alertmanager v0.27.0/go.mod h1:8Ia/R3urPmbzJ8OsdvmZvIprDwvwmYCmUbwBL+jlPOE= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= -github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= -github.com/prometheus/exporter-toolkit v0.11.0 h1:yNTsuZ0aNCNFQ3aFTD2uhPOvr4iD7fdBvKPAEGkNf+g= -github.com/prometheus/exporter-toolkit v0.11.0/go.mod h1:BVnENhnNecpwoTLiABx7mrPB/OLRIgN74qlQbV+FK1Q= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/prometheus/prometheus v0.52.1 h1:BrQ29YG+mzdGh8DgHPirHbeMGNqtL+INe0rqg7ttBJ4= -github.com/prometheus/prometheus v0.52.1/go.mod h1:3z74cVsmVH0iXOR5QBjB7Pa6A0KJeEAK5A6UsmAFb1g= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.26 h1:F+GIVtGqCFxPxO46ujf8cEOP574MBoRm3gNbPXECbxs= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.26/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= -github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= -github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= -github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= -github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= -go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector/featuregate v1.5.0 h1:uK8qnYQKz1TMkK+FDTFsywg/EybW/gbnOUaPNUkRznM= -go.opentelemetry.io/collector/featuregate v1.5.0/go.mod h1:w7nUODKxEi3FLf1HslCiE6YWtMtOOrMnSwsDam8Mg9w= -go.opentelemetry.io/collector/pdata v1.5.0 h1:1fKTmUpr0xCOhP/B0VEvtz7bYPQ45luQ8XFyA07j8LE= -go.opentelemetry.io/collector/pdata v1.5.0/go.mod h1:TYj8aKRWZyT/KuKQXKyqSEvK/GV+slFaDMEI+Ke64Yw= -go.opentelemetry.io/collector/semconv v0.98.0 h1:zO4L4TmlxXoYu8UgPeYElGY19BW7wPjM+quL5CzoOoY= -go.opentelemetry.io/collector/semconv v0.98.0/go.mod h1:8ElcRZ8Cdw5JnvhTOQOdYizkJaQ10Z2fS+R6djOnj6A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= -go.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k= -go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0 h1:Mbi5PKN7u322woPa85d7ebZ+SOvEoPvoiBu+ryHWgfA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0/go.mod h1:e7ciERRhZaOZXVjx5MiL8TK5+Xv7G5Gv5PA2ZDEJdL8= -go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA= -go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= -go.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo= -go.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw= -go.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM= -go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= -go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= -go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= -golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= -golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.174.0 h1:zB1BWl7ocxfTea2aQ9mgdzXjnfPySllpPOskdnO+q34= -google.golang.org/api v0.174.0/go.mod h1:aC7tB6j0HR1Nl0ni5ghpx6iLasmAX78Zkh/wgxAAjLg= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be h1:Zz7rLWqp0ApfsR/l7+zSHhY3PMiH2xqgxlfYfAfNpoU= -google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be/go.mod h1:dvdCTIoAGbkWbcIKBniID56/7XHTt6WfxXNMxuziJ+w= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be h1:LG9vZxsWGOmUKieR8wPAUR3u3MpnYFQZROPIMaXh7/A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/csm-alerts/tools/tools.go b/csm-alerts/tools/tools.go deleted file mode 100644 index 9898c8df0..000000000 --- a/csm-alerts/tools/tools.go +++ /dev/null @@ -1,10 +0,0 @@ -//go:build tools -// +build tools - -//go:generate go build -o ../bin/promtool github.com/prometheus/prometheus/cmd/promtool - -package tools - -import ( - _ "github.com/prometheus/prometheus/cmd/promtool" -) \ No newline at end of file diff --git a/csm-alerts/tsconfig.json b/csm-alerts/tsconfig.json index 54a278c10..29128a7e8 100644 --- a/csm-alerts/tsconfig.json +++ b/csm-alerts/tsconfig.json @@ -10,6 +10,6 @@ "tests", "dist", "**/*spec.ts", - "**/*mock.ts" + "**/*mock.ts", ] } diff --git a/csm-alerts/yarn.lock b/csm-alerts/yarn.lock index 92595e99a..542b6cdda 100644 --- a/csm-alerts/yarn.lock +++ b/csm-alerts/yarn.lock @@ -90,7 +90,7 @@ "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0": version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz" integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== "@babel/helper-simple-access@^7.24.7": @@ -103,7 +103,7 @@ "@babel/helper-string-parser@^7.24.8": version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz" integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== "@babel/helper-validator-identifier@^7.24.7": @@ -113,7 +113,7 @@ "@babel/helper-validator-option@^7.24.8": version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz" integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== "@babel/helpers@^7.25.0": @@ -317,11 +317,30 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== + +"@eslint-community/regexpp@^4.6.1": version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz" integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== +"@eslint/config-array@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" + integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== + dependencies: + "@eslint/object-schema" "^2.1.4" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/core@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.6.0.tgz#9930b5ba24c406d67a1760e94cdbac616a6eb674" + integrity sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg== + "@eslint/eslintrc@^2.1.4": version "2.1.4" resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" @@ -337,12 +356,44 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + "@eslint/js@8.57.0": version "8.57.0" resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.7.0": +"@eslint/js@9.11.1": + version "9.11.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.11.1.tgz#8bcb37436f9854b3d9a561440daf916acd940986" + integrity sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA== + +"@eslint/object-schema@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== + +"@eslint/plugin-kit@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz#8712dccae365d24e9eeecb7b346f85e750ba343d" + integrity sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig== + dependencies: + levn "^0.4.1" + +"@ethersproject/abi@^5.0.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -357,7 +408,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": +"@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== @@ -370,7 +421,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": +"@ethersproject/abstract-signer@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== @@ -381,7 +432,7 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": +"@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -392,14 +443,14 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": +"@ethersproject/base64@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": +"@ethersproject/basex@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== @@ -407,7 +458,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -416,37 +467,21 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": +"@ethersproject/constants@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/contracts@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" - integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": +"@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -461,44 +496,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" - integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" - integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -506,34 +504,26 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": +"@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@^5.7.0": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" - integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": +"@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.0.0": +"@ethersproject/providers@^5.0.0": version "5.7.2" resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -559,7 +549,7 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": +"@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== @@ -567,7 +557,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": +"@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== @@ -575,7 +565,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": +"@ethersproject/sha2@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== @@ -584,7 +574,7 @@ "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": +"@ethersproject/signing-key@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== @@ -596,19 +586,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" - integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": +"@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -617,7 +595,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -632,37 +610,7 @@ "@ethersproject/rlp" "^5.7.0" "@ethersproject/signing-key" "^5.7.0" -"@ethersproject/units@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" - integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/wallet@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" - integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/json-wallets" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": +"@ethersproject/web@^5.7.0": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -673,22 +621,27 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" - integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@faker-js/faker@^8.3.1": version "8.4.1" resolved "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz" integrity sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg== +"@fortanetwork/forta-bot-cli@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@fortanetwork/forta-bot-cli/-/forta-bot-cli-0.2.4.tgz#774250da989e6eb8405f104b7d3c777c821ac2e8" + integrity sha512-QJDSZTLkkG6rUXU/H2cTfEQCOOsKBnK0eZ5uvFNG7flHZqZoj7/Djp+bQrFC+OrbrhQZHnrbRIOfAS4T0odbHw== + dependencies: + "@fortanetwork/forta-bot" "^0.2.3" + awilix "^9.0.0" + axios "^1.6.2" + ethers "^6.9.0" + flat-cache "^3.2.0" + keythereum "^2.0.0" + prompts "^2.4.2" + shelljs "^0.8.5" + uuid "^9.0.1" + yargs "^17.7.2" + "@fortanetwork/forta-bot@^0.2.3": version "0.2.3" resolved "https://registry.npmjs.org/@fortanetwork/forta-bot/-/forta-bot-0.2.3.tgz" @@ -705,35 +658,6 @@ murmurhash3js "^3.0.1" sha3 "^2.1.4" -"@grpc/grpc-js@^1.10.2", "@grpc/grpc-js@^1.3.6": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.11.1.tgz#a92f33e98f1959feffcd1b25a33b113d2c977b70" - integrity sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw== - dependencies: - "@grpc/proto-loader" "^0.7.13" - "@js-sdsl/ordered-map" "^4.4.2" - -"@grpc/proto-loader@^0.6.4": - version "0.6.13" - resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz" - integrity sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g== - dependencies: - "@types/long" "^4.0.1" - lodash.camelcase "^4.3.0" - long "^4.0.0" - protobufjs "^6.11.3" - yargs "^16.2.0" - -"@grpc/proto-loader@^0.7.13": - version "0.7.13" - resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz" - integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== - dependencies: - lodash.camelcase "^4.3.0" - long "^5.0.0" - protobufjs "^7.2.5" - yargs "^17.7.2" - "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" @@ -753,6 +677,11 @@ resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@humanwhocodes/retry@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" + integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -982,7 +911,7 @@ "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@0.3.9": @@ -1001,26 +930,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@js-sdsl/ordered-map@^4.4.2": - version "4.4.2" - resolved "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz" - integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== - -"@mapbox/node-pre-gyp@^1.0.5": - version "1.0.11" - resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz" - integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== - dependencies: - detect-libc "^2.0.0" - https-proxy-agent "^5.0.0" - make-dir "^3.1.0" - node-fetch "^2.6.7" - nopt "^5.0.0" - npmlog "^5.0.1" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.11" - "@noble/curves@1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz" @@ -1028,11 +937,26 @@ dependencies: "@noble/hashes" "1.3.2" +"@noble/hashes@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + "@noble/hashes@1.3.2": version "1.3.2" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== +"@noble/hashes@~1.1.1": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11" + integrity sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ== + +"@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" + integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -1054,6 +978,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nolyfill/is-core-module@1.0.39": + version "1.0.39" + resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" + integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== + "@opentelemetry/api@^1.4.0": version "1.9.0" resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" @@ -1064,58 +993,32 @@ resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": +"@rtsao/scc@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== +"@scure/base@~1.1.0": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== -"@protobufjs/pool@^1.1.0": +"@scure/bip32@1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" + integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== + dependencies: + "@noble/hashes" "~1.1.1" + "@noble/secp256k1" "~1.6.0" + "@scure/base" "~1.1.0" -"@protobufjs/utf8@^1.1.0": +"@scure/bip39@1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" + integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== + dependencies: + "@noble/hashes" "~1.1.1" + "@scure/base" "~1.1.0" "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -1161,10 +1064,10 @@ resolved "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz" integrity sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg== -"@typechain/ethers-v5@^11.1.2": - version "11.1.2" - resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-11.1.2.tgz" - integrity sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ== +"@typechain/ethers-v6@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz#42fe214a19a8b687086c93189b301e2b878797ea" + integrity sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA== dependencies: lodash "^4.17.15" ts-essentials "^7.0.1" @@ -1217,9 +1120,14 @@ dependencies: "@types/node" "*" +"@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/express-serve-static-core@^4.17.33": version "4.19.5" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz" integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== dependencies: "@types/node" "*" @@ -1276,20 +1184,20 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/lodash@^4.14.202": - version "4.17.7" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612" - integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== +"@types/lodash@^4.14.202": + version "4.17.9" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.9.tgz#0dc4902c229f6b8e2ac5456522104d7b1a230290" + integrity sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w== "@types/mime@^1": version "1.3.5" @@ -1303,10 +1211,10 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=13.7.0": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.1.tgz#de01dce265f6b99ed32b295962045d10b5b99560" - integrity sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw== +"@types/node@*": + version "22.7.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.4.tgz#e35d6f48dca3255ce44256ddc05dee1c23353fcc" + integrity sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg== dependencies: undici-types "~6.19.2" @@ -1316,9 +1224,9 @@ integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== "@types/node@^20.14.2": - version "20.16.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.2.tgz#9e388f503a5af306e8c63319334887390966a11e" - integrity sha512-91s/n4qUPV/wg8eE9KHYW1kouTfDk2FPGjXbBMfRWP/2vg1rCXNQL1OCabwGs0XSdukuK+MwCDXE30QpSeMUhQ== + version "20.16.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.10.tgz#0cc3fdd3daf114a4776f54ba19726a01c907ef71" + integrity sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA== dependencies: undici-types "~6.19.2" @@ -1351,7 +1259,7 @@ dependencies: "@types/node" "*" -"@types/semver@^7.3.12", "@types/semver@^7.5.0": +"@types/semver@^7.3.12": version "7.5.8" resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== @@ -1383,11 +1291,6 @@ resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== -"@types/uuid@^8.3.4": - version "8.3.4" - resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - "@types/ws@^8.5.10": version "8.5.12" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" @@ -1407,32 +1310,30 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^6.12.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz" - integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== +"@typescript-eslint/eslint-plugin@^8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz#d0070f206daad26253bf00ca5b80f9b54f9e2dd0" + integrity sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A== dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/type-utils" "6.21.0" - "@typescript-eslint/utils" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.7.0" + "@typescript-eslint/type-utils" "8.7.0" + "@typescript-eslint/utils" "8.7.0" + "@typescript-eslint/visitor-keys" "8.7.0" graphemer "^1.4.0" - ignore "^5.2.4" + ignore "^5.3.1" natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" + ts-api-utils "^1.3.0" -"@typescript-eslint/parser@^6.12.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz" - integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== +"@typescript-eslint/parser@^8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.7.0.tgz#a567b0890d13db72c7348e1d88442ea8ab4e9173" + integrity sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ== dependencies: - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/scope-manager" "8.7.0" + "@typescript-eslint/types" "8.7.0" + "@typescript-eslint/typescript-estree" "8.7.0" + "@typescript-eslint/visitor-keys" "8.7.0" debug "^4.3.4" "@typescript-eslint/scope-manager@5.62.0": @@ -1443,33 +1344,33 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz" - integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== +"@typescript-eslint/scope-manager@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz#90ee7bf9bc982b9260b93347c01a8bc2b595e0b8" + integrity sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg== dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/types" "8.7.0" + "@typescript-eslint/visitor-keys" "8.7.0" -"@typescript-eslint/type-utils@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz" - integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== +"@typescript-eslint/type-utils@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz#d56b104183bdcffcc434a23d1ce26cde5e42df93" + integrity sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ== dependencies: - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/typescript-estree" "8.7.0" + "@typescript-eslint/utils" "8.7.0" debug "^4.3.4" - ts-api-utils "^1.0.1" + ts-api-utils "^1.3.0" "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz" - integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== +"@typescript-eslint/types@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.7.0.tgz#21d987201c07b69ce7ddc03451d7196e5445ad19" + integrity sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" @@ -1484,32 +1385,29 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz" - integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== +"@typescript-eslint/typescript-estree@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz#6c7db6baa4380b937fa81466c546d052f362d0e8" + integrity sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg== dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/types" "8.7.0" + "@typescript-eslint/visitor-keys" "8.7.0" debug "^4.3.4" - globby "^11.1.0" + fast-glob "^3.3.2" is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" -"@typescript-eslint/utils@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz" - integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== +"@typescript-eslint/utils@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.7.0.tgz#cef3f70708b5b5fd7ed8672fc14714472bd8a011" + integrity sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - semver "^7.5.4" + "@typescript-eslint/scope-manager" "8.7.0" + "@typescript-eslint/types" "8.7.0" + "@typescript-eslint/typescript-estree" "8.7.0" "@typescript-eslint/utils@^5.10.0": version "5.62.0" @@ -1533,24 +1431,19 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz" - integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== +"@typescript-eslint/visitor-keys@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz#5e46f1777f9d69360a883c1a56ac3c511c9659a8" + integrity sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ== dependencies: - "@typescript-eslint/types" "6.21.0" - eslint-visitor-keys "^3.4.1" + "@typescript-eslint/types" "8.7.0" + eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -abbrev@1: - version "1.1.1" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - accepts@~1.3.8: version "1.3.8" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" @@ -1566,33 +1459,21 @@ acorn-jsx@^5.3.2: acorn-walk@^8.1.1: version "8.3.3" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz" integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== dependencies: acorn "^8.11.0" -acorn@^8.11.0, acorn@^8.4.1, acorn@^8.9.0: +acorn@^8.11.0, acorn@^8.12.0, acorn@^8.4.1, acorn@^8.9.0: version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== - aes-js@4.0.0-beta.5: version "4.0.0-beta.5" resolved "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz" integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== -agent-base@6: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" @@ -1642,19 +1523,6 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -"aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -are-we-there-yet@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" - integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - arg@^4.1.0: version "4.1.3" resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" @@ -1682,24 +1550,81 @@ array-back@^4.0.1, array-back@^4.0.2: resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -asn1.js@^4.10.1: - version "4.10.1" - resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== +array.prototype.findlastindex@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" async-mutex@^0.4.0: version "0.4.1" @@ -1708,13 +1633,6 @@ async-mutex@^0.4.0: dependencies: tslib "^2.4.0" -async-retry@^1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz" - integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== - dependencies: - retry "0.13.1" - async@^3.2.3: version "3.2.5" resolved "https://registry.npmjs.org/async/-/async-3.2.5.tgz" @@ -1725,13 +1643,12 @@ asynckit@^0.4.0: resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -awilix@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/awilix/-/awilix-4.3.4.tgz" - integrity sha512-NgRwUPxUnoK+OTRa2fXcRQVFPOPQXlwCN1FJPkhO3IHKQJHokhdVpDfgz9L3VZTcA1iSaOFE3N/Q/5P7lIDqig== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: - camel-case "^4.1.2" - glob "^7.1.6" + possible-typed-array-names "^1.0.0" awilix@^9.0.0: version "9.0.0" @@ -1845,12 +1762,12 @@ bintrees@1.0.2: resolved "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz" integrity sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: +bn.js@^4.11.9: version "4.12.0" resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.2.1: +bn.js@^5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -1895,14 +1812,14 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -brorand@^1.0.1, brorand@^1.1.0: +brorand@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browserify-aes@^1.0.4, browserify-aes@^1.2.0: +browserify-aes@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -1912,56 +1829,13 @@ browserify-aes@^1.0.4, browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.3" - resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz" - integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== - dependencies: - bn.js "^5.2.1" - browserify-rsa "^4.1.0" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.5" - hash-base "~3.0" - inherits "^2.0.4" - parse-asn1 "^5.1.7" - readable-stream "^2.3.8" - safe-buffer "^5.2.1" - browserslist@^4.23.1: - version "4.23.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" - integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + version "4.24.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" + integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== dependencies: - caniuse-lite "^1.0.30001646" - electron-to-chromium "^1.5.4" + caniuse-lite "^1.0.30001663" + electron-to-chromium "^1.5.28" node-releases "^2.0.18" update-browserslist-db "^1.1.0" @@ -1986,7 +1860,7 @@ buffer-from@^1.0.0: buffer-xor@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== buffer@6.0.3: @@ -2002,7 +1876,7 @@ bytes@3.1.2: resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -call-bind@^1.0.7: +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -2036,10 +1910,10 @@ camelcase@^6.2.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001646: - version "1.0.30001655" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz#0ce881f5a19a2dcfda2ecd927df4d5c1684b982f" - integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg== +caniuse-lite@^1.0.30001663: + version "1.0.30001664" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" + integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" @@ -2078,19 +1952,14 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - ci-info@^3.2.0: version "3.9.0" resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: +cipher-base@^1.0.0, cipher-base@^1.0.1: version "1.0.4" - resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" @@ -2101,15 +1970,6 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz" integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" @@ -2161,11 +2021,6 @@ color-string@^1.6.0: color-name "^1.0.0" simple-swizzle "^0.2.2" -color-support@^1.1.2: - version "1.1.3" - resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - color@^3.1.3: version "3.2.1" resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" @@ -2224,11 +2079,6 @@ concat-map@0.0.1: resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -console-control-strings@^1.0.0, console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - content-disposition@0.5.4: version "0.5.4" resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" @@ -2256,22 +2106,9 @@ cookie@0.6.0: resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: +create-hash@^1.1.0: version "1.2.0" - resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -2280,18 +2117,6 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - create-jest@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz" @@ -2319,22 +2144,32 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crypto-browserify@3.12.0: - version "3.12.0" - resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" debug@2.6.9: version "2.6.9" @@ -2343,19 +2178,33 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.5" resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz" integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== dependencies: ms "2.1.2" -debug@4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" dedent@^1.0.0: version "1.5.3" @@ -2377,7 +2226,7 @@ deepmerge@^4.2.2: resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -define-data-property@^1.1.4: +define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -2386,39 +2235,30 @@ define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" +define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - depd@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -des.js@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz" - integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-libc@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" @@ -2434,15 +2274,6 @@ diff@^4.0.1: resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" @@ -2450,6 +2281,13 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" @@ -2474,12 +2312,12 @@ ejs@^3.1.10: dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.4: - version "1.5.13" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" - integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== +electron-to-chromium@^1.5.28: + version "1.5.29" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz#aa592a3caa95d07cc26a66563accf99fa573a1ee" + integrity sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw== -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3: +elliptic@6.5.4: version "6.5.4" resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -2492,19 +2330,6 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -elliptic@^6.5.5: - version "6.5.5" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz" - integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - emittery@^0.13.1: version "0.13.1" resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" @@ -2525,6 +2350,14 @@ encodeurl@~1.0.2: resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +enhanced-resolve@^5.15.0: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" @@ -2532,6 +2365,58 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" @@ -2539,11 +2424,43 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.3.0: +es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" @@ -2574,6 +2491,60 @@ eslint-config-prettier@^9.0.0: resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz" integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.6.3: + version "3.6.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e" + integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA== + dependencies: + "@nolyfill/is-core-module" "1.0.39" + debug "^4.3.5" + enhanced-resolve "^5.15.0" + eslint-module-utils "^2.8.1" + fast-glob "^3.3.2" + get-tsconfig "^4.7.5" + is-bun-module "^1.0.2" + is-glob "^4.0.3" + +eslint-module-utils@^2.8.1, eslint-module-utils@^2.9.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.30.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449" + integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw== + dependencies: + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.9.0" + hasown "^2.0.2" + is-core-module "^2.15.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + eslint-plugin-jest@^27.6.0: version "27.9.0" resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz" @@ -2605,11 +2576,24 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.1.0.tgz#70214a174d4cbffbc3e8a26911d8bf51b9ae9d30" + integrity sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== +eslint-visitor-keys@^4.0.0, eslint-visitor-keys@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz#1f785cc5e81eb7534523d85922248232077d2f8c" + integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg== + eslint@^8.54.0: version "8.57.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" @@ -2654,11 +2638,71 @@ eslint@^8.54.0: strip-ansi "^6.0.1" text-table "^0.2.0" +eslint@^9.8.0: + version "9.11.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.11.1.tgz#701e5fc528990153f9cef696d8427003b5206567" + integrity sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.11.0" + "@eslint/config-array" "^0.18.0" + "@eslint/core" "^0.6.0" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.11.1" + "@eslint/plugin-kit" "^0.2.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.3.0" + "@nodelib/fs.walk" "^1.2.8" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.0.2" + eslint-visitor-keys "^4.0.0" + espree "^10.1.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +eslint_d@^14.0.4: + version "14.0.4" + resolved "https://registry.yarnpkg.com/eslint_d/-/eslint_d-14.0.4.tgz#f4c3174aa87a4a09ce90510fd24c04d816a6650c" + integrity sha512-VZuLiR03gKOCbXptTSrjfhmL4GBfGswyq2gJWUSDqMSc37XR2ryuKUtnLe1Y3+cphI7Rn7S9sHgXAFYDno3RiQ== + dependencies: + eslint "^9.8.0" + supports-color "^9.4.0" + esm@^3.2.25: version "3.2.25" resolved "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== +espree@^10.0.1, espree@^10.1.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" + integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g== + dependencies: + acorn "^8.12.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.1.0" + espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" @@ -2673,9 +2717,9 @@ esprima@^4.0.0: resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: +esquery@^1.4.2, esquery@^1.5.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -2707,41 +2751,15 @@ etag@~1.8.1: resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -ethers@^5.5.1, ethers@^5.7.2: - version "5.7.2" - resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" - integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.1" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.2" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.1" - "@ethersproject/wordlists" "5.7.0" +ethereum-cryptography@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz#74f2ac0f0f5fe79f012c889b3b8446a9a6264e6d" + integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ== + dependencies: + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.6.3" + "@scure/bip32" "1.1.0" + "@scure/bip39" "1.1.0" ethers@^6.9.0: version "6.13.1" @@ -2756,9 +2774,9 @@ ethers@^6.9.0: tslib "2.4.0" ws "8.17.1" -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: +evp_bytestokey@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" @@ -2842,7 +2860,7 @@ fast-diff@^1.1.2: resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.9, fast-glob@^3.3.1: +fast-glob@^3.2.9, fast-glob@^3.3.1, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -2894,9 +2912,16 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + filelist@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== dependencies: minimatch "^5.0.1" @@ -2953,6 +2978,14 @@ flat-cache@^3.0.4, flat-cache@^3.2.0: keyv "^4.5.3" rimraf "^3.0.2" +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + flatted@^3.2.9: version "3.3.1" resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" @@ -2968,6 +3001,13 @@ follow-redirects@^1.15.6: resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" @@ -2977,33 +3017,6 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -forta-agent@^0.1.48: - version "0.1.48" - resolved "https://registry.npmjs.org/forta-agent/-/forta-agent-0.1.48.tgz" - integrity sha512-fk3mar7/Avqg/4OHFmgv01ww/azr1XM+g5KcSnwvNxZy3KDMi7aFp1jAjPCsBjs8ZyVcR03ITUlbtFpRVgZB4Q== - dependencies: - "@grpc/grpc-js" "^1.3.6" - "@grpc/proto-loader" "^0.6.4" - "@types/uuid" "^8.3.4" - async-retry "^1.3.3" - awilix "^4.3.4" - axios "^1.6.2" - base64-arraybuffer "^1.0.2" - ethers "^5.5.1" - flat-cache "^3.0.4" - form-data "^4.0.0" - jsonc "^2.0.0" - keythereum "^1.2.0" - lodash "^4.17.21" - murmurhash3js "^3.0.1" - n-readlines "^1.0.1" - prompts "^2.4.1" - python-shell "^3.0.0" - sha3 "^2.1.4" - shelljs "^0.8.4" - uuid "^8.3.2" - yargs "^17.0.1" - forwarded@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" @@ -3028,13 +3041,6 @@ fs-extra@^7.0.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" @@ -3042,7 +3048,7 @@ fs.realpath@^1.0.0: fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: @@ -3050,20 +3056,20 @@ function-bind@^1.1.2: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -gauge@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz" - integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" - has-unicode "^2.0.1" - object-assign "^4.1.1" - signal-exit "^3.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.2" +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" @@ -3075,7 +3081,7 @@ get-caller-file@^2.0.5: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -3096,6 +3102,22 @@ get-stream@^6.0.0: resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-tsconfig@^4.7.5: + version "4.8.1" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" + integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== + dependencies: + resolve-pkg-maps "^1.0.0" + getopts@2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz" @@ -3127,7 +3149,7 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -3162,6 +3184,19 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + globby@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" @@ -3174,11 +3209,6 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -google-protobuf@3.15.8: - version "3.15.8" - resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.15.8.tgz" - integrity sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw== - gopd@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" @@ -3186,7 +3216,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -3196,32 +3226,10 @@ graphemer@^1.4.0: resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -grpc-tools@^1.12.4: - version "1.12.4" - resolved "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz" - integrity sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg== - dependencies: - "@mapbox/node-pre-gyp" "^1.0.5" - -grpc_tools_node_protoc_ts@^5.3.3: - version "5.3.3" - resolved "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz" - integrity sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww== - dependencies: - google-protobuf "3.15.8" - handlebars "4.7.7" - -handlebars@4.7.7: - version "4.7.7" - resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" @@ -3233,35 +3241,38 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.2: +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1: +has-proto@^1.0.1, has-proto@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== -has-symbols@^1.0.3: +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" -hash-base@^3.0.0, hash-base@~3.0: - version "3.0.4" - resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz" - integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" @@ -3271,7 +3282,7 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.0, hasown@^2.0.2: +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -3303,14 +3314,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - human-signals@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" @@ -3338,11 +3341,16 @@ ignore-by-default@^1.0.1: resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz" integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== -ignore@^5.2.0, ignore@^5.2.4: +ignore@^5.2.0: version "5.3.1" resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" @@ -3372,14 +3380,23 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + interpret@^1.0.0: version "1.4.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== interpret@^2.2.0: @@ -3392,6 +3409,14 @@ ipaddr.js@1.9.1: resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" @@ -3402,6 +3427,13 @@ is-arrayish@^0.3.1: resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" @@ -3409,13 +3441,47 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-core-module@^2.13.0: +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-bun-module@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.2.1.tgz#495e706f42e29f086fd5fe1ac3c51f106062b9fc" + integrity sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q== + dependencies: + semver "^7.6.3" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.15.1: version "2.15.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: hasown "^2.0.2" +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" @@ -3438,6 +3504,18 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" @@ -3448,15 +3526,58 @@ is-path-inside@^3.0.3: resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: version "2.0.0" @@ -3481,7 +3602,7 @@ istanbul-lib-instrument@^5.0.4: istanbul-lib-instrument@^6.0.0: version "6.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz" integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== dependencies: "@babel/core" "^7.23.9" @@ -3939,6 +4060,13 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + json5@^2.2.3: version "2.2.3" resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" @@ -3963,27 +4091,16 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" -keccak@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz" - integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -keythereum@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/keythereum/-/keythereum-1.2.0.tgz" - integrity sha512-u3XnjIruOmjIvJ4tH1Wdr2y0X8+z8BZTQ+dqJuDMyLvNWw6VnH9XKtt0yauSE+96Bq97h6CPm4w5LbW3i28x0g== +keythereum@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/keythereum/-/keythereum-2.0.0.tgz#d06de5511d8327f58a6451058208d6327793bb55" + integrity sha512-1l5DMKJXWb15+1PdRnv4s7lUWGuvZV2MLlIUc7bHuxO2u9Y+QAqeYYi8g3lcER23nK+Mk+icNS09PWj3UUOAlw== dependencies: - crypto-browserify "3.12.0" - keccak "3.0.1" - scrypt-js "3.0.1" - secp256k1 "4.0.2" - sjcl "1.0.6" - uuid "3.0.0" + browserify-aes "1.2.0" + ethereum-cryptography "1.1.2" + uuid "8.3.2" -keyv@^4.5.3: +keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -4074,7 +4191,7 @@ lodash@^4.17.15, lodash@^4.17.21: logform@^2.6.0, logform@^2.6.1: version "2.6.1" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" + resolved "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz" integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA== dependencies: "@colors/colors" "1.6.0" @@ -4084,16 +4201,6 @@ logform@^2.6.0, logform@^2.6.1: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" -long@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -long@^5.0.0: - version "5.2.3" - resolved "https://registry.npmjs.org/long/-/long-5.2.3.tgz" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" @@ -4113,13 +4220,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - make-dir@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" @@ -4141,7 +4241,7 @@ makeerror@1.0.12: md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" @@ -4181,14 +4281,6 @@ micromatch@^4.0.4: braces "^3.0.3" picomatch "^2.3.1" -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" @@ -4221,13 +4313,6 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -4242,31 +4327,18 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.5, minimist@^1.2.6: +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass@^3.0.0: - version "3.3.6" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" @@ -4274,7 +4346,7 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" -mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -4289,7 +4361,7 @@ ms@2.1.2, ms@^2.1.1: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@2.1.3, ms@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -4299,11 +4371,6 @@ murmurhash3js@^3.0.1: resolved "https://registry.npmjs.org/murmurhash3js/-/murmurhash3js-3.0.1.tgz" integrity sha512-KL8QYUaxq7kUbcl0Yto51rMcYt7E/4N4BG3/c96Iqw1PQrTRspu8Cpx4TZ4Nunib1d4bEkIH3gjCYlP2RLBdow== -n-readlines@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/n-readlines/-/n-readlines-1.0.1.tgz" - integrity sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -4314,11 +4381,6 @@ negotiator@0.6.3: resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.6.0: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" @@ -4327,23 +4389,6 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-gyp-build@^4.2.0: - version "4.8.1" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz" - integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" @@ -4356,7 +4401,7 @@ node-releases@^2.0.18: nodemon@^3.0.1: version "3.1.4" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.4.tgz#c34dcd8eb46a05723ccde60cbdd25addcc8725e4" + resolved "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz" integrity sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ== dependencies: chokidar "^3.5.2" @@ -4370,13 +4415,6 @@ nodemon@^3.0.1: touch "^3.1.0" undefsafe "^2.0.5" -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" @@ -4389,26 +4427,54 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npmlog@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" - integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== - dependencies: - are-we-there-yet "^2.0.0" - console-control-strings "^1.1.0" - gauge "^3.0.0" - set-blocking "^2.0.0" - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - object-inspect@^1.13.1: version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz" integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + on-finished@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" @@ -4489,18 +4555,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.7: - version "5.1.7" - resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz" - integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== - dependencies: - asn1.js "^4.10.1" - browserify-aes "^1.2.0" - evp_bytestokey "^1.0.3" - hash-base "~3.0" - pbkdf2 "^3.1.2" - safe-buffer "^5.2.1" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" @@ -4562,17 +4616,6 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pbkdf2@^3.0.3, pbkdf2@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - pg-connection-string@2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz" @@ -4600,6 +4643,11 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postinstall@^0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/postinstall/-/postinstall-0.8.0.tgz" @@ -4642,20 +4690,15 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - prom-client@^15.1.2: version "15.1.3" - resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-15.1.3.tgz#69fa8de93a88bc9783173db5f758dc1c69fa8fc2" + resolved "https://registry.npmjs.org/prom-client/-/prom-client-15.1.3.tgz" integrity sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g== dependencies: "@opentelemetry/api" "^1.4.0" tdigest "^0.1.1" -prompts@^2.0.1, prompts@^2.4.1: +prompts@^2.0.1, prompts@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -4663,43 +4706,6 @@ prompts@^2.0.1, prompts@^2.4.1: kleur "^3.0.3" sisteransi "^1.0.5" -protobufjs@^6.11.3: - version "6.11.4" - resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz" - integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -protobufjs@^7.2.5: - version "7.4.0" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" - integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" @@ -4718,18 +4724,6 @@ pstree.remy@^1.1.8: resolved "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - punycode@^2.1.0: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" @@ -4740,11 +4734,6 @@ pure-rand@^6.0.0: resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== -python-shell@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/python-shell/-/python-shell-3.0.1.tgz" - integrity sha512-TWeotuxe1auhXa5bGRScxnc2J+0r41NBntSa6RYZtMBLtAEsvCboKrEbW6DvASosWQepVkhZZlT3B5Ei766G+Q== - qs@6.11.0: version "6.11.0" resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" @@ -4757,21 +4746,6 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - range-parser@~1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" @@ -4792,19 +4766,6 @@ react-is@^18.0.0: resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -readable-stream@^2.3.8: - version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" @@ -4823,7 +4784,7 @@ readdirp@~3.6.0: rechoir@^0.6.2: version "0.6.2" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== dependencies: resolve "^1.1.6" @@ -4840,6 +4801,16 @@ reduce-flatten@^2.0.0: resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -4862,6 +4833,11 @@ resolve-from@^5.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + resolve-pkg@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz" @@ -4874,7 +4850,7 @@ resolve.exports@^2.0.0: resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.6, resolve@^1.20.0, resolve@^1.8.1: +resolve@^1.1.6, resolve@^1.20.0, resolve@^1.22.4, resolve@^1.8.1: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -4883,11 +4859,6 @@ resolve@^1.1.6, resolve@^1.20.0, resolve@^1.8.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -retry@0.13.1: - version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" @@ -4900,9 +4871,9 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -ripemd160@^2.0.0, ripemd160@^2.0.1: +ripemd160@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" @@ -4915,16 +4886,35 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1: +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@~5.1.0: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + safe-stable-stringify@^2.3.1: version "2.4.3" resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" @@ -4935,31 +4925,17 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scrypt-js@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -secp256k1@4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz" - integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== - dependencies: - elliptic "^6.5.2" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: +semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: version "7.6.2" resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== -semver@^7.6.3: +semver@^7.6.0, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -4993,11 +4969,6 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" @@ -5010,14 +4981,24 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -sha.js@^2.4.0, sha.js@^2.4.8: +sha.js@^2.4.0: version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -5042,9 +5023,9 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@^0.8.4: +shelljs@^0.8.5: version "0.8.5" - resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" @@ -5061,7 +5042,7 @@ side-channel@^1.0.4: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.0, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -5085,11 +5066,6 @@ sisteransi@^1.0.5: resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -sjcl@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/sjcl/-/sjcl-1.0.6.tgz" - integrity sha512-oUVs+hzMSWEZ3rdeDL461QilvvEU2OL9q6T42lpVi2C5Proej9obVZ1nQeY9T96NxoMy/dqw82m33MfNNEmYJg== - slash@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" @@ -5143,7 +5119,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5152,7 +5128,35 @@ string-length@^4.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string_decoder@^1.1.1, string_decoder@~1.1.1: +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string_decoder@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== @@ -5166,6 +5170,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" @@ -5202,6 +5211,11 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" +supports-color@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" + integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -5225,17 +5239,10 @@ table-layout@^1.0.2: typical "^5.2.0" wordwrapjs "^4.0.0" -tar@^6.1.11: - version "6.2.1" - resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tarn@^3.0.2: version "3.0.2" @@ -5300,19 +5307,14 @@ touch@^3.1.0: resolved "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz" integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - triple-beam@^1.3.0: version "1.4.1" resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== -ts-api-utils@^1.0.1: +ts-api-utils@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== ts-command-line-args@^2.2.0: @@ -5389,6 +5391,16 @@ ts-retry@^4.2.4: resolved "https://registry.npmjs.org/ts-retry/-/ts-retry-4.2.5.tgz" integrity sha512-dFBa4pxMBkt/bjzdBio8EwYfbAdycEAwe0KZgzlUKKwU9Wr1WErK7Hg9QLqJuDDYJXTW4KYZyXAyqYKOdO/ehA== +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + tslib@2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" @@ -5457,7 +5469,51 @@ typechain@^8.3.2: ts-command-line-args "^2.2.0" ts-essentials "^7.0.1" -typescript@^5.3.2: +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typescript@~5.5.2: version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== @@ -5472,10 +5528,15 @@ typical@^5.2.0: resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== -uglify-js@^3.1.4: - version "3.18.0" - resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz" - integrity sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" undefsafe@^2.0.5: version "2.0.5" @@ -5499,7 +5560,7 @@ unpipe@1.0.0, unpipe@~1.0.0: update-browserslist-db@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz" integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: escalade "^3.1.2" @@ -5512,7 +5573,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -5522,16 +5583,16 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz" - integrity sha512-rqE1LoOVLv3QrZMjb4NkF5UWlkurCfPyItVnFPNKDDGkHw4dQUdE4zMcLqx28+0Kcf3+bnUk4PisaiRJT4aiaQ== - -uuid@^8.3.2: +uuid@8.3.2: version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" @@ -5539,7 +5600,7 @@ v8-compile-cache-lib@^3.0.1: v8-to-istanbul@^9.0.1: version "9.3.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz" integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" @@ -5558,18 +5619,27 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" which@^2.0.1: version "2.0.2" @@ -5578,16 +5648,9 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -wide-align@^1.1.2: - version "1.1.5" - resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - winston-transport@^4.7.0: version "4.7.1" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.1.tgz#52ff1bcfe452ad89991a0aaff9c3b18e7f392569" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.1.tgz" integrity sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA== dependencies: logform "^2.6.1" @@ -5616,11 +5679,6 @@ word-wrap@^1.2.5: resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - wordwrapjs@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" @@ -5671,35 +5729,12 @@ yallist@^3.0.2: resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.0.1, yargs@^17.3.1, yargs@^17.7.2: +yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From 77c3b02aa843d17f41bdc01d4c96383eb4cdd3e5 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Thu, 10 Oct 2024 14:01:54 +0300 Subject: [PATCH 04/45] chore: reformat --- csm-alerts/.eslintrc.js | 122 ++--- csm-alerts/.prettierrc.json | 4 +- csm-alerts/README.md | 214 ++++----- csm-alerts/jest.config.js | 6 +- csm-alerts/src/entity/events.ts | 55 ++- csm-alerts/src/logger.ts | 16 +- csm-alerts/src/main.ts | 218 ++++----- .../CSAccounting/CSAccounting.srv.spec.ts | 295 ++++++------ .../services/CSAccounting/CSAccounting.srv.ts | 426 ++++++++--------- .../CSFeeDistributor.srv.spec.ts | 127 +++--- .../CSFeeDistributor/CSFeeDistributor.srv.ts | 431 ++++++++++-------- .../CSFeeOracle/CSFeeOracle.srv.spec.ts | 388 ++++++++-------- .../services/CSFeeOracle/CSFeeOracle.srv.ts | 196 ++++---- .../services/CSModule/CSModule.srv.spec.ts | 243 +++++----- .../src/services/CSModule/CSModule.srv.ts | 411 +++++++++-------- .../EventsWatcher/EventsWatcher.srv.spec.ts | 307 +++++++------ .../EventsWatcher/EventsWatcher.srv.ts | 75 ++- .../EventsWatcher/events/accounting.ts | 76 +-- .../EventsWatcher/events/assetRecoverer.ts | 140 +++--- .../EventsWatcher/events/distributor.ts | 46 +- .../services/EventsWatcher/events/module.ts | 149 +++--- .../services/EventsWatcher/events/oracle.ts | 331 +++++++------- .../services/EventsWatcher/events/pausable.ts | 44 +- .../services/EventsWatcher/events/proxies.ts | 70 +-- .../services/EventsWatcher/events/roles.ts | 52 ++- csm-alerts/src/services/constants.holesky.ts | 42 +- csm-alerts/src/services/constants.ts | 62 +-- csm-alerts/src/shared/roles.ts | 44 +- csm-alerts/src/shared/types.ts | 36 +- csm-alerts/src/utils/epochs.ts | 24 +- csm-alerts/src/utils/findings.ts | 175 +++---- csm-alerts/src/utils/logs.ts | 32 +- csm-alerts/src/utils/metrics/metrics.ts | 134 +++--- csm-alerts/src/utils/require.ts | 74 +-- csm-alerts/src/utils/string.ts | 14 +- csm-alerts/src/utils/time.ts | 78 ++-- csm-alerts/src/utils/version.ts | 34 +- 37 files changed, 2688 insertions(+), 2503 deletions(-) diff --git a/csm-alerts/.eslintrc.js b/csm-alerts/.eslintrc.js index b676bf52a..505439967 100644 --- a/csm-alerts/.eslintrc.js +++ b/csm-alerts/.eslintrc.js @@ -1,66 +1,66 @@ module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - project: 'tsconfig.json', - sourceType: 'module', - }, - settings: { - 'import/resolver': { - typescript: { - project: './tsconfig.json', - }, + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + sourceType: 'module', }, - }, - plugins: ['@typescript-eslint', 'prettier', 'import'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended', - 'plugin:import/recommended', - 'plugin:import/typescript', - ], - root: true, - env: { - node: true, - jest: true, - }, - ignorePatterns: ['.eslintrc.js'], - rules: { - '@typescript-eslint/interface-name-prefix': 'off', - '@typescript-eslint/explicit-function-return-type': 'off', - '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-empty-interface': 'off', - 'sort-imports': [ - 'error', - { - ignoreCase: false, - ignoreDeclarationSort: true, // don't want to sort import lines, use eslint-plugin-import instead - ignoreMemberSort: false, - memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'], - allowSeparatedGroups: true, - }, - ], - 'import/no-unresolved': 'error', - 'import/order': [ - 'error', - { - groups: [ - 'builtin', // Built-in imports (come from NodeJS native) go first - 'external', // <- External imports - 'internal', // <- Absolute imports - ['sibling', 'parent'], // <- Relative imports, the sibling and parent types they can be mingled together - 'index', // <- index imports - 'unknown', // <- unknown - ], - 'newlines-between': 'always', - alphabetize: { - /* sort in ascending order. Options: ["ignore", "asc", "desc"] */ - order: 'asc', - /* ignore case. Options: [true, false] */ - caseInsensitive: true, + settings: { + 'import/resolver': { + typescript: { + project: './tsconfig.json', + }, }, - }, + }, + plugins: ['@typescript-eslint', 'prettier', 'import'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + 'plugin:import/recommended', + 'plugin:import/typescript', ], - }, + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-empty-interface': 'off', + 'sort-imports': [ + 'error', + { + ignoreCase: false, + ignoreDeclarationSort: true, // don't want to sort import lines, use eslint-plugin-import instead + ignoreMemberSort: false, + memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'], + allowSeparatedGroups: true, + }, + ], + 'import/no-unresolved': 'error', + 'import/order': [ + 'error', + { + groups: [ + 'builtin', // Built-in imports (come from NodeJS native) go first + 'external', // <- External imports + 'internal', // <- Absolute imports + ['sibling', 'parent'], // <- Relative imports, the sibling and parent types they can be mingled together + 'index', // <- index imports + 'unknown', // <- unknown + ], + 'newlines-between': 'always', + alphabetize: { + /* sort in ascending order. Options: ["ignore", "asc", "desc"] */ + order: 'asc', + /* ignore case. Options: [true, false] */ + caseInsensitive: true, + }, + }, + ], + }, } diff --git a/csm-alerts/.prettierrc.json b/csm-alerts/.prettierrc.json index 852349dd9..28667141a 100644 --- a/csm-alerts/.prettierrc.json +++ b/csm-alerts/.prettierrc.json @@ -2,6 +2,6 @@ "semi": false, "trailingComma": "all", "singleQuote": true, - "printWidth": 120, - "tabWidth": 2 + "printWidth": 100, + "tabWidth": 4 } diff --git a/csm-alerts/README.md b/csm-alerts/README.md index aa6b33d6a..68cb77ead 100644 --- a/csm-alerts/README.md +++ b/csm-alerts/README.md @@ -2,133 +2,133 @@ ## Supported chains -- Holesky testnet +- Holesky testnet ## Alerts 1. **CSModule** - 1. General - 1. πŸ”΄ HIGH: EL rewards stealing penalty reported/settled/cancelled for an operator. - 2. 🟠 MEDIUM: targetLimitMode was set for an operator. - 3. 🟒 LOW: Module's share is close to the targetShare. - 4. 🟒 LOW: More than N "empty" batches in the queue. (N = 30) - 5. 🟒 LOW: More than N validators in the queue. (N = 200) - 6. πŸ”΅ INFO: Operator X was unvetted. - 7. πŸ”΅ INFO: Public release is activated. - 8. πŸ”΅ INFO: Every 100 new operators created (69th as well). - 2. Roles monitoring - 1. 🚨 CRITICAL: role change: DEFAULT_ADMIN_ROLE - 2. 🚨 CRITICAL: role change: PAUSE_ROLE - 3. 🚨 CRITICAL: role change: RESUME_ROLE - 4. 🚨 CRITICAL: role change: MODULE_MANAGER_ROLE - 5. 🚨 CRITICAL: role change: STAKING_ROUTER_ROLE - 6. 🚨 CRITICAL: role change: REPORT_EL_REWARDS_STEALING_PENALTY_ROLE - 7. 🚨 CRITICAL: role change: SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE - 8. 🚨 CRITICAL: role change: VERIFIER_ROLE - 9. 🚨 CRITICAL: role change: RECOVERER_ROLE + 1. General + 1. πŸ”΄ HIGH: EL rewards stealing penalty reported/settled/cancelled for an operator. + 2. 🟠 MEDIUM: targetLimitMode was set for an operator. + 3. 🟒 LOW: Module's share is close to the targetShare. + 4. 🟒 LOW: More than N "empty" batches in the queue. (N = 30) + 5. 🟒 LOW: More than N validators in the queue. (N = 200) + 6. πŸ”΅ INFO: Operator X was unvetted. + 7. πŸ”΅ INFO: Public release is activated. + 8. πŸ”΅ INFO: Every 100 new operators created (69th as well). + 2. Roles monitoring + 1. 🚨 CRITICAL: role change: DEFAULT_ADMIN_ROLE + 2. 🚨 CRITICAL: role change: PAUSE_ROLE + 3. 🚨 CRITICAL: role change: RESUME_ROLE + 4. 🚨 CRITICAL: role change: MODULE_MANAGER_ROLE + 5. 🚨 CRITICAL: role change: STAKING_ROUTER_ROLE + 6. 🚨 CRITICAL: role change: REPORT_EL_REWARDS_STEALING_PENALTY_ROLE + 7. 🚨 CRITICAL: role change: SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE + 8. 🚨 CRITICAL: role change: VERIFIER_ROLE + 9. 🚨 CRITICAL: role change: RECOVERER_ROLE 2. **CSAccounting** - 1. General - 1. 🟒 LOW: Average bond value for a validator is below some threshold. - 2. 🟒 LOW: Total bond lock more than some value. - 3. 🟒 LOW: sharesOf(CSAccounting.address) - CSBondCoreStorage.totalBondShares > 0.1 ether - 2. Events monitoring - 1. 🚨 CRITICAL: ChargePenaltyRecipientSet(address chargeRecipient) - 2. 🚨 CRITICAL: BondCurveUpdated(uint256 indexed curveId, uint256[] bondCurve) - 3. πŸ”΄ HIGH: BondCurveAdded(uint256[] bondCurve) - 4. πŸ”΄ HIGH: BondCurveSet(uint256 indexed nodeOperatorId, uint256 curveId) - 5. πŸ”΅ INFO: Approval(address owner, address spender, uint256 value) (stETH contract) - 3. Roles monitoring - 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE - 2. 🚨 CRITICAL: PAUSE_ROLE - 3. 🚨 CRITICAL: RESUME_ROLE - 4. 🚨 CRITICAL: ACCOUNTING_MANAGER_ROLE - 5. 🚨 CRITICAL: MANAGE_BOND_CURVES_ROLE - 6. 🚨 CRITICAL: SET_BOND_CURVE_ROLE - 7. 🚨 CRITICAL: RESET_BOND_CURVE_ROLE - 8. 🚨 CRITICAL: RECOVERER_ROLE + 1. General + 1. 🟒 LOW: Average bond value for a validator is below some threshold. + 2. 🟒 LOW: Total bond lock more than some value. + 3. 🟒 LOW: sharesOf(CSAccounting.address) - CSBondCoreStorage.totalBondShares > 0.1 ether + 2. Events monitoring + 1. 🚨 CRITICAL: ChargePenaltyRecipientSet(address chargeRecipient) + 2. 🚨 CRITICAL: BondCurveUpdated(uint256 indexed curveId, uint256[] bondCurve) + 3. πŸ”΄ HIGH: BondCurveAdded(uint256[] bondCurve) + 4. πŸ”΄ HIGH: BondCurveSet(uint256 indexed nodeOperatorId, uint256 curveId) + 5. πŸ”΅ INFO: Approval(address owner, address spender, uint256 value) (stETH contract) + 3. Roles monitoring + 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE + 2. 🚨 CRITICAL: PAUSE_ROLE + 3. 🚨 CRITICAL: RESUME_ROLE + 4. 🚨 CRITICAL: ACCOUNTING_MANAGER_ROLE + 5. 🚨 CRITICAL: MANAGE_BOND_CURVES_ROLE + 6. 🚨 CRITICAL: SET_BOND_CURVE_ROLE + 7. 🚨 CRITICAL: RESET_BOND_CURVE_ROLE + 8. 🚨 CRITICAL: RECOVERER_ROLE 3. **CSFeeOracle** - 1. General - 1. 🚨 CRITICAL: ConsensusHashContractSet(address indexed addr, address indexed prevAddr) - 2. πŸ”΄ HIGH: PerfLeewaySet(uint256 valueBP) - 3. πŸ”΄ HIGH: FeeDistributorContractSet(address feeDistributorContract) - 4. πŸ”΄ HIGH: ConsensusVersionSet(uint256 indexed version, uint256 indexed prevVersion) - 5. πŸ”΅ INFO: WarnProcessingMissed(uint256 indexed refSlot) - 6. πŸ”΅ INFO: ReportSubmitted(uint256 indexed refSlot, bytes32 hash, uint256 processingDeadlineTime) - 7. πŸ”΅ INFO: ProcessingStarted(uint256 indexed refSlot, bytes32 hash) - 2. Roles monitoring - 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE - 2. 🚨 CRITICAL: CONTRACT_MANAGER_ROLE - 3. 🚨 CRITICAL: SUBMIT_DATA_ROLE - 4. 🚨 CRITICAL: PAUSE_ROLE - 5. 🚨 CRITICAL: RESUME_ROLE - 6. 🚨 CRITICAL: RECOVERER_ROLE - 3. HashConsensus (for CSFeeOracle) - 1. Events monitoring - 1. πŸ”΄ HIGH: MemberAdded(address indexed addr, uint256 newTotalMembers, uint256 newQuorum) - 2. πŸ”΄ HIGH: MemberRemoved(address indexed addr, uint256 newTotalMembers, uint256 newQuorum) - 3. πŸ”΄ HIGH: QuorumSet(uint256 newQuorum, uint256 totalMembers, uint256 prevQuorum) - 4. πŸ”΄ HIGH: FastLaneConfigSet(uint256 fastLaneLengthSlots) - 5. πŸ”΄ HIGH: FrameConfigSet(uint256 newInitialEpoch, uint256 newEpochsPerFrame) - 6. πŸ”΄ HIGH: ReportProcessorSet(address indexed processor, address indexed prevProcessor) - 7. πŸ”΄ HIGH: another report variant appeared (alternative hash) event ReportReceived(uint256 indexed refSlot, address indexed member, bytes32 report) - 8. πŸ”΄ HIGH: ConsensusLost(uint256 indexed refSlot) - 9. πŸ”΅ INFO: ConsensusReached(uint256 indexed refSlot, bytes32 report, uint256 support) - 2. Roles monitoring - 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE - 2. 🚨 CRITICAL: DISABLE_CONSENSUS_ROLE - 3. 🚨 CRITICAL: MANAGE_MEMBERS_AND_QUORUM_ROLE - 4. 🚨 CRITICAL: MANAGE_FRAME_CONFIG_ROLE - 5. 🚨 CRITICAL: MANAGE_FAST_LANE_CONFIG_ROLE - 6. 🚨 CRITICAL: MANAGE_REPORT_PROCESSOR_ROLE + 1. General + 1. 🚨 CRITICAL: ConsensusHashContractSet(address indexed addr, address indexed prevAddr) + 2. πŸ”΄ HIGH: PerfLeewaySet(uint256 valueBP) + 3. πŸ”΄ HIGH: FeeDistributorContractSet(address feeDistributorContract) + 4. πŸ”΄ HIGH: ConsensusVersionSet(uint256 indexed version, uint256 indexed prevVersion) + 5. πŸ”΅ INFO: WarnProcessingMissed(uint256 indexed refSlot) + 6. πŸ”΅ INFO: ReportSubmitted(uint256 indexed refSlot, bytes32 hash, uint256 processingDeadlineTime) + 7. πŸ”΅ INFO: ProcessingStarted(uint256 indexed refSlot, bytes32 hash) + 2. Roles monitoring + 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE + 2. 🚨 CRITICAL: CONTRACT_MANAGER_ROLE + 3. 🚨 CRITICAL: SUBMIT_DATA_ROLE + 4. 🚨 CRITICAL: PAUSE_ROLE + 5. 🚨 CRITICAL: RESUME_ROLE + 6. 🚨 CRITICAL: RECOVERER_ROLE + 3. HashConsensus (for CSFeeOracle) + 1. Events monitoring + 1. πŸ”΄ HIGH: MemberAdded(address indexed addr, uint256 newTotalMembers, uint256 newQuorum) + 2. πŸ”΄ HIGH: MemberRemoved(address indexed addr, uint256 newTotalMembers, uint256 newQuorum) + 3. πŸ”΄ HIGH: QuorumSet(uint256 newQuorum, uint256 totalMembers, uint256 prevQuorum) + 4. πŸ”΄ HIGH: FastLaneConfigSet(uint256 fastLaneLengthSlots) + 5. πŸ”΄ HIGH: FrameConfigSet(uint256 newInitialEpoch, uint256 newEpochsPerFrame) + 6. πŸ”΄ HIGH: ReportProcessorSet(address indexed processor, address indexed prevProcessor) + 7. πŸ”΄ HIGH: another report variant appeared (alternative hash) event ReportReceived(uint256 indexed refSlot, address indexed member, bytes32 report) + 8. πŸ”΄ HIGH: ConsensusLost(uint256 indexed refSlot) + 9. πŸ”΅ INFO: ConsensusReached(uint256 indexed refSlot, bytes32 report, uint256 support) + 2. Roles monitoring + 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE + 2. 🚨 CRITICAL: DISABLE_CONSENSUS_ROLE + 3. 🚨 CRITICAL: MANAGE_MEMBERS_AND_QUORUM_ROLE + 4. 🚨 CRITICAL: MANAGE_FRAME_CONFIG_ROLE + 5. 🚨 CRITICAL: MANAGE_FAST_LANE_CONFIG_ROLE + 6. 🚨 CRITICAL: MANAGE_REPORT_PROCESSOR_ROLE 4. **CSFeeDistributor** - 1. Events monitoring - 1. 🚨 CRITICAL: Receiver of TransferShares is NOT CSAccounting, if from is CSFeeDistributor - 2. πŸ”΄ HIGH: No fees distributed for X days (repeat every 1 day). - 3. πŸ”΅ INFO: DistributionDataUpdated -> Oracle settled a new report. - 2. Roles monitoring - 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE - 2. 🚨 CRITICAL: RECOVERER_ROLE + 1. Events monitoring + 1. 🚨 CRITICAL: Receiver of TransferShares is NOT CSAccounting, if from is CSFeeDistributor + 2. πŸ”΄ HIGH: No fees distributed for X days (repeat every 1 day). + 3. πŸ”΅ INFO: DistributionDataUpdated -> Oracle settled a new report. + 2. Roles monitoring + 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE + 2. 🚨 CRITICAL: RECOVERER_ROLE 5. **CSEarlyAdoption** - - _To be added_ + - _To be added_ 6. **OssifiableProxy** For the following contracts: - - CSModule - - CSAccounting - - CSFeeOracle - - CSFeeDistributor + - CSModule + - CSAccounting + - CSFeeOracle + - CSFeeDistributor - 1. 🚨 CRITICAL: event ProxyOssified() - 2. 🚨 CRITICAL: event Upgraded(address indexed implementation) - 3. 🚨 CRITICAL: event AdminChanged(address previousAdmin, address newAdmin) + 1. 🚨 CRITICAL: event ProxyOssified() + 2. 🚨 CRITICAL: event Upgraded(address indexed implementation) + 3. 🚨 CRITICAL: event AdminChanged(address previousAdmin, address newAdmin) 7. **PausableUntil** For the following contracts: - - CSModule - - CSAccounting - - CSFeeOracle + - CSModule + - CSAccounting + - CSFeeOracle - 1. 🚨 CRITICAL: Paused(uint256 duration); - 2. 🚨 CRITICAL: Resumed(); + 1. 🚨 CRITICAL: Paused(uint256 duration); + 2. 🚨 CRITICAL: Resumed(); 8. **AssetRecoverer** For the following contracts: - - CSModule - - CSAccounting - - CSFeeOracle - - CSFeeDistributor + - CSModule + - CSAccounting + - CSFeeOracle + - CSFeeDistributor - 1. πŸ”΄ HIGH: EtherRecovered() - 2. πŸ”΄ HIGH: ERC20Recovered() - 3. πŸ”΄ HIGH: StETHSharesRecovered() - 4. πŸ”΄ HIGH: ERC721Recovered() - 5. πŸ”΄ HIGH: ERC1155Recovered() + 1. πŸ”΄ HIGH: EtherRecovered() + 2. πŸ”΄ HIGH: ERC20Recovered() + 3. πŸ”΄ HIGH: StETHSharesRecovered() + 4. πŸ”΄ HIGH: ERC721Recovered() + 5. πŸ”΄ HIGH: ERC1155Recovered() ## Development (Forta specific) @@ -150,12 +150,12 @@ docker-compose up -d 1. For testing alerts you have to install promtool on your machine. - ``` - make tools - ``` + ``` + make tools + ``` 2. Check alerts - ``` - make test_alerts - ``` + ``` + make test_alerts + ``` diff --git a/csm-alerts/jest.config.js b/csm-alerts/jest.config.js index 9dfeb5d27..9f75bb051 100644 --- a/csm-alerts/jest.config.js +++ b/csm-alerts/jest.config.js @@ -1,6 +1,6 @@ /** @type {import("ts-jest").JestConfigWithTsJest} */ module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - testPathIgnorePatterns: ['dist'], + preset: 'ts-jest', + testEnvironment: 'node', + testPathIgnorePatterns: ['dist'], } diff --git a/csm-alerts/src/entity/events.ts b/csm-alerts/src/entity/events.ts index 29d447ae5..5aea48089 100644 --- a/csm-alerts/src/entity/events.ts +++ b/csm-alerts/src/entity/events.ts @@ -3,35 +3,40 @@ import { Finding, TransactionEvent, ethers } from '@fortanetwork/forta-bot' import { EventOfNotice } from '../shared/types' import { sourceFromEvent } from '../utils/findings' -export function handleEventsOfNotice(txEvent: TransactionEvent, eventsOfNotice: EventOfNotice[]): Finding[] { - const out: Finding[] = [] +export function handleEventsOfNotice( + txEvent: TransactionEvent, + eventsOfNotice: EventOfNotice[], +): Finding[] { + const out: Finding[] = [] - for (const log of txEvent.logs) { - for (const eventInfo of eventsOfNotice) { - if (log.address.toLowerCase() != eventInfo.address.toLowerCase()) { - continue - } + for (const log of txEvent.logs) { + for (const eventInfo of eventsOfNotice) { + if (log.address.toLowerCase() != eventInfo.address.toLowerCase()) { + continue + } - const parser = new ethers.Interface(typeof eventInfo.abi === 'string' ? [eventInfo.abi] : eventInfo.abi) - const logDesc = parser.parseLog(log) - if (!logDesc) { - continue - } + const parser = new ethers.Interface( + typeof eventInfo.abi === 'string' ? [eventInfo.abi] : eventInfo.abi, + ) + const logDesc = parser.parseLog(log) + if (!logDesc) { + continue + } - const f = Finding.fromObject({ - name: eventInfo.name, - description: eventInfo.description(logDesc.args), - alertId: eventInfo.alertId, - severity: eventInfo.severity, - type: eventInfo.type, - source: sourceFromEvent(txEvent), - addresses: Object.keys(txEvent.addresses), - metadata: { args: String(logDesc.args) }, - }) + const f = Finding.fromObject({ + name: eventInfo.name, + description: eventInfo.description(logDesc.args), + alertId: eventInfo.alertId, + severity: eventInfo.severity, + type: eventInfo.type, + source: sourceFromEvent(txEvent), + addresses: Object.keys(txEvent.addresses), + metadata: { args: String(logDesc.args) }, + }) - out.push(f) + out.push(f) + } } - } - return out + return out } diff --git a/csm-alerts/src/logger.ts b/csm-alerts/src/logger.ts index 2b4747892..fd7305393 100644 --- a/csm-alerts/src/logger.ts +++ b/csm-alerts/src/logger.ts @@ -3,12 +3,12 @@ import * as Winston from 'winston' import { LOG_FORMAT, LOG_LEVEL } from './config' export function getLogger(service: string) { - return Winston.createLogger({ - format: Winston.format.combine( - Winston.format.label({ label: service, message: true }), - LOG_FORMAT === 'simple' ? Winston.format.simple() : Winston.format.json(), - ), - transports: [new Winston.transports.Console()], - level: LOG_LEVEL, - }) + return Winston.createLogger({ + format: Winston.format.combine( + Winston.format.label({ label: service, message: true }), + LOG_FORMAT === 'simple' ? Winston.format.simple() : Winston.format.json(), + ), + transports: [new Winston.transports.Console()], + level: LOG_LEVEL, + }) } diff --git a/csm-alerts/src/main.ts b/csm-alerts/src/main.ts index a2b8450cc..e999b8427 100644 --- a/csm-alerts/src/main.ts +++ b/csm-alerts/src/main.ts @@ -1,11 +1,11 @@ import { - BlockEvent, - Finding, - TransactionEvent, - ethers, - getProvider, - isProduction, - scanEthereum, + BlockEvent, + Finding, + TransactionEvent, + ethers, + getProvider, + isProduction, + scanEthereum, } from '@fortanetwork/forta-bot' import { RPC_URL } from './config' @@ -20,126 +20,126 @@ import { errorAlert, launchAlert } from './utils/findings' const logger = getLogger('main') async function main() { - const { handleTransaction, handleBlock } = await getHandlers() + const { handleTransaction, handleBlock } = await getHandlers() - scanEthereum({ - handleTransaction, - handleBlock, - rpcUrl: RPC_URL, - }) + scanEthereum({ + handleTransaction, + handleBlock, + rpcUrl: RPC_URL, + }) - if (!isProduction) { - return - } + if (!isProduction) { + return + } - // Run metrics server here if needed. + // Run metrics server here if needed. } if (require.main === module) { - main().catch(logger.error) + main().catch(logger.error) } async function getHandlers() { - const { blockIdentifier } = await parseArgs() - - const services = [ - new CSFeeDistributorSrv(), - new EventsWatcherSrv(), - new CSAccountingSrv(), - new CSFeeOracleSrv(), - new CSModuleSrv(), - ] - - for (const srv of services) { - if ('initialize' in srv) { - await srv.initialize( - blockIdentifier ?? 'latest', - await getProvider({ - rpcUrl: RPC_URL, - }), - ) - } - } - - logger.debug('Initialization complete') - let isLaunchReported = false - - async function handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider) { - // prettier-ignore - const results = await Promise.allSettled( - services.filter((srv) => 'handleTransaction' in srv) - .map((srv) => srv.handleTransaction(txEvent, provider)), - ) - - const out: Finding[] = [] - for (const r of results) { - if (r.status === 'fulfilled') { - out.push(...r.value) - } else { - // TODO: Some exceptions should crash an application in fact. - // out.push(errorAlert(`Error processing tx ${txEvent.transaction.hash}`, r.reason)) - logger.error(r.reason) - } - } - return out - } - - async function handleBlock(blockEvent: BlockEvent, provider: ethers.Provider) { - logger.debug(`Running handlers for block ${blockEvent.blockNumber}`) - - // prettier-ignore - const results = await Promise.allSettled( - services.filter((srv) => 'handleBlock' in srv) - .map((srv) => srv.handleBlock(blockEvent, provider)), - ) - - const out: Finding[] = [] - for (const r of results) { - if (r.status === 'fulfilled') { - out.push(...r.value) - } else { - // TODO: Some exceptions should crash an application in fact. - // out.push(errorAlert(`Error processing block ${blockEvent.block.hash}`, r.reason)) - logger.error(r.reason) - } + const { blockIdentifier } = await parseArgs() + + const services = [ + new CSFeeDistributorSrv(), + new EventsWatcherSrv(), + new CSAccountingSrv(), + new CSFeeOracleSrv(), + new CSModuleSrv(), + ] + + for (const srv of services) { + if ('initialize' in srv) { + await srv.initialize( + blockIdentifier ?? 'latest', + await getProvider({ + rpcUrl: RPC_URL, + }), + ) + } } - if (!isLaunchReported) { - out.push(launchAlert()) - isLaunchReported = true + logger.debug('Initialization complete') + let isLaunchReported = false + + async function handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider) { + const results = await Promise.allSettled( + services + .filter((srv) => 'handleTransaction' in srv) + .map((srv) => srv.handleTransaction(txEvent, provider)), + ) + + const out: Finding[] = [] + for (const r of results) { + if (r.status === 'fulfilled') { + out.push(...r.value) + } else { + // TODO: Some exceptions should crash an application in fact. + // out.push(errorAlert(`Error processing tx ${txEvent.transaction.hash}`, r.reason)) + logger.error(r.reason) + } + } + return out } - return out - } + async function handleBlock(blockEvent: BlockEvent, provider: ethers.Provider) { + logger.debug(`Running handlers for block ${blockEvent.blockNumber}`) + + const results = await Promise.allSettled( + services + .filter((srv) => 'handleBlock' in srv) + .map((srv) => srv.handleBlock(blockEvent, provider)), + ) + + const out: Finding[] = [] + for (const r of results) { + if (r.status === 'fulfilled') { + out.push(...r.value) + } else { + // TODO: Some exceptions should crash an application in fact. + // out.push(errorAlert(`Error processing block ${blockEvent.block.hash}`, r.reason)) + logger.error(r.reason) + } + } + + if (!isLaunchReported) { + out.push(launchAlert()) + isLaunchReported = true + } + + return out + } - return { - handleTransaction, - handleBlock, - } + return { + handleTransaction, + handleBlock, + } } async function parseArgs() { - let blockIdentifier: string | number | undefined = process.env['FORTA_CLI_BLOCK'] - if (blockIdentifier && !blockIdentifier.startsWith('0x')) { - blockIdentifier = parseInt(blockIdentifier) - } - - const txIdentifier = process.env['FORTA_CLI_TX'] - if (txIdentifier) { - const provider = await getProvider({ - rpcUrl: RPC_URL, - }) - - const tx = await provider.getTransaction(txIdentifier) - if (!tx?.blockHash) { - throw Error(`Transaction ${txIdentifier} not mined`) + let blockIdentifier: string | number | undefined = process.env['FORTA_CLI_BLOCK'] + if (blockIdentifier && !blockIdentifier.startsWith('0x')) { + blockIdentifier = parseInt(blockIdentifier) } - blockIdentifier = tx.blockHash - } + const txIdentifier = process.env['FORTA_CLI_TX'] + if (txIdentifier) { + const provider = await getProvider({ + rpcUrl: RPC_URL, + }) + + const tx = await provider.getTransaction(txIdentifier) + if (!tx?.blockHash) { + throw Error(`Transaction ${txIdentifier} not mined`) + } - return { - blockIdentifier, - txIdentifier, - } + blockIdentifier = tx.blockHash + } + + return { + blockIdentifier, + txIdentifier, + } } diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts index 71344945c..a103fc514 100644 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts @@ -2,10 +2,10 @@ import { DeploymentAddress, DeploymentAddresses } from '../../utils/constants.ho import { expect } from '@jest/globals' import { TransactionDto } from '../../entity/events' import { - CSModule__factory, - CSAccounting__factory, - CSFeeDistributor__factory, - CSFeeOracle__factory, + CSModule__factory, + CSAccounting__factory, + CSFeeDistributor__factory, + CSFeeOracle__factory, } from '../../generated/typechain' import { getCSAccountingEvents } from '../../utils/events/cs_accounting_events' import { CSAccountingSrv, ICSAccountingClient } from './CSAccounting.srv' @@ -19,147 +19,156 @@ import { Metrics } from '../../utils/metrics/metrics' const TEST_TIMEOUT = 120_000 // ms describe('CSAccounting event tests', () => { - const chainId = 17000 - - const logger: Winston.Logger = Winston.createLogger({ - format: Winston.format.simple(), - transports: [new Winston.transports.Console()], - }) - - const address: DeploymentAddress = DeploymentAddresses - - const fortaEthersProvider = new ethers.providers.JsonRpcProvider(getFortaConfig().jsonRpcUrl, chainId) - const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) - const csAccountingRunner = CSAccounting__factory.connect(address.CS_ACCOUNTING_ADDRESS, fortaEthersProvider) - const csFeeDistributorRunner = CSFeeDistributor__factory.connect( - address.CS_FEE_DISTRIBUTOR_ADDRESS, - fortaEthersProvider, - ) - const csFeeOracleRunner = CSFeeOracle__factory.connect(address.CS_FEE_ORACLE_ADDRESS, fortaEthersProvider) - - const registry = new promClient.Registry() - const m = new Metrics(registry, 'test_') - - const csAccountingClient: ICSAccountingClient = new ETHProvider( - logger, - m, - fortaEthersProvider, - csModuleRunner, - csAccountingRunner, - csFeeDistributorRunner, - csFeeOracleRunner, - ) - - const csAccountingSrv = new CSAccountingSrv( - logger, - csAccountingClient, - getCSAccountingEvents(address.CS_ACCOUNTING_ADDRESS), - address.CS_ACCOUNTING_ADDRESS, - address.LIDO_STETH_ADDRESS, - address.CS_MODULE_ADDRESS, - ) - - test( - '🚨 CSAccounting: Bond Curve Updated', - async () => { - const txHash = '0x8b904da83d58e520c778cc562b10fa4e0943a9f991b9050d93481fdabf2da9c2' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + const chainId = 17000 + + const logger: Winston.Logger = Winston.createLogger({ + format: Winston.format.simple(), + transports: [new Winston.transports.Console()], + }) + + const address: DeploymentAddress = DeploymentAddresses + + const fortaEthersProvider = new ethers.providers.JsonRpcProvider( + getFortaConfig().jsonRpcUrl, + chainId, + ) + const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) + const csAccountingRunner = CSAccounting__factory.connect( + address.CS_ACCOUNTING_ADDRESS, + fortaEthersProvider, + ) + const csFeeDistributorRunner = CSFeeDistributor__factory.connect( + address.CS_FEE_DISTRIBUTOR_ADDRESS, + fortaEthersProvider, + ) + const csFeeOracleRunner = CSFeeOracle__factory.connect( + address.CS_FEE_ORACLE_ADDRESS, + fortaEthersProvider, + ) + + const registry = new promClient.Registry() + const m = new Metrics(registry, 'test_') + + const csAccountingClient: ICSAccountingClient = new ETHProvider( + logger, + m, + fortaEthersProvider, + csModuleRunner, + csAccountingRunner, + csFeeDistributorRunner, + csFeeOracleRunner, + ) + + const csAccountingSrv = new CSAccountingSrv( + logger, + csAccountingClient, + getCSAccountingEvents(address.CS_ACCOUNTING_ADDRESS), + address.CS_ACCOUNTING_ADDRESS, + address.LIDO_STETH_ADDRESS, + address.CS_MODULE_ADDRESS, + ) + + test( + '🚨 CSAccounting: Bond Curve Updated', + async () => { + const txHash = '0x8b904da83d58e520c778cc562b10fa4e0943a9f991b9050d93481fdabf2da9c2' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = await csAccountingSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) }, - hash: trx.hash, - } - - const results = await csAccountingSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ CSAccounting: Bond Curve added, stETH Approval', - async () => { - const txHash = '0xcc92653babec3b1748d8e04de777796cab2d1ae40fbe926db857e9103a9b74a5' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ CSAccounting: Bond Curve added, stETH Approval', + async () => { + const txHash = '0xcc92653babec3b1748d8e04de777796cab2d1ae40fbe926db857e9103a9b74a5' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = await csAccountingSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(4) }, - hash: trx.hash, - } - - const results = await csAccountingSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(4) - }, - TEST_TIMEOUT, - ) - - test( - '🚨 CSAccounting: Charge Penalty Recipient Set', - async () => { - const txHash = '0xf62269919009e1cb9c6ea8c29cb6c83f9c1d113d97d401ed5ff2b696cee6d82f' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + '🚨 CSAccounting: Charge Penalty Recipient Set', + async () => { + const txHash = '0xf62269919009e1cb9c6ea8c29cb6c83f9c1d113d97d401ed5ff2b696cee6d82f' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = await csAccountingSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) }, - hash: trx.hash, - } - - const results = await csAccountingSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ CSAccounting: Bond Curve Set', - async () => { - const txHash = '0xcea4d214c8f6e4f3415fc941fdb6802f4243a7b3e12ba5288cf7e7df39d457a0' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ CSAccounting: Bond Curve Set', + async () => { + const txHash = '0xcea4d214c8f6e4f3415fc941fdb6802f4243a7b3e12ba5288cf7e7df39d457a0' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = await csAccountingSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) }, - hash: trx.hash, - } - - const results = await csAccountingSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) + TEST_TIMEOUT, + ) }) diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts index 604dd404c..e4c63a066 100644 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts @@ -1,11 +1,11 @@ import { - BlockEvent, - Finding, - FindingSeverity, - FindingType, - TransactionEvent, - ethers, - filterLog, + BlockEvent, + Finding, + FindingSeverity, + FindingType, + TransactionEvent, + ethers, + filterLog, } from '@fortanetwork/forta-bot' import { Logger } from 'winston' @@ -18,7 +18,11 @@ import { RedefineMode, requireWithTier } from '../../utils/require' import { formatEther } from '../../utils/string' import * as Constants from '../constants' -const { DEPLOYED_ADDRESSES } = requireWithTier(module, '../constants', RedefineMode.Merge) +const { DEPLOYED_ADDRESSES } = requireWithTier( + module, + '../constants', + RedefineMode.Merge, +) const CHECK_ACCOUNTING_INTERVAL_BLOCKS = 301 // ~ every hour const CHECK_OPERATORS_INTERVAL_BLOCKS = 2401 // ~ 3 times a day @@ -29,216 +33,228 @@ const CURVE_EARLY_ADOPTION_ID = 1n const CURVE_DEFAULT_ID = 0n export class CSAccountingSrv { - private readonly logger: Logger - - private lastFiredAt = { - accountingExcessShares: 0, - totalLockAlert: 0, - avgBondAlert: 0, - } - - constructor() { - this.logger = getLogger(CSAccountingSrv.name) - } - - async handleBlock(blockEvent: BlockEvent, provider: ethers.Provider): Promise { - return [ - ...(await this.checkAccountingSharesDiscrepancy(blockEvent, provider)), - ...(await this.handleBondAndLockValues(blockEvent, provider)), - ] - } - - public async handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider): Promise { - return [...this.handleStETHApprovalEvents(txEvent), ...this.handleSetBondCurveEvent(txEvent)] - } - - public async handleBondAndLockValues(blockEvent: BlockEvent, provider: ethers.Provider): Promise { - if (blockEvent.blockNumber % CHECK_OPERATORS_INTERVAL_BLOCKS !== 0 && !IS_CLI) { - return [] - } - - const accounting = CSAccounting__factory.connect(DEPLOYED_ADDRESSES.CS_ACCOUNTING, provider) - const csm = CSModule__factory.connect(DEPLOYED_ADDRESSES.CS_MODULE, provider) - const ethCallOpts = { blockTag: blockEvent.blockHash } - - const operatorsCount = await csm.getNodeOperatorsCount(ethCallOpts) - this.logger.debug(`Total operators count: ${operatorsCount}`) - - let totalValidators = 0n - let totalBondWei = 0n - let totalLockWei = 0n + private readonly logger: Logger - for (let noId = 0; noId < operatorsCount; noId++) { - totalValidators += await csm.getNodeOperatorNonWithdrawnKeys(noId, ethCallOpts) - totalBondWei += (await accounting.getBondSummary(noId, ethCallOpts)).current - totalLockWei += await accounting.getActualLockedBond(noId, ethCallOpts) - } - this.logger.debug(`Read ${operatorsCount} operators info`) - - const avgBondWei = totalBondWei / totalValidators - - this.logger.debug(`Averave bond is ${formatEther(avgBondWei)}`) - this.logger.debug(`Total bond is ${formatEther(totalBondWei)}`) - this.logger.debug(`Total lock is ${formatEther(totalLockWei)}`) - - const now = blockEvent.block.timestamp - const out: Finding[] = [] - - if (now - this.lastFiredAt.avgBondAlert > SECONDS_PER_DAY) { - if (avgBondWei < BOND_AVG_WEI_MIN) { - const f = Finding.fromObject({ - name: `🟒 CSAccounting: Average bond value for a validator is below threshold.`, - description: `Average bond value for a validator is less than ${formatEther(BOND_AVG_WEI_MIN)}`, - alertId: 'CS-ACCOUNTING-AVERAGE-BOND-VALUE', - // source: sourceFromEvent(blockEvent), - severity: FindingSeverity.Low, - type: FindingType.Info, - }) - - out.push(f) - this.lastFiredAt.avgBondAlert = now - } + private lastFiredAt = { + accountingExcessShares: 0, + totalLockAlert: 0, + avgBondAlert: 0, } - if (now - this.lastFiredAt.totalLockAlert > SECONDS_PER_DAY) { - if (totalLockWei > LOCK_TOTAL_WEI_MAX) { - const f = Finding.fromObject({ - name: `🟒 Total bond lock exceeds threshold.`, - description: `Total bond lock is more than ${formatEther(LOCK_TOTAL_WEI_MAX)}`, - alertId: 'CS-ACCOUNTING-TOTAL-BOND-LOCK', - // NOTE: Do not include the source to reach quorum. - // source: sourceFromEvent(blockEvent), - severity: FindingSeverity.Low, - type: FindingType.Info, - }) - - out.push(f) - this.lastFiredAt.totalLockAlert = now - } + constructor() { + this.logger = getLogger(CSAccountingSrv.name) } - return out - } - - async checkAccountingSharesDiscrepancy(blockEvent: BlockEvent, provider: ethers.Provider): Promise { - if (blockEvent.blockNumber % CHECK_ACCOUNTING_INTERVAL_BLOCKS !== 0 && !IS_CLI) { - return [] + async handleBlock(blockEvent: BlockEvent, provider: ethers.Provider): Promise { + return [ + ...(await this.checkAccountingSharesDiscrepancy(blockEvent, provider)), + ...(await this.handleBondAndLockValues(blockEvent, provider)), + ] } - const accounting = CSAccounting__factory.connect(DEPLOYED_ADDRESSES.CS_ACCOUNTING, provider) - const steth = Lido__factory.connect(DEPLOYED_ADDRESSES.LIDO_STETH, provider) - - const totalBondShares = await accounting.totalBondShares({ blockTag: blockEvent.blockHash }) - const actualBalance = await steth.sharesOf(accounting, { blockTag: blockEvent.blockHash }) - const diff = totalBondShares - actualBalance - - const now = blockEvent.block.timestamp - const out: Finding[] = [] - - if (now - this.lastFiredAt.accountingExcessShares > SECONDS_PER_DAY) { - if (diff > ACCOUNTING_BALANCE_EXCESS_SHARES_MAX) { - const f = Finding.fromObject({ - name: `🟒 Shares to recover on CSAccounting.`, - description: `There's a valuable amount of shares to recover on CSAccounting.`, - alertId: 'CS-ACCOUNTING-EXCESS-SHARES', - // NOTE: Do not include the source to reach quorum. - // source: sourceFromEvent(blockEvent), - severity: FindingSeverity.Low, - type: FindingType.Info, - }) - out.push(f) - this.lastFiredAt.accountingExcessShares = now - } + public async handleTransaction( + txEvent: TransactionEvent, + provider: ethers.Provider, + ): Promise { + return [ + ...this.handleStETHApprovalEvents(txEvent), + ...this.handleSetBondCurveEvent(txEvent), + ] } - // NOTE: This is a critical invariant, so we fire every CHECK_ACCOUNTING_INTERVAL_BLOCKS. - if (diff < 0n) { - const f = Finding.fromObject({ - name: '🚨 Not enough shares on CSAccounting', - description: 'sharesOf(CSAccounting) < CSAccounting.totalBondShares', - alertId: 'CS-ACCOUNTING-NOT-ENOUGH-SHARES', - // NOTE: Do not include the source to reach quorum. - // source: sourceFromEvent(blockEvent), - severity: FindingSeverity.Critical, - type: FindingType.Info, - }) - out.push(f) + public async handleBondAndLockValues( + blockEvent: BlockEvent, + provider: ethers.Provider, + ): Promise { + if (blockEvent.blockNumber % CHECK_OPERATORS_INTERVAL_BLOCKS !== 0 && !IS_CLI) { + return [] + } + + const accounting = CSAccounting__factory.connect(DEPLOYED_ADDRESSES.CS_ACCOUNTING, provider) + const csm = CSModule__factory.connect(DEPLOYED_ADDRESSES.CS_MODULE, provider) + const ethCallOpts = { blockTag: blockEvent.blockHash } + + const operatorsCount = await csm.getNodeOperatorsCount(ethCallOpts) + this.logger.debug(`Total operators count: ${operatorsCount}`) + + let totalValidators = 0n + let totalBondWei = 0n + let totalLockWei = 0n + + for (let noId = 0; noId < operatorsCount; noId++) { + totalValidators += await csm.getNodeOperatorNonWithdrawnKeys(noId, ethCallOpts) + totalBondWei += (await accounting.getBondSummary(noId, ethCallOpts)).current + totalLockWei += await accounting.getActualLockedBond(noId, ethCallOpts) + } + this.logger.debug(`Read ${operatorsCount} operators info`) + + const avgBondWei = totalBondWei / totalValidators + + this.logger.debug(`Averave bond is ${formatEther(avgBondWei)}`) + this.logger.debug(`Total bond is ${formatEther(totalBondWei)}`) + this.logger.debug(`Total lock is ${formatEther(totalLockWei)}`) + + const now = blockEvent.block.timestamp + const out: Finding[] = [] + + if (now - this.lastFiredAt.avgBondAlert > SECONDS_PER_DAY) { + if (avgBondWei < BOND_AVG_WEI_MIN) { + const f = Finding.fromObject({ + name: `🟒 CSAccounting: Average bond value for a validator is below threshold.`, + description: `Average bond value for a validator is less than ${formatEther(BOND_AVG_WEI_MIN)}`, + alertId: 'CS-ACCOUNTING-AVERAGE-BOND-VALUE', + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) + + out.push(f) + this.lastFiredAt.avgBondAlert = now + } + } + + if (now - this.lastFiredAt.totalLockAlert > SECONDS_PER_DAY) { + if (totalLockWei > LOCK_TOTAL_WEI_MAX) { + const f = Finding.fromObject({ + name: `🟒 Total bond lock exceeds threshold.`, + description: `Total bond lock is more than ${formatEther(LOCK_TOTAL_WEI_MAX)}`, + alertId: 'CS-ACCOUNTING-TOTAL-BOND-LOCK', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) + + out.push(f) + this.lastFiredAt.totalLockAlert = now + } + } + + return out } - return out - } - - // TODO: Does it makes sense for us at all? - handleStETHApprovalEvents(txEvent: TransactionEvent): Finding[] { - const approvalEvents = filterLog( - txEvent.logs, - Lido__factory.createInterface().getEvent('TransferShares').format('full'), - DEPLOYED_ADDRESSES.LIDO_STETH, - ) - - const out: Finding[] = [] - for (const event of approvalEvents) { - if (event.args.owner === DEPLOYED_ADDRESSES.CS_ACCOUNTING) { - const f = Finding.fromObject({ - name: `πŸ”΅ Lido stETH: Approval`, - description: `${event.args.spender} received allowance from ${event.args.owner} to ${event.args.value}`, - alertId: 'STETH-APPROVAL', - source: sourceFromEvent(txEvent), - severity: FindingSeverity.Low, - type: FindingType.Info, - }) - out.push(f) - } + async checkAccountingSharesDiscrepancy( + blockEvent: BlockEvent, + provider: ethers.Provider, + ): Promise { + if (blockEvent.blockNumber % CHECK_ACCOUNTING_INTERVAL_BLOCKS !== 0 && !IS_CLI) { + return [] + } + + const accounting = CSAccounting__factory.connect(DEPLOYED_ADDRESSES.CS_ACCOUNTING, provider) + const steth = Lido__factory.connect(DEPLOYED_ADDRESSES.LIDO_STETH, provider) + + const totalBondShares = await accounting.totalBondShares({ blockTag: blockEvent.blockHash }) + const actualBalance = await steth.sharesOf(accounting, { blockTag: blockEvent.blockHash }) + const diff = totalBondShares - actualBalance + + const now = blockEvent.block.timestamp + const out: Finding[] = [] + + if (now - this.lastFiredAt.accountingExcessShares > SECONDS_PER_DAY) { + if (diff > ACCOUNTING_BALANCE_EXCESS_SHARES_MAX) { + const f = Finding.fromObject({ + name: `🟒 Shares to recover on CSAccounting.`, + description: `There's a valuable amount of shares to recover on CSAccounting.`, + alertId: 'CS-ACCOUNTING-EXCESS-SHARES', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) + out.push(f) + this.lastFiredAt.accountingExcessShares = now + } + } + + // NOTE: This is a critical invariant, so we fire every CHECK_ACCOUNTING_INTERVAL_BLOCKS. + if (diff < 0n) { + const f = Finding.fromObject({ + name: '🚨 Not enough shares on CSAccounting', + description: 'sharesOf(CSAccounting) < CSAccounting.totalBondShares', + alertId: 'CS-ACCOUNTING-NOT-ENOUGH-SHARES', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Critical, + type: FindingType.Info, + }) + out.push(f) + } + + return out } - return out - } - - handleSetBondCurveEvent(txEvent: TransactionEvent): Finding[] { - const events = filterLog( - txEvent.logs, - CSAccounting__factory.createInterface().getEvent('BondCurveSet').format('full'), - DEPLOYED_ADDRESSES.CS_ACCOUNTING, - ) - - const out: Finding[] = [] - - for (const e of events) { - if (e.args.curveId == CURVE_EARLY_ADOPTION_ID) { - out.push( - Finding.fromObject({ - alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', - name: 'πŸ”΅ CSAccounting: Bond curve set', - description: `Early adoption bond curve set for Node Operator #${e.args.nodeOperatorId}`, - source: sourceFromEvent(txEvent), - severity: FindingSeverity.Info, - type: FindingType.Info, - }), - ) - } else if (e.args.curveId == CURVE_DEFAULT_ID) { - out.push( - Finding.fromObject({ - alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', - name: 'πŸ”΅ CSAccounting: Bond curve set', - description: `Bond curve was reset for Node Operator #${e.args.nodeOperatorId}`, - source: sourceFromEvent(txEvent), - severity: FindingSeverity.Info, - type: FindingType.Info, - }), - ) - } else { - out.push( - Finding.fromObject({ - alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', - name: 'πŸ”΅ CSAccounting: Bond curve set', - description: `Bond curve set for Node Operator #${e.args.nodeOperatorId} with curve ID ${e.args.curveId}`, - source: sourceFromEvent(txEvent), - severity: FindingSeverity.Info, - type: FindingType.Info, - }), + + // TODO: Does it makes sense for us at all? + handleStETHApprovalEvents(txEvent: TransactionEvent): Finding[] { + const approvalEvents = filterLog( + txEvent.logs, + Lido__factory.createInterface().getEvent('TransferShares').format('full'), + DEPLOYED_ADDRESSES.LIDO_STETH, ) - } + + const out: Finding[] = [] + for (const event of approvalEvents) { + if (event.args.owner === DEPLOYED_ADDRESSES.CS_ACCOUNTING) { + const f = Finding.fromObject({ + name: `πŸ”΅ Lido stETH: Approval`, + description: `${event.args.spender} received allowance from ${event.args.owner} to ${event.args.value}`, + alertId: 'STETH-APPROVAL', + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) + out.push(f) + } + } + return out } - return out - } + handleSetBondCurveEvent(txEvent: TransactionEvent): Finding[] { + const events = filterLog( + txEvent.logs, + CSAccounting__factory.createInterface().getEvent('BondCurveSet').format('full'), + DEPLOYED_ADDRESSES.CS_ACCOUNTING, + ) + + const out: Finding[] = [] + + for (const e of events) { + if (e.args.curveId == CURVE_EARLY_ADOPTION_ID) { + out.push( + Finding.fromObject({ + alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', + name: 'πŸ”΅ CSAccounting: Bond curve set', + description: `Early adoption bond curve set for Node Operator #${e.args.nodeOperatorId}`, + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Info, + type: FindingType.Info, + }), + ) + } else if (e.args.curveId == CURVE_DEFAULT_ID) { + out.push( + Finding.fromObject({ + alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', + name: 'πŸ”΅ CSAccounting: Bond curve set', + description: `Bond curve was reset for Node Operator #${e.args.nodeOperatorId}`, + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Info, + type: FindingType.Info, + }), + ) + } else { + out.push( + Finding.fromObject({ + alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', + name: 'πŸ”΅ CSAccounting: Bond curve set', + description: `Bond curve set for Node Operator #${e.args.nodeOperatorId} with curve ID ${e.args.curveId}`, + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Info, + type: FindingType.Info, + }), + ) + } + } + + return out + } } diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts index b006e740b..c36ebab3b 100644 --- a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts @@ -2,10 +2,10 @@ import { DeploymentAddress, DeploymentAddresses } from '../../utils/constants.ho import { expect } from '@jest/globals' import { TransactionDto } from '../../entity/events' import { - CSModule__factory, - CSAccounting__factory, - CSFeeDistributor__factory, - CSFeeOracle__factory, + CSModule__factory, + CSAccounting__factory, + CSFeeDistributor__factory, + CSFeeOracle__factory, } from '../../generated/typechain' import { getCSFeeDistributorEvents } from '../../utils/events/cs_fee_distributor_events' import { CSFeeDistributorSrv, ICSFeeDistributorClient } from './CSFeeDistributor.srv' @@ -19,70 +19,79 @@ import { Metrics } from '../../utils/metrics/metrics' const TEST_TIMEOUT = 120_000 // ms describe('CsFeeDistributor event tests', () => { - const chainId = 17000 + const chainId = 17000 - const logger: Winston.Logger = Winston.createLogger({ - format: Winston.format.simple(), - transports: [new Winston.transports.Console()], - }) + const logger: Winston.Logger = Winston.createLogger({ + format: Winston.format.simple(), + transports: [new Winston.transports.Console()], + }) - const address: DeploymentAddress = DeploymentAddresses + const address: DeploymentAddress = DeploymentAddresses - const fortaEthersProvider = new ethers.providers.JsonRpcProvider(getFortaConfig().jsonRpcUrl, chainId) - const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) - const csAccountingRunner = CSAccounting__factory.connect(address.CS_ACCOUNTING_ADDRESS, fortaEthersProvider) - const csFeeDistributorRunner = CSFeeDistributor__factory.connect( - address.CS_FEE_DISTRIBUTOR_ADDRESS, - fortaEthersProvider, - ) - const csFeeOracleRunner = CSFeeOracle__factory.connect(address.CS_FEE_ORACLE_ADDRESS, fortaEthersProvider) + const fortaEthersProvider = new ethers.providers.JsonRpcProvider( + getFortaConfig().jsonRpcUrl, + chainId, + ) + const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) + const csAccountingRunner = CSAccounting__factory.connect( + address.CS_ACCOUNTING_ADDRESS, + fortaEthersProvider, + ) + const csFeeDistributorRunner = CSFeeDistributor__factory.connect( + address.CS_FEE_DISTRIBUTOR_ADDRESS, + fortaEthersProvider, + ) + const csFeeOracleRunner = CSFeeOracle__factory.connect( + address.CS_FEE_ORACLE_ADDRESS, + fortaEthersProvider, + ) - const registry = new promClient.Registry() - const m = new Metrics(registry, 'test_') + const registry = new promClient.Registry() + const m = new Metrics(registry, 'test_') - const csFeeDistributorClient: ICSFeeDistributorClient = new ETHProvider( - logger, - m, - fortaEthersProvider, - csModuleRunner, - csAccountingRunner, - csFeeDistributorRunner, - csFeeOracleRunner, - ) + const csFeeDistributorClient: ICSFeeDistributorClient = new ETHProvider( + logger, + m, + fortaEthersProvider, + csModuleRunner, + csAccountingRunner, + csFeeDistributorRunner, + csFeeOracleRunner, + ) - const csFeeDistributorSrv = new CSFeeDistributorSrv( - logger, - csFeeDistributorClient, - getCSFeeDistributorEvents(address.CS_FEE_DISTRIBUTOR_ADDRESS), - address.CS_ACCOUNTING_ADDRESS, - address.CS_FEE_DISTRIBUTOR_ADDRESS, - address.LIDO_STETH_ADDRESS, - address.HASH_CONSENSUS_ADDRESS, - ) + const csFeeDistributorSrv = new CSFeeDistributorSrv( + logger, + csFeeDistributorClient, + getCSFeeDistributorEvents(address.CS_FEE_DISTRIBUTOR_ADDRESS), + address.CS_ACCOUNTING_ADDRESS, + address.CS_FEE_DISTRIBUTOR_ADDRESS, + address.LIDO_STETH_ADDRESS, + address.HASH_CONSENSUS_ADDRESS, + ) - test( - 'πŸ”΅ INFO: DistributionDataUpdated', - async () => { - const txHash = '0x33a9fb726d09d543c417cb0985a41a7bee39e81e8536b5969784a520f4d2e0c1' + test( + 'πŸ”΅ INFO: DistributionDataUpdated', + async () => { + const txHash = '0x33a9fb726d09d543c417cb0985a41a7bee39e81e8536b5969784a520f4d2e0c1' - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } - const results = await csFeeDistributorSrv.handleTransaction(transactionDto) + const results = await csFeeDistributorSrv.handleTransaction(transactionDto) - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) + }, + TEST_TIMEOUT, + ) }) diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts index 1e2faeec8..f0444c89b 100644 --- a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts @@ -1,16 +1,20 @@ import { - BlockEvent, - Finding, - FindingSeverity, - FindingType, - TransactionEvent, - ethers, - filterLog, + BlockEvent, + Finding, + FindingSeverity, + FindingType, + TransactionEvent, + ethers, + filterLog, } from '@fortanetwork/forta-bot' import { Provider } from 'ethers' import { Logger } from 'winston' -import { CSFeeDistributor__factory, HashConsensus__factory, Lido__factory } from '../../generated/typechain' +import { + CSFeeDistributor__factory, + HashConsensus__factory, + Lido__factory, +} from '../../generated/typechain' import { getLogger } from '../../logger' import { SECONDS_PER_DAY, SECONDS_PER_SLOT, SLOTS_PER_EPOCH } from '../../shared/constants' import { getEpoch } from '../../utils/epochs' @@ -20,218 +24,247 @@ import { RedefineMode, requireWithTier } from '../../utils/require' import { formatDelay } from '../../utils/time' import * as Constants from '../constants' -const { DEPLOYED_ADDRESSES } = requireWithTier(module, '../constants', RedefineMode.Merge) +const { DEPLOYED_ADDRESSES } = requireWithTier( + module, + '../constants', + RedefineMode.Merge, +) const ICSFeeDistributor = CSFeeDistributor__factory.createInterface() export class CSFeeDistributorSrv { - private readonly logger: Logger - - private lastFiredAt = { - distributionUpdateOverdue: 0, - } - - private state = { - lastDistributionUpdatedAt: 0, - frameInitialEpoch: 0, - frameInSlots: 0, - } - - constructor() { - this.logger = getLogger(CSFeeDistributorSrv.name) - } - - async initialize(blockIdentifier: ethers.BlockTag, provider: ethers.Provider): Promise { - const hc = HashConsensus__factory.connect(DEPLOYED_ADDRESSES.HASH_CONSENSUS, provider) - const frameConfig = await hc.getFrameConfig({ blockTag: blockIdentifier }) - this.state.frameInitialEpoch = Number(frameConfig.initialEpoch) - - const frameInSlots = Number(frameConfig.epochsPerFrame) * SLOTS_PER_EPOCH - this.state.frameInSlots = frameInSlots - - const distributor = CSFeeDistributor__factory.connect(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, provider) - if ((await distributor.treeRoot({ blockTag: blockIdentifier })) === ethers.ZeroHash) { - this.logger.debug('No distribution happened so far') - return + private readonly logger: Logger + + private lastFiredAt = { + distributionUpdateOverdue: 0, } - const toBlock = await provider.getBlock(blockIdentifier) - if (!toBlock) { - throw Error('Unable to get the latest block') + private state = { + lastDistributionUpdatedAt: 0, + frameInitialEpoch: 0, + frameInSlots: 0, } - const distributedEvents = await getLogsByChunks( - distributor as any, - distributor.filters.DistributionDataUpdated, - toBlock.number - frameInSlots * 2, - toBlock.number, - ) - - const lastDistributionEvent = distributedEvents.sort((a, b) => a.blockNumber - b.blockNumber).pop() - if (!lastDistributionEvent) { - this.logger.debug('No distribution event found') - return + constructor() { + this.logger = getLogger(CSFeeDistributorSrv.name) } - this.state.lastDistributionUpdatedAt = (await lastDistributionEvent.getBlock())?.timestamp ?? 0 - this.logger.debug(`Last distribution observed at timestamp ${this.state.lastDistributionUpdatedAt}`) - } + async initialize(blockIdentifier: ethers.BlockTag, provider: ethers.Provider): Promise { + const hc = HashConsensus__factory.connect(DEPLOYED_ADDRESSES.HASH_CONSENSUS, provider) + const frameConfig = await hc.getFrameConfig({ blockTag: blockIdentifier }) + this.state.frameInitialEpoch = Number(frameConfig.initialEpoch) + + const frameInSlots = Number(frameConfig.epochsPerFrame) * SLOTS_PER_EPOCH + this.state.frameInSlots = frameInSlots + + const distributor = CSFeeDistributor__factory.connect( + DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, + provider, + ) + if ((await distributor.treeRoot({ blockTag: blockIdentifier })) === ethers.ZeroHash) { + this.logger.debug('No distribution happened so far') + return + } + + const toBlock = await provider.getBlock(blockIdentifier) + if (!toBlock) { + throw Error('Unable to get the latest block') + } + + const distributedEvents = await getLogsByChunks( + distributor as any, + distributor.filters.DistributionDataUpdated, + toBlock.number - frameInSlots * 2, + toBlock.number, + ) + + const lastDistributionEvent = distributedEvents + .sort((a, b) => a.blockNumber - b.blockNumber) + .pop() + if (!lastDistributionEvent) { + this.logger.debug('No distribution event found') + return + } + + this.state.lastDistributionUpdatedAt = + (await lastDistributionEvent.getBlock())?.timestamp ?? 0 + this.logger.debug( + `Last distribution observed at timestamp ${this.state.lastDistributionUpdatedAt}`, + ) + } - async handleBlock(blockEvent: BlockEvent, provider: Provider): Promise { - return [...this.handleDistributionOverdue(blockEvent), ...(await this.checkInvariants(blockEvent, provider))] - } + async handleBlock(blockEvent: BlockEvent, provider: Provider): Promise { + return [ + ...this.handleDistributionOverdue(blockEvent), + ...(await this.checkInvariants(blockEvent, provider)), + ] + } - public async handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider): Promise { - const distributionDataUpdatedEvents = filterLog( - txEvent.logs, - ICSFeeDistributor.getEvent('DistributionDataUpdated').format('full'), - DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, - ) + public async handleTransaction( + txEvent: TransactionEvent, + provider: ethers.Provider, + ): Promise { + const distributionDataUpdatedEvents = filterLog( + txEvent.logs, + ICSFeeDistributor.getEvent('DistributionDataUpdated').format('full'), + DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, + ) + + if (distributionDataUpdatedEvents.length > 0) { + this.state.lastDistributionUpdatedAt = txEvent.block.timestamp + } + + return ( + await Promise.all([ + this.handleTransferSharesInvalidReceiver(txEvent), + this.handleRevertedTx(txEvent, provider), + ]) + ).flat() + } - if (distributionDataUpdatedEvents.length > 0) { - this.state.lastDistributionUpdatedAt = txEvent.block.timestamp + private handleDistributionOverdue(blockEvent: BlockEvent): Finding[] { + if (this.state.lastDistributionUpdatedAt === 0) { + this.logger.debug('No previous distribution observed so far') + return [] + } + + const now = blockEvent.block.timestamp + + if (getEpoch(blockEvent.chainId, now) < this.state.frameInitialEpoch) { + this.logger.debug('Initial epoch has not been reached yet') + return [] + } + + if (now - this.lastFiredAt.distributionUpdateOverdue < SECONDS_PER_DAY) { + return [] + } + + // Just add 1 day to the frame length because it seems as a good approximation of more complex approach. + // TODO: Fetch the current frame every time? + const distributionIntervalSecondsMax = + this.state.frameInSlots * SECONDS_PER_SLOT + SECONDS_PER_DAY + const distributionDelaySeconds = now - this.state.lastDistributionUpdatedAt + if (distributionDelaySeconds < distributionIntervalSecondsMax) { + return [] + } + + this.lastFiredAt.distributionUpdateOverdue = now + + return [ + Finding.fromObject({ + name: `πŸ”΄ CSFeeDistributor: Distribution overdue`, + description: `There has been no DistributionDataUpdated event for more than ${formatDelay(distributionIntervalSecondsMax)}.`, + alertId: 'CSFEE-DISTRIBUTION-OVERDUE', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.High, + type: FindingType.Info, + }), + ] } - return ( - await Promise.all([this.handleTransferSharesInvalidReceiver(txEvent), this.handleRevertedTx(txEvent, provider)]) - ).flat() - } + public handleTransferSharesInvalidReceiver(txEvent: TransactionEvent): Finding[] { + const transferSharesEvents = filterLog( + txEvent.logs, + Lido__factory.createInterface().getEvent('TransferShares').format('full'), + DEPLOYED_ADDRESSES.LIDO_STETH, + ) + + const out: Finding[] = [] + for (const event of transferSharesEvents) { + if ( + event.args.from.toLowerCase() === + DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR.toLowerCase() && + event.args.to.toLowerCase() !== DEPLOYED_ADDRESSES.CS_ACCOUNTING.toLowerCase() + ) { + const f = Finding.fromObject({ + name: `🚨 CSFeeDistributor: Invalid TransferShares receiver`, + description: `TransferShares from CSFeeDistributor to an invalid address ${event.args.to} (expected CSAccounting)`, + alertId: 'CSFEE-DISTRIBUTOR-INVALID-TRANSFER', + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Critical, + type: FindingType.Info, + }) + + out.push(f) + } + } + return out + } - private handleDistributionOverdue(blockEvent: BlockEvent): Finding[] { - if (this.state.lastDistributionUpdatedAt === 0) { - this.logger.debug('No previous distribution observed so far') - return [] + private async handleRevertedTx( + txEvent: TransactionEvent, + provider: ethers.Provider, + ): Promise { + // if (!(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR.toLowerCase() in txEvent.addresses)) { + // return [] + // } + // + // const txReceipt = await provider.getTransactionReceipt(txEvent.hash) + // // Nothing to do if the transaction succeeded. + // if (txReceipt?.status === 0) { + // this.logger.debug(`Skipping successful transaction ${txEvent.hash}`) + // return [] + // } + // + // // FIXME: I can't find a node with getTransactionResult call working. + // let decodedLog: ethers.ErrorDescription | null = null + // try { + // const data = await txReceipt?.getResult() + // decodedLog = CSFeeDistributorInterface.parseError(data ?? '') + // } catch (error: any) { + // if (error.code === 'UNSUPPORTED_OPERATION') { + // this.logger.debug('Ethereum RPC does not support `getTransactionResult`') + // return [] + // } + // + // throw error + // } + // + // const reason = decodedLog?.name + // if (!reason) { + // return [] + // } + // + // switch (reason) { + // case 'InvalidShares': + // return [failedTxAlert(txEvent, 'CSFeeOracle reports incorrect amount of shares to distribute', 'InvalidShares')] + // case 'NotEnoughShares': + // return [failedTxAlert(txEvent, 'CSFeeDistributor internal accounting error', 'NotEnoughShares')] + // case 'InvalidTreeRoot': + // return [failedTxAlert(txEvent, 'CSFeeOracle built incorrect report', 'InvalidTreeRoot')] + // case 'InvalidTreeCID': + // return [failedTxAlert(txEvent, 'CSFeeOracle built incorrect report', 'InvalidTreeCID')] + // default: + // this.logger.warn(`Unrecognized revert reason: ${reason}`) + // } + + return [] } - const now = blockEvent.block.timestamp + private async checkInvariants(blockEvent: BlockEvent, provider: ethers.Provider) { + const distributor = CSFeeDistributor__factory.connect( + DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, + provider, + ) + const steth = Lido__factory.connect(DEPLOYED_ADDRESSES.LIDO_STETH, provider) - if (getEpoch(blockEvent.chainId, now) < this.state.frameInitialEpoch) { - this.logger.debug('Initial epoch has not been reached yet') - return [] - } + const blockTag = blockEvent.blockHash - if (now - this.lastFiredAt.distributionUpdateOverdue < SECONDS_PER_DAY) { - return [] - } + const out: Finding[] = [] - // Just add 1 day to the frame length because it seems as a good approximation of more complex approach. - // TODO: Fetch the current frame every time? - const distributionIntervalSecondsMax = this.state.frameInSlots * SECONDS_PER_SLOT + SECONDS_PER_DAY - const distributionDelaySeconds = now - this.state.lastDistributionUpdatedAt - if (distributionDelaySeconds < distributionIntervalSecondsMax) { - return [] - } + const treeRoot = await distributor.treeRoot({ blockTag }) + const treeCid = await distributor.treeCid({ blockTag }) + if (treeRoot !== ethers.ZeroHash && treeCid === '') { + out.push(invariantAlert(blockEvent, 'Tree exists, but no CID.')) + } - this.lastFiredAt.distributionUpdateOverdue = now - - return [ - Finding.fromObject({ - name: `πŸ”΄ CSFeeDistributor: Distribution overdue`, - description: `There has been no DistributionDataUpdated event for more than ${formatDelay(distributionIntervalSecondsMax)}.`, - alertId: 'CSFEE-DISTRIBUTION-OVERDUE', - // NOTE: Do not include the source to reach quorum. - // source: sourceFromEvent(blockEvent), - severity: FindingSeverity.High, - type: FindingType.Info, - }), - ] - } - - public handleTransferSharesInvalidReceiver(txEvent: TransactionEvent): Finding[] { - const transferSharesEvents = filterLog( - txEvent.logs, - Lido__factory.createInterface().getEvent('TransferShares').format('full'), - DEPLOYED_ADDRESSES.LIDO_STETH, - ) - - const out: Finding[] = [] - for (const event of transferSharesEvents) { - if ( - event.args.from.toLowerCase() === DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR.toLowerCase() && - event.args.to.toLowerCase() !== DEPLOYED_ADDRESSES.CS_ACCOUNTING.toLowerCase() - ) { - const f = Finding.fromObject({ - name: `🚨 CSFeeDistributor: Invalid TransferShares receiver`, - description: `TransferShares from CSFeeDistributor to an invalid address ${event.args.to} (expected CSAccounting)`, - alertId: 'CSFEE-DISTRIBUTOR-INVALID-TRANSFER', - source: sourceFromEvent(txEvent), - severity: FindingSeverity.Critical, - type: FindingType.Info, - }) - - out.push(f) - } - } - return out - } - - private async handleRevertedTx(txEvent: TransactionEvent, provider: ethers.Provider): Promise { - // if (!(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR.toLowerCase() in txEvent.addresses)) { - // return [] - // } - // - // const txReceipt = await provider.getTransactionReceipt(txEvent.hash) - // // Nothing to do if the transaction succeeded. - // if (txReceipt?.status === 0) { - // this.logger.debug(`Skipping successful transaction ${txEvent.hash}`) - // return [] - // } - // - // // FIXME: I can't find a node with getTransactionResult call working. - // let decodedLog: ethers.ErrorDescription | null = null - // try { - // const data = await txReceipt?.getResult() - // decodedLog = CSFeeDistributorInterface.parseError(data ?? '') - // } catch (error: any) { - // if (error.code === 'UNSUPPORTED_OPERATION') { - // this.logger.debug('Ethereum RPC does not support `getTransactionResult`') - // return [] - // } - // - // throw error - // } - // - // const reason = decodedLog?.name - // if (!reason) { - // return [] - // } - // - // switch (reason) { - // case 'InvalidShares': - // return [failedTxAlert(txEvent, 'CSFeeOracle reports incorrect amount of shares to distribute', 'InvalidShares')] - // case 'NotEnoughShares': - // return [failedTxAlert(txEvent, 'CSFeeDistributor internal accounting error', 'NotEnoughShares')] - // case 'InvalidTreeRoot': - // return [failedTxAlert(txEvent, 'CSFeeOracle built incorrect report', 'InvalidTreeRoot')] - // case 'InvalidTreeCID': - // return [failedTxAlert(txEvent, 'CSFeeOracle built incorrect report', 'InvalidTreeCID')] - // default: - // this.logger.warn(`Unrecognized revert reason: ${reason}`) - // } - - return [] - } - - private async checkInvariants(blockEvent: BlockEvent, provider: ethers.Provider) { - const distributor = CSFeeDistributor__factory.connect(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, provider) - const steth = Lido__factory.connect(DEPLOYED_ADDRESSES.LIDO_STETH, provider) - - const blockTag = blockEvent.blockHash - - const out: Finding[] = [] - - const treeRoot = await distributor.treeRoot({ blockTag }) - const treeCid = await distributor.treeCid({ blockTag }) - if (treeRoot !== ethers.ZeroHash && treeCid === '') { - out.push(invariantAlert(blockEvent, 'Tree exists, but no CID.')) - } + if ( + (await steth.sharesOf(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, { blockTag })) < + (await distributor.totalClaimableShares({ blockTag })) + ) { + out.push(invariantAlert(blockEvent, "distributed more than the contract's balance")) + } - if ( - (await steth.sharesOf(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, { blockTag })) < - (await distributor.totalClaimableShares({ blockTag })) - ) { - out.push(invariantAlert(blockEvent, "distributed more than the contract's balance")) + return out } - - return out - } } diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts index 8a30b8e90..9940e4127 100644 --- a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts +++ b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts @@ -2,10 +2,10 @@ import { DeploymentAddress, DeploymentAddresses } from '../../utils/constants.ho import { expect } from '@jest/globals' import { TransactionDto } from '../../entity/events' import { - CSModule__factory, - CSAccounting__factory, - CSFeeDistributor__factory, - CSFeeOracle__factory, + CSModule__factory, + CSAccounting__factory, + CSFeeDistributor__factory, + CSFeeOracle__factory, } from '../../generated/typechain' import { CSFeeOracleSrv, ICSFeeOracleClient } from './CSFeeOracle.srv' import * as Winston from 'winston' @@ -14,198 +14,210 @@ import { ethers } from '@fortanetwork/forta-bot' import { getFortaConfig } from 'forta-agent/dist/sdk/utils' import promClient from 'prom-client' import { Metrics } from '../../utils/metrics/metrics' -import { getCSFeeOracleEvents, getHashConsensusEvents } from '../../utils/events/cs_fee_oracle_events' +import { + getCSFeeOracleEvents, + getHashConsensusEvents, +} from '../../utils/events/cs_fee_oracle_events' const TEST_TIMEOUT = 120_000 // ms describe('CSFeeOracle and HashConsensus events tests', () => { - const chainId = 17000 - - const logger: Winston.Logger = Winston.createLogger({ - format: Winston.format.simple(), - transports: [new Winston.transports.Console()], - }) - - const address: DeploymentAddress = DeploymentAddresses - - const fortaEthersProvider = new ethers.providers.JsonRpcProvider(getFortaConfig().jsonRpcUrl, chainId) - const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) - const csAccountingRunner = CSAccounting__factory.connect(address.CS_ACCOUNTING_ADDRESS, fortaEthersProvider) - const csFeeDistributorRunner = CSFeeDistributor__factory.connect( - address.CS_FEE_DISTRIBUTOR_ADDRESS, - fortaEthersProvider, - ) - const csFeeOracleRunner = CSFeeOracle__factory.connect(address.CS_FEE_ORACLE_ADDRESS, fortaEthersProvider) - - const registry = new promClient.Registry() - const m = new Metrics(registry, 'test_') - - const csFeeOracleClient: ICSFeeOracleClient = new ETHProvider( - logger, - m, - fortaEthersProvider, - csModuleRunner, - csAccountingRunner, - csFeeDistributorRunner, - csFeeOracleRunner, - ) - - const csFeeOracleSrv = new CSFeeOracleSrv( - logger, - csFeeOracleClient, - getHashConsensusEvents(address.HASH_CONSENSUS_ADDRESS), - getCSFeeOracleEvents(address.CS_FEE_ORACLE_ADDRESS), - address.HASH_CONSENSUS_ADDRESS, - address.CS_FEE_ORACLE_ADDRESS, - ) - - test( - 'πŸ”΅ CSFeeOracle: Processing Started, Report Settled', - async () => { - const txHash = '0xf53cfcc9e576393b481a1c8ff4d28235703b6b5b62f9edb623d913b5d059f9c5' - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + const chainId = 17000 + + const logger: Winston.Logger = Winston.createLogger({ + format: Winston.format.simple(), + transports: [new Winston.transports.Console()], + }) + + const address: DeploymentAddress = DeploymentAddresses + + const fortaEthersProvider = new ethers.providers.JsonRpcProvider( + getFortaConfig().jsonRpcUrl, + chainId, + ) + const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) + const csAccountingRunner = CSAccounting__factory.connect( + address.CS_ACCOUNTING_ADDRESS, + fortaEthersProvider, + ) + const csFeeDistributorRunner = CSFeeDistributor__factory.connect( + address.CS_FEE_DISTRIBUTOR_ADDRESS, + fortaEthersProvider, + ) + const csFeeOracleRunner = CSFeeOracle__factory.connect( + address.CS_FEE_ORACLE_ADDRESS, + fortaEthersProvider, + ) + + const registry = new promClient.Registry() + const m = new Metrics(registry, 'test_') + + const csFeeOracleClient: ICSFeeOracleClient = new ETHProvider( + logger, + m, + fortaEthersProvider, + csModuleRunner, + csAccountingRunner, + csFeeDistributorRunner, + csFeeOracleRunner, + ) + + const csFeeOracleSrv = new CSFeeOracleSrv( + logger, + csFeeOracleClient, + getHashConsensusEvents(address.HASH_CONSENSUS_ADDRESS), + getCSFeeOracleEvents(address.CS_FEE_ORACLE_ADDRESS), + address.HASH_CONSENSUS_ADDRESS, + address.CS_FEE_ORACLE_ADDRESS, + ) + + test( + 'πŸ”΅ CSFeeOracle: Processing Started, Report Settled', + async () => { + const txHash = '0xf53cfcc9e576393b481a1c8ff4d28235703b6b5b62f9edb623d913b5d059f9c5' + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = csFeeOracleSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(2) }, - hash: trx.hash, - } - - const results = csFeeOracleSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(2) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ HashConsensus: FrameConfig Set', - async () => { - const txHash = '0xa6f4206ce30d66b378ab6e4ddef442ac4f29c95c5175fbb4a8944e6bec663724' - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ HashConsensus: FrameConfig Set', + async () => { + const txHash = '0xa6f4206ce30d66b378ab6e4ddef442ac4f29c95c5175fbb4a8944e6bec663724' + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const result = csFeeOracleSrv.handleTransaction(transactionDto) + + expect(result).toMatchSnapshot() + expect(result.length).toBe(1) }, - hash: trx.hash, - } - - const result = csFeeOracleSrv.handleTransaction(transactionDto) - - expect(result).toMatchSnapshot() - expect(result.length).toBe(1) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ HashConsensus: Member added, Quorum Set', - async () => { - const txHash = '0xdfcdbe0b9e795b2b83ad405c17b0c7326b00748cb3b11282a460c50b1f4588b0' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ HashConsensus: Member added, Quorum Set', + async () => { + const txHash = '0xdfcdbe0b9e795b2b83ad405c17b0c7326b00748cb3b11282a460c50b1f4588b0' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = csFeeOracleSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(2) }, - hash: trx.hash, - } - - const results = csFeeOracleSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(2) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ HashConsensus: Member Removed, Quorum Set, Consensus Reached, Report Submitted', - async () => { - const txHash = '0xd22f8208b4bb2013a1113d68f9f19e3be13147c1f77ce811baa32ef082deed42' - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ HashConsensus: Member Removed, Quorum Set, Consensus Reached, Report Submitted', + async () => { + const txHash = '0xd22f8208b4bb2013a1113d68f9f19e3be13147c1f77ce811baa32ef082deed42' + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const result = csFeeOracleSrv.handleTransaction(transactionDto) + + expect(result).toMatchSnapshot() + expect(result.length).toBe(4) }, - hash: trx.hash, - } - - const result = csFeeOracleSrv.handleTransaction(transactionDto) - - expect(result).toMatchSnapshot() - expect(result.length).toBe(4) - }, - TEST_TIMEOUT, - ) - - test( - 'Empty findings', - async () => { - const txHash = '0x74ff368ba6ea748e19a7f0fefd9d0f708078176e56799dbe97d46ae59782ff9d' - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + 'Empty findings', + async () => { + const txHash = '0x74ff368ba6ea748e19a7f0fefd9d0f708078176e56799dbe97d46ae59782ff9d' + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const result = csFeeOracleSrv.handleTransaction(transactionDto) + + expect(result.length).toBe(0) }, - hash: trx.hash, - } - - const result = csFeeOracleSrv.handleTransaction(transactionDto) - - expect(result.length).toBe(0) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ CSFeeOracle: Consensus Hash Contract Set, Consensus Version Set, FeeDistributor Contract Set, Perf Leeway Set', - async () => { - const txHash = '0xdc5ed949e5b30a5ff6f325cd718ba5a52a32dc7719d3fe7aaf9661cc3da7e9a6' - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ CSFeeOracle: Consensus Hash Contract Set, Consensus Version Set, FeeDistributor Contract Set, Perf Leeway Set', + async () => { + const txHash = '0xdc5ed949e5b30a5ff6f325cd718ba5a52a32dc7719d3fe7aaf9661cc3da7e9a6' + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const result = csFeeOracleSrv.handleTransaction(transactionDto) + + expect(result).toMatchSnapshot() + expect(result.length).toBe(4) }, - hash: trx.hash, - } - - const result = csFeeOracleSrv.handleTransaction(transactionDto) - - expect(result).toMatchSnapshot() - expect(result.length).toBe(4) - }, - TEST_TIMEOUT, - ) + TEST_TIMEOUT, + ) }) diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts index 4e1656c12..b9399a86c 100644 --- a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts +++ b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts @@ -1,4 +1,11 @@ -import { Finding, FindingSeverity, FindingType, TransactionEvent, ethers, filterLog } from '@fortanetwork/forta-bot' +import { + Finding, + FindingSeverity, + FindingType, + TransactionEvent, + ethers, + filterLog, +} from '@fortanetwork/forta-bot' import { CSFeeOracle__factory, HashConsensus__factory } from '../../generated/typechain' import { sourceFromEvent } from '../../utils/findings' @@ -7,9 +14,9 @@ import { etherscanAddress } from '../../utils/string' import * as Constants from '../constants' const { DEPLOYED_ADDRESSES, ORACLE_MEMBERS } = requireWithTier( - module, - '../constants', - RedefineMode.Merge, + module, + '../constants', + RedefineMode.Merge, ) const IHashConsensus = HashConsensus__factory.createInterface() const ICSFeeOracle = CSFeeOracle__factory.createInterface() @@ -17,96 +24,113 @@ const ICSFeeOracle = CSFeeOracle__factory.createInterface() // TODO: Extract HashConsensus part maybe? export class CSFeeOracleSrv { - private membersLastReport: Map< - string, - { - refSlot: bigint - report: string + private membersLastReport: Map< + string, + { + refSlot: bigint + report: string + } + > = new Map() + + public async initialize( + blockIdentifier: ethers.BlockTag, + provider: ethers.Provider, + ): Promise { + const hc = HashConsensus__factory.connect(DEPLOYED_ADDRESSES.HASH_CONSENSUS, provider) + const [members] = await hc.getMembers({ blockTag: blockIdentifier }) + for (const m of members) { + const lastReport = await hc.getConsensusStateForMember(m, { blockTag: blockIdentifier }) + this.membersLastReport.set(m, { + refSlot: lastReport.lastMemberReportRefSlot, + report: lastReport.currentFrameMemberReport, + }) + } } - > = new Map() - - public async initialize(blockIdentifier: ethers.BlockTag, provider: ethers.Provider): Promise { - const hc = HashConsensus__factory.connect(DEPLOYED_ADDRESSES.HASH_CONSENSUS, provider) - const [members] = await hc.getMembers({ blockTag: blockIdentifier }) - for (const m of members) { - const lastReport = await hc.getConsensusStateForMember(m, { blockTag: blockIdentifier }) - this.membersLastReport.set(m, { - refSlot: lastReport.lastMemberReportRefSlot, - report: lastReport.currentFrameMemberReport, - }) - } - } - - public async handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider): Promise { - return [...this.handleAlternativeHashReceived(txEvent), ...(await this.handleReportSubmitted(txEvent, provider))] - } - - private handleAlternativeHashReceived(txEvent: TransactionEvent): Finding[] { - const out: Finding[] = [] - - const [event] = filterLog( - txEvent.logs, - IHashConsensus.getEvent('ReportReceived').format('full'), - DEPLOYED_ADDRESSES.HASH_CONSENSUS, - ) - - if (event) { - const currentReportHashes = [...this.membersLastReport.values()] - .filter((r) => r.refSlot === event.args.refSlot) - .map((r) => r.report) - - if (currentReportHashes.length > 0 && !currentReportHashes.includes(event.args.report)) { - const f = Finding.fromObject({ - name: 'πŸ”΄ HashConsensus: Another report variant appeared (alternative hash)', - description: `More than one distinct report hash received for slot ${event.args.refSlot}. Member: ${event.args.member}. Report: ${event.args.report}`, - alertId: 'HASH-CONSENSUS-REPORT-RECEIVED', - source: sourceFromEvent(txEvent), - severity: FindingSeverity.High, - type: FindingType.Info, - }) - - out.push(f) - } - this.membersLastReport.set(event.args.member, { - refSlot: event.args.refSlot, - report: event.args.report, - }) + public async handleTransaction( + txEvent: TransactionEvent, + provider: ethers.Provider, + ): Promise { + return [ + ...this.handleAlternativeHashReceived(txEvent), + ...(await this.handleReportSubmitted(txEvent, provider)), + ] } - return out - } + private handleAlternativeHashReceived(txEvent: TransactionEvent): Finding[] { + const out: Finding[] = [] - private async handleReportSubmitted(txEvent: TransactionEvent, provider: ethers.Provider): Promise { - const [event] = filterLog( - txEvent.logs, - ICSFeeOracle.getEvent('ReportSubmitted').format('full'), - DEPLOYED_ADDRESSES.CS_FEE_ORACLE, - ) + const [event] = filterLog( + txEvent.logs, + IHashConsensus.getEvent('ReportReceived').format('full'), + DEPLOYED_ADDRESSES.HASH_CONSENSUS, + ) - if (!event) { - return [] + if (event) { + const currentReportHashes = [...this.membersLastReport.values()] + .filter((r) => r.refSlot === event.args.refSlot) + .map((r) => r.report) + + if ( + currentReportHashes.length > 0 && + !currentReportHashes.includes(event.args.report) + ) { + const f = Finding.fromObject({ + name: 'πŸ”΄ HashConsensus: Another report variant appeared (alternative hash)', + description: `More than one distinct report hash received for slot ${event.args.refSlot}. Member: ${event.args.member}. Report: ${event.args.report}`, + alertId: 'HASH-CONSENSUS-REPORT-RECEIVED', + source: sourceFromEvent(txEvent), + severity: FindingSeverity.High, + type: FindingType.Info, + }) + + out.push(f) + } + + this.membersLastReport.set(event.args.member, { + refSlot: event.args.refSlot, + report: event.args.report, + }) + } + + return out } - const out: Finding[] = [] - - const hc = HashConsensus__factory.connect(DEPLOYED_ADDRESSES.HASH_CONSENSUS, provider) - const [addresses, lastReportedRefSlots] = await hc.getFastLaneMembers({ blockTag: txEvent.block.hash }) - addresses.forEach(function (addr, index) { - if (event.args.refSlot !== lastReportedRefSlots[index]) { - out.push( - Finding.fromObject({ - name: 'πŸ”΄ CSM: Sloppy oracle fast lane member', - description: `Member ${etherscanAddress(addr)} (${ORACLE_MEMBERS[addr] || 'unknown'}) was in the fast lane but did not report`, - alertId: 'HASH-CONSENSUS-SLOPPY-MEMBER', - source: sourceFromEvent(txEvent), - severity: FindingSeverity.Medium, - type: FindingType.Info, - }), + private async handleReportSubmitted( + txEvent: TransactionEvent, + provider: ethers.Provider, + ): Promise { + const [event] = filterLog( + txEvent.logs, + ICSFeeOracle.getEvent('ReportSubmitted').format('full'), + DEPLOYED_ADDRESSES.CS_FEE_ORACLE, ) - } - }) - return out - } + if (!event) { + return [] + } + + const out: Finding[] = [] + + const hc = HashConsensus__factory.connect(DEPLOYED_ADDRESSES.HASH_CONSENSUS, provider) + const [addresses, lastReportedRefSlots] = await hc.getFastLaneMembers({ + blockTag: txEvent.block.hash, + }) + addresses.forEach(function (addr, index) { + if (event.args.refSlot !== lastReportedRefSlots[index]) { + out.push( + Finding.fromObject({ + name: 'πŸ”΄ CSM: Sloppy oracle fast lane member', + description: `Member ${etherscanAddress(addr)} (${ORACLE_MEMBERS[addr] || 'unknown'}) was in the fast lane but did not report`, + alertId: 'HASH-CONSENSUS-SLOPPY-MEMBER', + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Medium, + type: FindingType.Info, + }), + ) + } + }) + + return out + } } diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts b/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts index cfd467963..1922a8dd4 100644 --- a/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts +++ b/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts @@ -2,10 +2,10 @@ import { DeploymentAddress, DeploymentAddresses } from '../../utils/constants.ho import { expect } from '@jest/globals' import { TransactionDto } from '../../entity/events' import { - CSModule__factory, - CSAccounting__factory, - CSFeeDistributor__factory, - CSFeeOracle__factory, + CSModule__factory, + CSAccounting__factory, + CSFeeDistributor__factory, + CSFeeOracle__factory, } from '../../generated/typechain' import { CSModuleSrv, ICSModuleClient } from './CSModule.srv' import { getCSModuleEvents } from '../../utils/events/cs_module_events' @@ -19,120 +19,129 @@ import { Metrics } from '../../utils/metrics/metrics' const TEST_TIMEOUT = 120_000 // ms describe('CSModule event tests', () => { - const chainId = 17000 - - const logger: Winston.Logger = Winston.createLogger({ - format: Winston.format.simple(), - transports: [new Winston.transports.Console()], - }) - - const address: DeploymentAddress = DeploymentAddresses - - const fortaEthersProvider = new ethers.providers.JsonRpcProvider(getFortaConfig().jsonRpcUrl, chainId) - const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) - const csAccountingRunner = CSAccounting__factory.connect(address.CS_ACCOUNTING_ADDRESS, fortaEthersProvider) - const csFeeDistributorRunner = CSFeeDistributor__factory.connect( - address.CS_FEE_DISTRIBUTOR_ADDRESS, - fortaEthersProvider, - ) - const csFeeOracleRunner = CSFeeOracle__factory.connect(address.CS_FEE_ORACLE_ADDRESS, fortaEthersProvider) - - const registry = new promClient.Registry() - const m = new Metrics(registry, 'test_') - - const csModuleClient: ICSModuleClient = new ETHProvider( - logger, - m, - fortaEthersProvider, - csModuleRunner, - csAccountingRunner, - csFeeDistributorRunner, - csFeeOracleRunner, - ) - - const csModuleSrv = new CSModuleSrv( - logger, - csModuleClient, - address.CS_MODULE_ADDRESS, - address.STAKING_ROUTER_ADDRESS, - getCSModuleEvents(address.CS_MODULE_ADDRESS), - ) - - test( - '🟠 CSModule: Target limit mode changed', - async () => { - const txHash = '0xd8bb4389a056be70fe20e3b6b903c3e7cdbf053610bd8d647c4e2fe49c94f8b6' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + const chainId = 17000 + + const logger: Winston.Logger = Winston.createLogger({ + format: Winston.format.simple(), + transports: [new Winston.transports.Console()], + }) + + const address: DeploymentAddress = DeploymentAddresses + + const fortaEthersProvider = new ethers.providers.JsonRpcProvider( + getFortaConfig().jsonRpcUrl, + chainId, + ) + const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) + const csAccountingRunner = CSAccounting__factory.connect( + address.CS_ACCOUNTING_ADDRESS, + fortaEthersProvider, + ) + const csFeeDistributorRunner = CSFeeDistributor__factory.connect( + address.CS_FEE_DISTRIBUTOR_ADDRESS, + fortaEthersProvider, + ) + const csFeeOracleRunner = CSFeeOracle__factory.connect( + address.CS_FEE_ORACLE_ADDRESS, + fortaEthersProvider, + ) + + const registry = new promClient.Registry() + const m = new Metrics(registry, 'test_') + + const csModuleClient: ICSModuleClient = new ETHProvider( + logger, + m, + fortaEthersProvider, + csModuleRunner, + csAccountingRunner, + csFeeDistributorRunner, + csFeeOracleRunner, + ) + + const csModuleSrv = new CSModuleSrv( + logger, + csModuleClient, + address.CS_MODULE_ADDRESS, + address.STAKING_ROUTER_ADDRESS, + getCSModuleEvents(address.CS_MODULE_ADDRESS), + ) + + test( + '🟠 CSModule: Target limit mode changed', + async () => { + const txHash = '0xd8bb4389a056be70fe20e3b6b903c3e7cdbf053610bd8d647c4e2fe49c94f8b6' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = await csModuleSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) }, - hash: trx.hash, - } - - const results = await csModuleSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ CSModule: EL Rewards stealing penalty reported', - async () => { - const txHash = '0x45d08822a9e025d374ab182612a119d837a0869b0c343379025303f53c4c63be' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΄ CSModule: EL Rewards stealing penalty reported', + async () => { + const txHash = '0x45d08822a9e025d374ab182612a119d837a0869b0c343379025303f53c4c63be' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = await csModuleSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) }, - hash: trx.hash, - } - - const results = await csModuleSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΅ CSModule: Notable Node Operator creation', - async () => { - const txHash = '0x87ece6668905293fd00c7eeff15ff685ed1d10810bc5cbba204f0881ab877be6' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + 'πŸ”΅ CSModule: Notable Node Operator creation', + async () => { + const txHash = '0x87ece6668905293fd00c7eeff15ff685ed1d10810bc5cbba204f0881ab877be6' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = await csModuleSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(1) }, - hash: trx.hash, - } - - const results = await csModuleSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) + TEST_TIMEOUT, + ) }) diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.ts b/csm-alerts/src/services/CSModule/CSModule.srv.ts index 6e8ffc6ab..8cf8a87aa 100644 --- a/csm-alerts/src/services/CSModule/CSModule.srv.ts +++ b/csm-alerts/src/services/CSModule/CSModule.srv.ts @@ -1,11 +1,11 @@ import { - BlockEvent, - Finding, - FindingSeverity, - FindingType, - TransactionEvent, - ethers, - filterLog, + BlockEvent, + Finding, + FindingSeverity, + FindingType, + TransactionEvent, + ethers, + filterLog, } from '@fortanetwork/forta-bot' import { Logger } from 'winston' @@ -17,7 +17,11 @@ import { sourceFromEvent } from '../../utils/findings' import { RedefineMode, requireWithTier } from '../../utils/require' import * as Constants from '../constants' -const { DEPLOYED_ADDRESSES } = requireWithTier(module, '../constants', RedefineMode.Merge) +const { DEPLOYED_ADDRESSES } = requireWithTier( + module, + '../constants', + RedefineMode.Merge, +) const ICSModule = CSModule__factory.createInterface() const CHECK_QUEUE_INTERVAL_BLOCKS = 1801 // ~ 4 times a day @@ -26,214 +30,229 @@ const QUEUE_EMPTY_BATCHES_MAX = 30 const QUEUE_VALIDATORS_MAX = 200 class Batch { - value: bigint + value: bigint - constructor(v: bigint) { - this.value = v - } + constructor(v: bigint) { + this.value = v + } - noId(): bigint { - return this.value >> 192n - } + noId(): bigint { + return this.value >> 192n + } - keys(): bigint { - return (this.value >> 128n) & BigInt('0xFFFFFFFFFFFFFFFF') - } + keys(): bigint { + return (this.value >> 128n) & BigInt('0xFFFFFFFFFFFFFFFF') + } - next(): bigint { - return this.value & BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF') - } + next(): bigint { + return this.value & BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF') + } } export class CSModuleSrv { - private readonly logger: Logger - - private lastFiredAt = { - moduleShareIsCloseToTargetShare: 0, - tooManyEmptyBatches: 0, - tooManyValidators: 0, - } - - constructor() { - this.logger = getLogger(CSModuleSrv.name) - } - - async handleBlock(blockEvent: BlockEvent, provider: ethers.Provider): Promise { - return [ - ...(await this.checkDepositQueue(blockEvent, provider)), - ...(await this.checkModuleShare(blockEvent, provider)), - ] - } - - async handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider): Promise { - return this.handleNotableOperatorsCreated(txEvent) - } - - private handleNotableOperatorsCreated(txEvent: TransactionEvent) { - const out: Finding[] = [] - - const nodeOperatorAddedEvents = filterLog( - txEvent.logs, - ICSModule.getEvent('NodeOperatorAdded').format('full'), - DEPLOYED_ADDRESSES.CS_MODULE, - ) - - for (const event of nodeOperatorAddedEvents) { - if (event.args.nodeOperatorId % 100n === 0n || event.args.nodeOperatorId === 69n) { - const f = Finding.fromObject({ - name: `πŸ”΅ CSModule: Notable Node Operator creation`, - description: `Operator #${event.args.nodeOperatorId} was created.`, - alertId: 'CS-MODULE-NOTABLE-NODE-OPERATOR-CREATION', - source: sourceFromEvent(txEvent), - severity: FindingSeverity.Info, - type: FindingType.Info, - }) - out.push(f) - } - } - - return out - } - - private async checkModuleShare(blockEvent: BlockEvent, provider: ethers.Provider): Promise { - const stakingRouter = StakingRouter__factory.connect(DEPLOYED_ADDRESSES.STAKING_ROUTER, provider) - - let totalActiveValidators = 0n - let csmActiveValidators = 0n - let csmTargetShareBP = 0n + private readonly logger: Logger - const digests = await stakingRouter.getAllStakingModuleDigests({ blockTag: blockEvent.blockHash }) - - for (const d of digests) { - const moduleActiveValidators = d.summary.totalDepositedValidators - d.summary.totalExitedValidators - totalActiveValidators += moduleActiveValidators - - if (d.state.stakingModuleAddress === DEPLOYED_ADDRESSES.CS_MODULE) { - csmActiveValidators = moduleActiveValidators - csmTargetShareBP = d.state.targetShare - } + private lastFiredAt = { + moduleShareIsCloseToTargetShare: 0, + tooManyEmptyBatches: 0, + tooManyValidators: 0, } - if (totalActiveValidators === 0n || csmActiveValidators === 0n) { - this.logger.debug('No validators in modules or in the CSM') - return [] + constructor() { + this.logger = getLogger(CSModuleSrv.name) } - if (csmTargetShareBP === 0n) { - this.logger.debug('CSM has no target share') - return [] + async handleBlock(blockEvent: BlockEvent, provider: ethers.Provider): Promise { + return [ + ...(await this.checkDepositQueue(blockEvent, provider)), + ...(await this.checkModuleShare(blockEvent, provider)), + ] } - const csmCurrentShareBP = (csmActiveValidators * BASIS_POINT_MUL) / totalActiveValidators - const percentUsed = (csmCurrentShareBP * 100n) / csmTargetShareBP - - const now = blockEvent.block.timestamp - const out: Finding[] = [] - - if (now - this.lastFiredAt.moduleShareIsCloseToTargetShare > SECONDS_PER_DAY) { - if (percentUsed > TARGET_SHARE_USED_PERCENT_MAX) { - const f = Finding.fromObject({ - name: `🟒 CSModule: Module's share is close to the target share.`, - description: `The module's share is close to the target share (${percentUsed}% utilization). Current share is ${(Number(csmCurrentShareBP * 100n) / Number(BASIS_POINT_MUL)).toFixed(2)}%. Target share is ${(Number(csmTargetShareBP * 100n) / Number(BASIS_POINT_MUL)).toFixed(2)}%`, - alertId: 'CS-MODULE-CLOSE-TO-TARGET-SHARE', - // NOTE: Do not include the source to reach quorum. - // source: sourceFromEvent(blockEvent), - severity: FindingSeverity.Low, - type: FindingType.Info, - }) - out.push(f) - this.lastFiredAt.moduleShareIsCloseToTargetShare = now - } + async handleTransaction( + txEvent: TransactionEvent, + provider: ethers.Provider, + ): Promise { + return this.handleNotableOperatorsCreated(txEvent) } - return out - } - - private async checkDepositQueue(blockEvent: BlockEvent, provider: ethers.Provider): Promise { - if (blockEvent.blockNumber % CHECK_QUEUE_INTERVAL_BLOCKS !== 0 && !IS_CLI) { - return [] + private handleNotableOperatorsCreated(txEvent: TransactionEvent) { + const out: Finding[] = [] + + const nodeOperatorAddedEvents = filterLog( + txEvent.logs, + ICSModule.getEvent('NodeOperatorAdded').format('full'), + DEPLOYED_ADDRESSES.CS_MODULE, + ) + + for (const event of nodeOperatorAddedEvents) { + if (event.args.nodeOperatorId % 100n === 0n || event.args.nodeOperatorId === 69n) { + const f = Finding.fromObject({ + name: `πŸ”΅ CSModule: Notable Node Operator creation`, + description: `Operator #${event.args.nodeOperatorId} was created.`, + alertId: 'CS-MODULE-NOTABLE-NODE-OPERATOR-CREATION', + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Info, + type: FindingType.Info, + }) + out.push(f) + } + } + + return out } - const csm = CSModule__factory.connect(DEPLOYED_ADDRESSES.CS_MODULE, provider) - const ethCallOpts = { blockTag: blockEvent.blockHash } - - const queueLookup: Map = new Map() - let validatorsInQueue = 0n - let emptyBatchCount = 0 - - const queue = await csm.depositQueue(ethCallOpts) - let index = queue.head - - this.logger.debug(`Queue head: ${queue.head}`) - this.logger.debug(`Queue tail: ${queue.tail}`) - - while (index >= queue.head && index < queue.tail) { - const batchValue = await csm.depositQueueItem(index, ethCallOpts) - const batch = new Batch(batchValue) - - // Covers zero-batch case as well. - if (batch.next() === 0n) { - break - } - - const nodeOperatorId = batch.noId() - const keysInBatch = batch.keys() - const no = await csm.getNodeOperator(nodeOperatorId, ethCallOpts) - - const keysSeenForOperator = queueLookup.get(nodeOperatorId) ?? 0n - if (keysSeenForOperator >= no.depositableValidatorsCount) { - emptyBatchCount++ - } else { - const depositableFromBatch = - keysSeenForOperator + keysInBatch > no.depositableValidatorsCount - ? no.depositableValidatorsCount - keysSeenForOperator - : keysInBatch - validatorsInQueue += depositableFromBatch - queueLookup.set(nodeOperatorId, depositableFromBatch) - } - - // TODO: Think about how it works in on-chain code. - index = batch.next() - } - - this.logger.debug(`Empty batches: ${emptyBatchCount}`) - this.logger.debug(`Validators in the queue: ${validatorsInQueue}`) - - const now = blockEvent.block.timestamp - const out: Finding[] = [] - - if (now - this.lastFiredAt.tooManyEmptyBatches > SECONDS_PER_DAY) { - if (emptyBatchCount > QUEUE_EMPTY_BATCHES_MAX) { - const f = Finding.fromObject({ - name: `🟒 CSModule: Too many empty batches in the deposit queue.`, - description: `More than ${QUEUE_EMPTY_BATCHES_MAX} empty batches in the deposit queue.`, - alertId: 'CS-MODULE-TOO-MANY-EMPTY-BATCHES-IN-THE-QUEUE', - // NOTE: Do not include the source to reach quorum. - // source: sourceFromEvent(blockEvent), - severity: FindingSeverity.Low, - type: FindingType.Info, + private async checkModuleShare( + blockEvent: BlockEvent, + provider: ethers.Provider, + ): Promise { + const stakingRouter = StakingRouter__factory.connect( + DEPLOYED_ADDRESSES.STAKING_ROUTER, + provider, + ) + + let totalActiveValidators = 0n + let csmActiveValidators = 0n + let csmTargetShareBP = 0n + + const digests = await stakingRouter.getAllStakingModuleDigests({ + blockTag: blockEvent.blockHash, }) - out.push(f) - this.lastFiredAt.tooManyEmptyBatches = now - } - } - if (now - this.lastFiredAt.tooManyValidators > SECONDS_PER_DAY) { - if (validatorsInQueue > QUEUE_VALIDATORS_MAX) { - const f = Finding.fromObject({ - name: '🟒 CSModule: Too many validators in the queue.', - description: `There's ${validatorsInQueue} keys waiting for deposit in CSM.`, - alertId: 'CS-MODULE-TOO-MANY-VALIDATORS-IN-THE-QUEUE', - // NOTE: Do not include the source to reach quorum. - // source: sourceFromEvent(blockEvent), - severity: FindingSeverity.Low, - type: FindingType.Info, - }) - out.push(f) - this.lastFiredAt.tooManyValidators = now - } + for (const d of digests) { + const moduleActiveValidators = + d.summary.totalDepositedValidators - d.summary.totalExitedValidators + totalActiveValidators += moduleActiveValidators + + if (d.state.stakingModuleAddress === DEPLOYED_ADDRESSES.CS_MODULE) { + csmActiveValidators = moduleActiveValidators + csmTargetShareBP = d.state.targetShare + } + } + + if (totalActiveValidators === 0n || csmActiveValidators === 0n) { + this.logger.debug('No validators in modules or in the CSM') + return [] + } + + if (csmTargetShareBP === 0n) { + this.logger.debug('CSM has no target share') + return [] + } + + const csmCurrentShareBP = (csmActiveValidators * BASIS_POINT_MUL) / totalActiveValidators + const percentUsed = (csmCurrentShareBP * 100n) / csmTargetShareBP + + const now = blockEvent.block.timestamp + const out: Finding[] = [] + + if (now - this.lastFiredAt.moduleShareIsCloseToTargetShare > SECONDS_PER_DAY) { + if (percentUsed > TARGET_SHARE_USED_PERCENT_MAX) { + const f = Finding.fromObject({ + name: `🟒 CSModule: Module's share is close to the target share.`, + description: `The module's share is close to the target share (${percentUsed}% utilization). Current share is ${(Number(csmCurrentShareBP * 100n) / Number(BASIS_POINT_MUL)).toFixed(2)}%. Target share is ${(Number(csmTargetShareBP * 100n) / Number(BASIS_POINT_MUL)).toFixed(2)}%`, + alertId: 'CS-MODULE-CLOSE-TO-TARGET-SHARE', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) + out.push(f) + this.lastFiredAt.moduleShareIsCloseToTargetShare = now + } + } + + return out } - return out - } + private async checkDepositQueue( + blockEvent: BlockEvent, + provider: ethers.Provider, + ): Promise { + if (blockEvent.blockNumber % CHECK_QUEUE_INTERVAL_BLOCKS !== 0 && !IS_CLI) { + return [] + } + + const csm = CSModule__factory.connect(DEPLOYED_ADDRESSES.CS_MODULE, provider) + const ethCallOpts = { blockTag: blockEvent.blockHash } + + const queueLookup: Map = new Map() + let validatorsInQueue = 0n + let emptyBatchCount = 0 + + const queue = await csm.depositQueue(ethCallOpts) + let index = queue.head + + this.logger.debug(`Queue head: ${queue.head}`) + this.logger.debug(`Queue tail: ${queue.tail}`) + + while (index >= queue.head && index < queue.tail) { + const batchValue = await csm.depositQueueItem(index, ethCallOpts) + const batch = new Batch(batchValue) + + // Covers zero-batch case as well. + if (batch.next() === 0n) { + break + } + + const nodeOperatorId = batch.noId() + const keysInBatch = batch.keys() + const no = await csm.getNodeOperator(nodeOperatorId, ethCallOpts) + + const keysSeenForOperator = queueLookup.get(nodeOperatorId) ?? 0n + if (keysSeenForOperator >= no.depositableValidatorsCount) { + emptyBatchCount++ + } else { + const depositableFromBatch = + keysSeenForOperator + keysInBatch > no.depositableValidatorsCount + ? no.depositableValidatorsCount - keysSeenForOperator + : keysInBatch + validatorsInQueue += depositableFromBatch + queueLookup.set(nodeOperatorId, depositableFromBatch) + } + + // TODO: Think about how it works in on-chain code. + index = batch.next() + } + + this.logger.debug(`Empty batches: ${emptyBatchCount}`) + this.logger.debug(`Validators in the queue: ${validatorsInQueue}`) + + const now = blockEvent.block.timestamp + const out: Finding[] = [] + + if (now - this.lastFiredAt.tooManyEmptyBatches > SECONDS_PER_DAY) { + if (emptyBatchCount > QUEUE_EMPTY_BATCHES_MAX) { + const f = Finding.fromObject({ + name: `🟒 CSModule: Too many empty batches in the deposit queue.`, + description: `More than ${QUEUE_EMPTY_BATCHES_MAX} empty batches in the deposit queue.`, + alertId: 'CS-MODULE-TOO-MANY-EMPTY-BATCHES-IN-THE-QUEUE', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) + out.push(f) + this.lastFiredAt.tooManyEmptyBatches = now + } + } + + if (now - this.lastFiredAt.tooManyValidators > SECONDS_PER_DAY) { + if (validatorsInQueue > QUEUE_VALIDATORS_MAX) { + const f = Finding.fromObject({ + name: '🟒 CSModule: Too many validators in the queue.', + description: `There's ${validatorsInQueue} keys waiting for deposit in CSM.`, + alertId: 'CS-MODULE-TOO-MANY-VALIDATORS-IN-THE-QUEUE', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.Low, + type: FindingType.Info, + }) + out.push(f) + this.lastFiredAt.tooManyValidators = now + } + } + + return out + } } diff --git a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.spec.ts b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.spec.ts index 8092f4241..7abae91ea 100644 --- a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.spec.ts +++ b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.spec.ts @@ -1,18 +1,18 @@ import { - CONTRACTS_WITH_ASSET_RECOVERER, - CSM_PROXY_CONTRACTS, - DeploymentAddress, - DeploymentAddresses, - PAUSABLE_CONTRACTS, - ROLES_MONITORING_CONTRACTS, + CONTRACTS_WITH_ASSET_RECOVERER, + CSM_PROXY_CONTRACTS, + DeploymentAddress, + DeploymentAddresses, + PAUSABLE_CONTRACTS, + ROLES_MONITORING_CONTRACTS, } from '../../utils/constants.holesky' import { expect } from '@jest/globals' import { TransactionDto } from '../../entity/events' import { - CSModule__factory, - CSAccounting__factory, - CSFeeDistributor__factory, - CSFeeOracle__factory, + CSModule__factory, + CSAccounting__factory, + CSFeeDistributor__factory, + CSFeeOracle__factory, } from '../../generated/typechain' import { getOssifiedProxyEvents } from '../../utils/events/ossified_proxy_events' import { getPausableEvents } from '../../utils/events/pausable_events' @@ -29,147 +29,156 @@ import { Metrics } from '../../utils/metrics/metrics' const TEST_TIMEOUT = 120_000 // ms describe('ProxyWatcher event tests', () => { - const chainId = 17000 - - const logger: Winston.Logger = Winston.createLogger({ - format: Winston.format.simple(), - transports: [new Winston.transports.Console()], - }) - - const address: DeploymentAddress = DeploymentAddresses - - const fortaEthersProvider = new ethers.providers.JsonRpcProvider(getFortaConfig().jsonRpcUrl, chainId) - const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) - const csAccountingRunner = CSAccounting__factory.connect(address.CS_ACCOUNTING_ADDRESS, fortaEthersProvider) - const csFeeDistributorRunner = CSFeeDistributor__factory.connect( - address.CS_FEE_DISTRIBUTOR_ADDRESS, - fortaEthersProvider, - ) - const csFeeOracleRunner = CSFeeOracle__factory.connect(address.CS_FEE_ORACLE_ADDRESS, fortaEthersProvider) - - const registry = new promClient.Registry() - const m = new Metrics(registry, 'test_') - - const proxyWatcherClient: IProxyWatcherClient = new ETHProvider( - logger, - m, - fortaEthersProvider, - csModuleRunner, - csAccountingRunner, - csFeeDistributorRunner, - csFeeOracleRunner, - ) - - const proxyWatcherSrv = new ProxyWatcherSrv( - logger, - proxyWatcherClient, - getOssifiedProxyEvents(CSM_PROXY_CONTRACTS), - getPausableEvents(PAUSABLE_CONTRACTS), - getAssetRecovererEvents(CONTRACTS_WITH_ASSET_RECOVERER), - getRolesMonitoringEvents(ROLES_MONITORING_CONTRACTS), - ) - - test( - '🚨 Proxy Watcher: Admin Changed', - async () => { - const txHash = '0x92410350f567757d8f73b2f4b3670454af3899d095103ea0e745c92714673277' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + const chainId = 17000 + + const logger: Winston.Logger = Winston.createLogger({ + format: Winston.format.simple(), + transports: [new Winston.transports.Console()], + }) + + const address: DeploymentAddress = DeploymentAddresses + + const fortaEthersProvider = new ethers.providers.JsonRpcProvider( + getFortaConfig().jsonRpcUrl, + chainId, + ) + const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) + const csAccountingRunner = CSAccounting__factory.connect( + address.CS_ACCOUNTING_ADDRESS, + fortaEthersProvider, + ) + const csFeeDistributorRunner = CSFeeDistributor__factory.connect( + address.CS_FEE_DISTRIBUTOR_ADDRESS, + fortaEthersProvider, + ) + const csFeeOracleRunner = CSFeeOracle__factory.connect( + address.CS_FEE_ORACLE_ADDRESS, + fortaEthersProvider, + ) + + const registry = new promClient.Registry() + const m = new Metrics(registry, 'test_') + + const proxyWatcherClient: IProxyWatcherClient = new ETHProvider( + logger, + m, + fortaEthersProvider, + csModuleRunner, + csAccountingRunner, + csFeeDistributorRunner, + csFeeOracleRunner, + ) + + const proxyWatcherSrv = new ProxyWatcherSrv( + logger, + proxyWatcherClient, + getOssifiedProxyEvents(CSM_PROXY_CONTRACTS), + getPausableEvents(PAUSABLE_CONTRACTS), + getAssetRecovererEvents(CONTRACTS_WITH_ASSET_RECOVERER), + getRolesMonitoringEvents(ROLES_MONITORING_CONTRACTS), + ) + + test( + '🚨 Proxy Watcher: Admin Changed', + async () => { + const txHash = '0x92410350f567757d8f73b2f4b3670454af3899d095103ea0e745c92714673277' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = proxyWatcherSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(4) }, - hash: trx.hash, - } - - const results = proxyWatcherSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(4) - }, - TEST_TIMEOUT, - ) - - test( - '🚨 Proxy Watcher: Implementation Upgraded', - async () => { - const txHash = '0x262faac95560f7fc0c831580d17e48daa69b17831b798e0b00bc43168a310c52' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + '🚨 Proxy Watcher: Implementation Upgraded', + async () => { + const txHash = '0x262faac95560f7fc0c831580d17e48daa69b17831b798e0b00bc43168a310c52' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = proxyWatcherSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(4) }, - hash: trx.hash, - } - - const results = proxyWatcherSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(4) - }, - TEST_TIMEOUT, - ) - - test( - '🚨 Proxy Watcher: Paused', - async () => { - const txHash = '0x56a49219b4e40d146c0dc11d795b6d43696947f0ceb63fad7e9b820eab2b3e14' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + '🚨 Proxy Watcher: Paused', + async () => { + const txHash = '0x56a49219b4e40d146c0dc11d795b6d43696947f0ceb63fad7e9b820eab2b3e14' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = proxyWatcherSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(3) }, - hash: trx.hash, - } - - const results = proxyWatcherSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(3) - }, - TEST_TIMEOUT, - ) - - test( - '🚨 Proxy Watcher: Resumed', - async () => { - const txHash = '0xa44ac96956f254fe1b9d6ff0a60ad2b5b4a7eaff951eb98150c0f7bbe90dc5df' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, + TEST_TIMEOUT, + ) + + test( + '🚨 Proxy Watcher: Resumed', + async () => { + const txHash = '0xa44ac96956f254fe1b9d6ff0a60ad2b5b4a7eaff951eb98150c0f7bbe90dc5df' + + const trx = await fortaEthersProvider.getTransaction(txHash) + const receipt = await trx.wait() + + const transactionDto: TransactionDto = { + logs: receipt.logs, + to: trx.to ? trx.to : null, + block: { + timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), + number: trx.blockNumber ? trx.blockNumber : 1, + }, + hash: trx.hash, + } + + const results = proxyWatcherSrv.handleTransaction(transactionDto) + + expect(results).toMatchSnapshot() + expect(results.length).toBe(3) }, - hash: trx.hash, - } - - const results = proxyWatcherSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(3) - }, - TEST_TIMEOUT, - ) + TEST_TIMEOUT, + ) }) diff --git a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts index 46d891539..0407680e2 100644 --- a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts +++ b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts @@ -7,62 +7,61 @@ import * as Constants from '../constants' import * as Events from './events' const { ALIASES, DEPLOYED_ADDRESSES, ORACLE_MEMBERS } = requireWithTier( - module, - '../constants', - RedefineMode.Merge, + module, + '../constants', + RedefineMode.Merge, ) function asContract(key: keyof DeployedAddresses): { name: string; address: string } { - return { name: ALIASES[key], address: DEPLOYED_ADDRESSES[key] } + return { name: ALIASES[key], address: DEPLOYED_ADDRESSES[key] } } const CSM_PROXY_CONTRACTS = [ - asContract('CS_MODULE'), - asContract('CS_ACCOUNTING'), - asContract('CS_FEE_DISTRIBUTOR'), - asContract('CS_FEE_ORACLE'), + asContract('CS_MODULE'), + asContract('CS_ACCOUNTING'), + asContract('CS_FEE_DISTRIBUTOR'), + asContract('CS_FEE_ORACLE'), ] const CSM_ACL_CONTRACTS = [ - asContract('CS_MODULE'), - asContract('CS_ACCOUNTING'), - asContract('CS_FEE_DISTRIBUTOR'), - asContract('CS_FEE_ORACLE'), - asContract('HASH_CONSENSUS'), + asContract('CS_MODULE'), + asContract('CS_ACCOUNTING'), + asContract('CS_FEE_DISTRIBUTOR'), + asContract('CS_FEE_ORACLE'), + asContract('HASH_CONSENSUS'), ] const CSM_ASSET_RECOVERER_CONTRACTS = [ - asContract('CS_MODULE'), - asContract('CS_ACCOUNTING'), - asContract('CS_FEE_DISTRIBUTOR'), - asContract('CS_FEE_ORACLE'), + asContract('CS_MODULE'), + asContract('CS_ACCOUNTING'), + asContract('CS_FEE_DISTRIBUTOR'), + asContract('CS_FEE_ORACLE'), ] -// prettier-ignore const CSM_PAUSABLE_CONTRACTS = [ - asContract('CS_MODULE'), - asContract('CS_ACCOUNTING'), - asContract('CS_FEE_ORACLE'), + asContract('CS_MODULE'), + asContract('CS_ACCOUNTING'), + asContract('CS_FEE_ORACLE'), ] export class EventsWatcherSrv { - private readonly eventsOfNotice: EventOfNotice[] + private readonly eventsOfNotice: EventOfNotice[] - constructor() { - this.eventsOfNotice = [ - ...Events.getHashConsensusEvents(DEPLOYED_ADDRESSES.HASH_CONSENSUS, ORACLE_MEMBERS), - ...Events.getCSFeeDistributorEvents(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR), - ...Events.getCSAccountingEvents(DEPLOYED_ADDRESSES.CS_ACCOUNTING), - ...Events.getCSFeeOracleEvents(DEPLOYED_ADDRESSES.CS_FEE_ORACLE), - ...Events.getCSModuleEvents(DEPLOYED_ADDRESSES.CS_MODULE), - ...Events.getAssetRecovererEvents(CSM_ASSET_RECOVERER_CONTRACTS), - ...Events.getOssifiedProxyEvents(CSM_PROXY_CONTRACTS), - ...Events.getRolesMonitoringEvents(CSM_ACL_CONTRACTS), - ...Events.getPausableEvents(CSM_PAUSABLE_CONTRACTS), - ] - } + constructor() { + this.eventsOfNotice = [ + ...Events.getHashConsensusEvents(DEPLOYED_ADDRESSES.HASH_CONSENSUS, ORACLE_MEMBERS), + ...Events.getCSFeeDistributorEvents(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR), + ...Events.getCSAccountingEvents(DEPLOYED_ADDRESSES.CS_ACCOUNTING), + ...Events.getCSFeeOracleEvents(DEPLOYED_ADDRESSES.CS_FEE_ORACLE), + ...Events.getCSModuleEvents(DEPLOYED_ADDRESSES.CS_MODULE), + ...Events.getAssetRecovererEvents(CSM_ASSET_RECOVERER_CONTRACTS), + ...Events.getOssifiedProxyEvents(CSM_PROXY_CONTRACTS), + ...Events.getRolesMonitoringEvents(CSM_ACL_CONTRACTS), + ...Events.getPausableEvents(CSM_PAUSABLE_CONTRACTS), + ] + } - public handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider): Finding[] { - return handleEventsOfNotice(txEvent, this.eventsOfNotice) - } + public handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider): Finding[] { + return handleEventsOfNotice(txEvent, this.eventsOfNotice) + } } diff --git a/csm-alerts/src/services/EventsWatcher/events/accounting.ts b/csm-alerts/src/services/EventsWatcher/events/accounting.ts index c8896643c..f83018bbf 100644 --- a/csm-alerts/src/services/EventsWatcher/events/accounting.ts +++ b/csm-alerts/src/services/EventsWatcher/events/accounting.ts @@ -7,40 +7,44 @@ import { etherscanAddress, formatEther } from '../../../utils/string' const ICSAccounting = CSAccounting__factory.createInterface() export function getCSAccountingEvents(accounting: string): EventOfNotice[] { - return [ - { - address: accounting, - abi: ICSAccounting.getEvent('ChargePenaltyRecipientSet').format('full'), - alertId: 'CS-ACCOUNTING-CHARGE-PENALTY-RECIPIENT-SET', - name: '🚨 CSAccounting: Charge penalty recipient set', - description: (args: ethers.Result) => - `Charge penalty recipient set to ${etherscanAddress(args.chargeRecipient)} (expecting the treasury)`, - severity: FindingSeverity.Critical, - type: FindingType.Info, - }, - { - address: accounting, - abi: ICSAccounting.getEvent('BondCurveUpdated').format('full'), - alertId: 'CS-ACCOUNTING-BOND-CURVE-UPDATED', - name: '🚨 CSAccounting: Bond curve updated', - description: (args: ethers.Result) => { - const bondCurveString = args.bondCurve.map((value: bigint) => formatEther(value)).join(', ') - return `Bond curve #${args.curveId} updated. New values: [${bondCurveString}]` - }, - severity: FindingSeverity.Critical, - type: FindingType.Info, - }, - { - address: accounting, - abi: ICSAccounting.getEvent('BondCurveAdded').format('full'), - alertId: 'CS-ACCOUNTING-BOND-CURVE-ADDED', - name: 'πŸ”΄ CSAccounting: Bond curve added', - description: (args: ethers.Result) => { - const bondCurveString = args.bondCurve.map((value: bigint) => formatEther(value)).join(', ') - return `Bond curve added: [${bondCurveString}]` - }, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - ] + return [ + { + address: accounting, + abi: ICSAccounting.getEvent('ChargePenaltyRecipientSet').format('full'), + alertId: 'CS-ACCOUNTING-CHARGE-PENALTY-RECIPIENT-SET', + name: '🚨 CSAccounting: Charge penalty recipient set', + description: (args: ethers.Result) => + `Charge penalty recipient set to ${etherscanAddress(args.chargeRecipient)} (expecting the treasury)`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: accounting, + abi: ICSAccounting.getEvent('BondCurveUpdated').format('full'), + alertId: 'CS-ACCOUNTING-BOND-CURVE-UPDATED', + name: '🚨 CSAccounting: Bond curve updated', + description: (args: ethers.Result) => { + const bondCurveString = args.bondCurve + .map((value: bigint) => formatEther(value)) + .join(', ') + return `Bond curve #${args.curveId} updated. New values: [${bondCurveString}]` + }, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: accounting, + abi: ICSAccounting.getEvent('BondCurveAdded').format('full'), + alertId: 'CS-ACCOUNTING-BOND-CURVE-ADDED', + name: 'πŸ”΄ CSAccounting: Bond curve added', + description: (args: ethers.Result) => { + const bondCurveString = args.bondCurve + .map((value: bigint) => formatEther(value)) + .join(', ') + return `Bond curve added: [${bondCurveString}]` + }, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + ] } diff --git a/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts b/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts index 07a4196c9..08634cfee 100644 --- a/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts +++ b/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts @@ -6,73 +6,75 @@ import { etherscanAddress, formatEther, formatShares } from '../../../utils/stri const IAssetRecoverer = AssetRecoverer__factory.createInterface() -export function getAssetRecovererEvents(contracts: { name: string; address: string }[]): EventOfNotice[] { - return contracts.flatMap((contract) => { - return [ - { - address: contract.address, - abi: IAssetRecoverer.getEvent('ERC20Recovered').format('full'), - alertId: 'ASSET-RECOVERER-ERC20-RECOVERED', - name: 'πŸ”΄ AssetRecoverer: ERC20 recovered', - description: (args: ethers.Result) => - `ERC20 recovered on ${contract.name}:\n` + - `Recipient: ${etherscanAddress(args.recipient)}\n` + - `Token: ${etherscanAddress(args.token)}\n` + - `Amount: ${args.amount}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address: contract.address, - abi: IAssetRecoverer.getEvent('ERC721Recovered').format('full'), - alertId: 'ASSET-RECOVERER-ERC721-RECOVERED', - name: 'πŸ”΄ AssetRecoverer: ERC721 recovered', - description: (args: ethers.Result) => - `ERC721 recovered on ${contract.name}:\n` + - `Recipient: ${etherscanAddress(args.recipient)}\n` + - `Token: ${etherscanAddress(args.token)}\n` + - `Token ID: ${args.tokenId}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address: contract.address, - abi: IAssetRecoverer.getEvent('ERC1155Recovered').format('full'), - alertId: 'ASSET-RECOVERER-ERC1155-RECOVERED', - name: 'πŸ”΄ AssetRecoverer: ERC1155 recovered', - description: (args: ethers.Result) => - `ERC1155 recovered on ${contract.name}:\n` + - `Recipient: ${etherscanAddress(args.recipient)}\n` + - `Token: ${etherscanAddress(args.token)}\n` + - `Token ID: ${args.tokenId}\n` + - `Amount: ${args.amount}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address: contract.address, - abi: IAssetRecoverer.getEvent('EtherRecovered').format('full'), - alertId: 'ASSET-RECOVERER-ETHER-RECOVERED', - name: 'πŸ”΄ AssetRecoverer: Ether recovered', - description: (args: ethers.Result) => - `Ether recovered on ${contract.name}:\n` + - `Recipient: ${etherscanAddress(args.recipient)}\n` + - `Amount: ${formatEther(args.amount)}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address: contract.address, - abi: IAssetRecoverer.getEvent('StETHSharesRecovered').format('full'), - alertId: 'ASSET-RECOVERER-STETH-SHARES-RECOVERED', - name: 'πŸ”΄ AssetRecoverer: StETH Shares recovered', - description: (args: ethers.Result) => - `StETH Shares recovered on ${contract.name}:\n` + - `Recipient: ${etherscanAddress(args.recipient)}\n` + - `Amount: ${formatShares(args.shares)}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - ] - }) +export function getAssetRecovererEvents( + contracts: { name: string; address: string }[], +): EventOfNotice[] { + return contracts.flatMap((contract) => { + return [ + { + address: contract.address, + abi: IAssetRecoverer.getEvent('ERC20Recovered').format('full'), + alertId: 'ASSET-RECOVERER-ERC20-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: ERC20 recovered', + description: (args: ethers.Result) => + `ERC20 recovered on ${contract.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Token: ${etherscanAddress(args.token)}\n` + + `Amount: ${args.amount}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IAssetRecoverer.getEvent('ERC721Recovered').format('full'), + alertId: 'ASSET-RECOVERER-ERC721-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: ERC721 recovered', + description: (args: ethers.Result) => + `ERC721 recovered on ${contract.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Token: ${etherscanAddress(args.token)}\n` + + `Token ID: ${args.tokenId}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IAssetRecoverer.getEvent('ERC1155Recovered').format('full'), + alertId: 'ASSET-RECOVERER-ERC1155-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: ERC1155 recovered', + description: (args: ethers.Result) => + `ERC1155 recovered on ${contract.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Token: ${etherscanAddress(args.token)}\n` + + `Token ID: ${args.tokenId}\n` + + `Amount: ${args.amount}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IAssetRecoverer.getEvent('EtherRecovered').format('full'), + alertId: 'ASSET-RECOVERER-ETHER-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: Ether recovered', + description: (args: ethers.Result) => + `Ether recovered on ${contract.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Amount: ${formatEther(args.amount)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IAssetRecoverer.getEvent('StETHSharesRecovered').format('full'), + alertId: 'ASSET-RECOVERER-STETH-SHARES-RECOVERED', + name: 'πŸ”΄ AssetRecoverer: StETH Shares recovered', + description: (args: ethers.Result) => + `StETH Shares recovered on ${contract.name}:\n` + + `Recipient: ${etherscanAddress(args.recipient)}\n` + + `Amount: ${formatShares(args.shares)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + ] + }) } diff --git a/csm-alerts/src/services/EventsWatcher/events/distributor.ts b/csm-alerts/src/services/EventsWatcher/events/distributor.ts index 0c57acf43..0162cc30a 100644 --- a/csm-alerts/src/services/EventsWatcher/events/distributor.ts +++ b/csm-alerts/src/services/EventsWatcher/events/distributor.ts @@ -6,27 +6,27 @@ import { EventOfNotice } from '../../../shared/types' const ICSFeeDistributor = CSFeeDistributor__factory.createInterface() export function getCSFeeDistributorEvents(distributorAddress: string): EventOfNotice[] { - return [ - { - address: distributorAddress, - abi: ICSFeeDistributor.getEvent('DistributionDataUpdated').format('full'), - alertId: 'CSFEE-DISTRIBUTOR-DISTRIBUTION-DATA-UPDATED', - name: 'πŸ”΅ CSFeeDistributor: Distribution data updated', - description: (args: ethers.Result) => - `Total Claimable Shares: ${args.totalClaimableShares}\n` + - `Tree Root: ${args.treeRoot}\n` + - `Tree CID: ${args.treeCid}`, - severity: FindingSeverity.Info, - type: FindingType.Info, - }, - { - address: distributorAddress, - abi: ICSFeeDistributor.getEvent('DistributionLogUpdated').format('full'), - alertId: 'CSFEE-DISTRIBUTOR-DISTRIBUTION-LOG-UPDATED', - name: 'πŸ”΅ CSFeeDistributor: Distribution log updated', - description: (args: ethers.Result) => `Log CID: ${args.logCid}`, - severity: FindingSeverity.Info, - type: FindingType.Info, - }, - ] + return [ + { + address: distributorAddress, + abi: ICSFeeDistributor.getEvent('DistributionDataUpdated').format('full'), + alertId: 'CSFEE-DISTRIBUTOR-DISTRIBUTION-DATA-UPDATED', + name: 'πŸ”΅ CSFeeDistributor: Distribution data updated', + description: (args: ethers.Result) => + `Total Claimable Shares: ${args.totalClaimableShares}\n` + + `Tree Root: ${args.treeRoot}\n` + + `Tree CID: ${args.treeCid}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + { + address: distributorAddress, + abi: ICSFeeDistributor.getEvent('DistributionLogUpdated').format('full'), + alertId: 'CSFEE-DISTRIBUTOR-DISTRIBUTION-LOG-UPDATED', + name: 'πŸ”΅ CSFeeDistributor: Distribution log updated', + description: (args: ethers.Result) => `Log CID: ${args.logCid}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + ] } diff --git a/csm-alerts/src/services/EventsWatcher/events/module.ts b/csm-alerts/src/services/EventsWatcher/events/module.ts index 16d8d6987..8729db654 100644 --- a/csm-alerts/src/services/EventsWatcher/events/module.ts +++ b/csm-alerts/src/services/EventsWatcher/events/module.ts @@ -7,76 +7,81 @@ import { formatEther } from '../../../utils/string' const ICSModule = CSModule__factory.createInterface() export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { - return [ - { - address: csmAddress, - abi: ICSModule.getEvent('PublicRelease').format('full'), - alertId: 'CS-MODULE-PUBLIC-RELEASE', - name: 'πŸ”΅ CSModule: Public release', - description: () => 'CSM public release is activated! πŸ₯³', - severity: FindingSeverity.Info, - type: FindingType.Info, - }, - { - address: csmAddress, - abi: ICSModule.getEvent('VettedSigningKeysCountDecreased').format('full'), - alertId: 'CS-MODULE-VETTED-SIGNING-KEYS-DECREASED', - name: 'πŸ”΅ CSModule: Node Operator vetted signing keys decreased', - description: (args: ethers.Result) => `Vetted signing keys decreased for Node Operator #${args.nodeOperatorId}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address: csmAddress, - abi: ICSModule.getEvent('TargetValidatorsCountChanged').format('full'), - alertId: 'CS-MODULE-TARGET-LIMIT-MODE-CHANGED', - name: '🟠 CSModule: Target limit mode changed', - description: (args: ethers.Result) => - `Target limit mode: ${args.targetLimitMode} (${ - args.targetLimitMode === 0n ? 'disabled' : args.targetLimitMode === 1n ? 'soft' : 'forced' - }) set for Node Operator ${args.nodeOperatorId}`, - severity: FindingSeverity.Medium, - type: FindingType.Info, - }, - { - address: csmAddress, - abi: ICSModule.getEvent('ELRewardsStealingPenaltyReported').format('full'), - alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-REPORTED', - name: 'πŸ”΄ CSModule: EL Rewards stealing penalty reported', - description: (args: ethers.Result) => - `EL Rewards stealing penalty reported for Node Operator #${args.nodeOperatorId} with ${formatEther(args.stolenAmount)} potentially stolen`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address: csmAddress, - abi: ICSModule.getEvent('ELRewardsStealingPenaltyCancelled').format('full'), - alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-CANCELLED', - name: 'πŸ”΄ CSModule: EL Rewards stealing penalty cancelled', - description: (args: ethers.Result) => - `EL Rewards stealing penalty (${formatEther(args.amount)}) cancelled for Node Operator #${args.nodeOperatorId}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address: csmAddress, - abi: ICSModule.getEvent('ELRewardsStealingPenaltySettled').format('full'), - alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-SETTLED', - name: 'πŸ”΄ CSModule: EL Rewards stealing penalty settled', - description: (args: ethers.Result) => - `EL Rewards stealing penalty settled for Node Operator #${args.nodeOperatorId}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address: csmAddress, - abi: ICSModule.getEvent('ELRewardsStealingPenaltyCompensated').format('full'), - alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-COMPENSATED', - name: 'πŸ”΄ CSModule: EL Rewards stealing penalty compensated', - description: (args: ethers.Result) => - `${formatEther(args.stolenAmount)} of EL Rewards stealing penalty was compensated for Node Operator #${args.nodeOperatorId}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - ] + return [ + { + address: csmAddress, + abi: ICSModule.getEvent('PublicRelease').format('full'), + alertId: 'CS-MODULE-PUBLIC-RELEASE', + name: 'πŸ”΅ CSModule: Public release', + description: () => 'CSM public release is activated! πŸ₯³', + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + { + address: csmAddress, + abi: ICSModule.getEvent('VettedSigningKeysCountDecreased').format('full'), + alertId: 'CS-MODULE-VETTED-SIGNING-KEYS-DECREASED', + name: 'πŸ”΅ CSModule: Node Operator vetted signing keys decreased', + description: (args: ethers.Result) => + `Vetted signing keys decreased for Node Operator #${args.nodeOperatorId}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: csmAddress, + abi: ICSModule.getEvent('TargetValidatorsCountChanged').format('full'), + alertId: 'CS-MODULE-TARGET-LIMIT-MODE-CHANGED', + name: '🟠 CSModule: Target limit mode changed', + description: (args: ethers.Result) => + `Target limit mode: ${args.targetLimitMode} (${ + args.targetLimitMode === 0n + ? 'disabled' + : args.targetLimitMode === 1n + ? 'soft' + : 'forced' + }) set for Node Operator ${args.nodeOperatorId}`, + severity: FindingSeverity.Medium, + type: FindingType.Info, + }, + { + address: csmAddress, + abi: ICSModule.getEvent('ELRewardsStealingPenaltyReported').format('full'), + alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-REPORTED', + name: 'πŸ”΄ CSModule: EL Rewards stealing penalty reported', + description: (args: ethers.Result) => + `EL Rewards stealing penalty reported for Node Operator #${args.nodeOperatorId} with ${formatEther(args.stolenAmount)} potentially stolen`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: csmAddress, + abi: ICSModule.getEvent('ELRewardsStealingPenaltyCancelled').format('full'), + alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-CANCELLED', + name: 'πŸ”΄ CSModule: EL Rewards stealing penalty cancelled', + description: (args: ethers.Result) => + `EL Rewards stealing penalty (${formatEther(args.amount)}) cancelled for Node Operator #${args.nodeOperatorId}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: csmAddress, + abi: ICSModule.getEvent('ELRewardsStealingPenaltySettled').format('full'), + alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-SETTLED', + name: 'πŸ”΄ CSModule: EL Rewards stealing penalty settled', + description: (args: ethers.Result) => + `EL Rewards stealing penalty settled for Node Operator #${args.nodeOperatorId}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address: csmAddress, + abi: ICSModule.getEvent('ELRewardsStealingPenaltyCompensated').format('full'), + alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-COMPENSATED', + name: 'πŸ”΄ CSModule: EL Rewards stealing penalty compensated', + description: (args: ethers.Result) => + `${formatEther(args.stolenAmount)} of EL Rewards stealing penalty was compensated for Node Operator #${args.nodeOperatorId}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + ] } diff --git a/csm-alerts/src/services/EventsWatcher/events/oracle.ts b/csm-alerts/src/services/EventsWatcher/events/oracle.ts index be01d606f..9d19fe42a 100644 --- a/csm-alerts/src/services/EventsWatcher/events/oracle.ts +++ b/csm-alerts/src/services/EventsWatcher/events/oracle.ts @@ -7,170 +7,175 @@ import { etherscanAddress } from '../../../utils/string' const IHashConsensus = HashConsensus__factory.createInterface() const ICSFeeOracle = CSFeeOracle__factory.createInterface() -export function getHashConsensusEvents(address: string, knownMembers: { [key: string]: string }): EventOfNotice[] { - return [ - { - address, - abi: IHashConsensus.getEvent('MemberAdded').format('full'), - alertId: 'HASH-CONSENSUS-MEMBER-ADDED', - name: 'πŸ”΄ HashConsensus: Member added', - description: (args: ethers.Result) => - `New member ${etherscanAddress(args.addr)} (${knownMembers[args.addr] ?? 'unknown'}) added\n` + - `Total members: ${args.newTotalMembers}\n` + - `New quorum: ${args.newQuorum}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('MemberRemoved').format('full'), - alertId: 'HASH-CONSENSUS-MEMBER-REMOVED', - name: 'πŸ”΄ HashConsensus: Member removed', - description: (args: ethers.Result) => - `Member ${etherscanAddress(args.addr)} (${knownMembers[args.addr] ?? 'unknown'}) removed\n` + - `Total members: ${args.newTotalMembers}\n` + - `New quorum: ${args.newQuorum}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('QuorumSet').format('full'), - alertId: 'HASH-CONSENSUS-QUORUM-SET', - name: 'πŸ”΄ HashConsensus: Quorum set', - description: (args: ethers.Result) => - `Quorum set to ${args.newQuorum}.\n` + - `Total members: ${args.totalMembers}\n` + - `Previous quorum: ${args.prevQuorum}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('FastLaneConfigSet').format('full'), - alertId: 'HASH-CONSENSUS-FASTLANE-CONFIG-SET', - name: 'πŸ”΄ HashConsensus: Fastlane config set', - description: (args: ethers.Result) => `Fastlane configuration set with length slots: ${args.fastLaneLengthSlots}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('FrameConfigSet').format('full'), - alertId: 'HASH-CONSENSUS-FRAME-CONFIG-SET', - name: 'πŸ”΄ HashConsensus: Frame config set', - description: (args: ethers.Result) => - `Frame configuration set.\n` + - `New initial epoch: ${args.newInitialEpoch}\n` + - `Epochs per frame: ${args.newEpochsPerFrame}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('ReportProcessorSet').format('full'), - alertId: 'HASH-CONSENSUS-REPORT-PROCESSOR-SET', - name: 'πŸ”΄ HashConsensus: Report processor set', - description: (args: ethers.Result) => - `Current processor: ${etherscanAddress(args.processor)}\nPrevious processor: ${etherscanAddress(args.prevProcessor)}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('ConsensusLost').format('full'), - alertId: 'HASH-CONSENSUS-LOST', - name: 'πŸ”΄ HashConsensus: Consensus lost', - description: (args: ethers.Result) => `Consensus lost for slot ${args.refSlot}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('ConsensusReached').format('full'), - alertId: 'HASH-CONSENSUS-REACHED', - name: 'πŸ”΅ HashConsensus: Consensus reached, report received', - // prettier-ignore - description: (args: ethers.Result) => - `Consensus reached for slot ${args.refSlot}\n` + - `Report hash: ${args.report}\n` + - `Support: ${args.support}`, - severity: FindingSeverity.Info, - type: FindingType.Info, - }, - ] +export function getHashConsensusEvents( + address: string, + knownMembers: { [key: string]: string }, +): EventOfNotice[] { + return [ + { + address, + abi: IHashConsensus.getEvent('MemberAdded').format('full'), + alertId: 'HASH-CONSENSUS-MEMBER-ADDED', + name: 'πŸ”΄ HashConsensus: Member added', + description: (args: ethers.Result) => + `New member ${etherscanAddress(args.addr)} (${knownMembers[args.addr] ?? 'unknown'}) added\n` + + `Total members: ${args.newTotalMembers}\n` + + `New quorum: ${args.newQuorum}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('MemberRemoved').format('full'), + alertId: 'HASH-CONSENSUS-MEMBER-REMOVED', + name: 'πŸ”΄ HashConsensus: Member removed', + description: (args: ethers.Result) => + `Member ${etherscanAddress(args.addr)} (${knownMembers[args.addr] ?? 'unknown'}) removed\n` + + `Total members: ${args.newTotalMembers}\n` + + `New quorum: ${args.newQuorum}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('QuorumSet').format('full'), + alertId: 'HASH-CONSENSUS-QUORUM-SET', + name: 'πŸ”΄ HashConsensus: Quorum set', + description: (args: ethers.Result) => + `Quorum set to ${args.newQuorum}.\n` + + `Total members: ${args.totalMembers}\n` + + `Previous quorum: ${args.prevQuorum}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('FastLaneConfigSet').format('full'), + alertId: 'HASH-CONSENSUS-FASTLANE-CONFIG-SET', + name: 'πŸ”΄ HashConsensus: Fastlane config set', + description: (args: ethers.Result) => + `Fastlane configuration set with length slots: ${args.fastLaneLengthSlots}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('FrameConfigSet').format('full'), + alertId: 'HASH-CONSENSUS-FRAME-CONFIG-SET', + name: 'πŸ”΄ HashConsensus: Frame config set', + description: (args: ethers.Result) => + `Frame configuration set.\n` + + `New initial epoch: ${args.newInitialEpoch}\n` + + `Epochs per frame: ${args.newEpochsPerFrame}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('ReportProcessorSet').format('full'), + alertId: 'HASH-CONSENSUS-REPORT-PROCESSOR-SET', + name: 'πŸ”΄ HashConsensus: Report processor set', + description: (args: ethers.Result) => + `Current processor: ${etherscanAddress(args.processor)}\nPrevious processor: ${etherscanAddress(args.prevProcessor)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('ConsensusLost').format('full'), + alertId: 'HASH-CONSENSUS-LOST', + name: 'πŸ”΄ HashConsensus: Consensus lost', + description: (args: ethers.Result) => `Consensus lost for slot ${args.refSlot}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('ConsensusReached').format('full'), + alertId: 'HASH-CONSENSUS-REACHED', + name: 'πŸ”΅ HashConsensus: Consensus reached, report received', + description: (args: ethers.Result) => + `Consensus reached for slot ${args.refSlot}\n` + + `Report hash: ${args.report}\n` + + `Support: ${args.support}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + ] } export function getCSFeeOracleEvents(address: string): EventOfNotice[] { - return [ - { - address, - abi: ICSFeeOracle.getEvent('ConsensusHashContractSet').format('full'), - alertId: 'CSFEE-ORACLE-CONSENSUS-HASH-CONTRACT-SET', - name: '🚨 CSFeeOracle: Consensus hash contract set', - description: (args: ethers.Result) => - `Consensus hash contract set to ${etherscanAddress(args.addr)}, previous contract was ${etherscanAddress(args.prevAddr)}`, - severity: FindingSeverity.Critical, - type: FindingType.Info, - }, - { - address, - abi: ICSFeeOracle.getEvent('PerfLeewaySet').format('full'), - alertId: 'CSFEE-ORACLE-PERF-LEEWAY-SET', - name: 'πŸ”΄ CSFeeOracle: Performance leeway updated', - description: (args: ethers.Result) => `Performance leeway set to ${args.valueBP} basis points`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: ICSFeeOracle.getEvent('FeeDistributorContractSet').format('full'), - alertId: 'CSFEE-ORACLE-FEE-DISTRIBUTOR-CONTRACT-SET', - name: 'πŸ”΄ CSFeeOracle: New CSFeeDistributor set', - description: (args: ethers.Result) => - `New CSFeeDistributor contract set to ${etherscanAddress(args.feeDistributorContract)}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: ICSFeeOracle.getEvent('ConsensusVersionSet').format('full'), - alertId: 'CSFEE-ORACLE-CONSENSUS-VERSION-SET', - name: 'πŸ”΄ CSFeeOracle: Consensus version set', - description: (args: ethers.Result) => - `Consensus version set to ${args.version}, previous version was ${args.prevVersion}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: ICSFeeOracle.getEvent('WarnProcessingMissed').format('full'), - alertId: 'CSFEE-ORACLE-PROCESSING-MISSED', - name: 'πŸ”΅ CSFeeOracle: Processing missed', - description: (args: ethers.Result) => `Processing missed for slot ${args.refSlot}`, - severity: FindingSeverity.Info, - type: FindingType.Info, - }, - { - address, - abi: ICSFeeOracle.getEvent('ReportSubmitted').format('full'), - alertId: 'CSFEE-ORACLE-REPORT-SUBMITTED', - name: 'πŸ”΅ CSFeeOracle: Report submitted', - description: (args: ethers.Result) => - `Report submitted for slot ${args.refSlot}\n` + - `Report hash: ${args.hash}\n` + - `Processing deadline time: ${args.processingDeadlineTime}`, - severity: FindingSeverity.Info, - type: FindingType.Info, - }, - { - address, - abi: ICSFeeOracle.getEvent('ProcessingStarted').format('full'), - alertId: 'CSFEE-ORACLE-PROCESSING-STARTED', - name: 'πŸ”΅ CSFeeOracle: Processing started', - description: (args: ethers.Result) => `Processing started for slot ${args.refSlot}\nReport hash: ${args.hash}`, - severity: FindingSeverity.Info, - type: FindingType.Info, - }, - ] + return [ + { + address, + abi: ICSFeeOracle.getEvent('ConsensusHashContractSet').format('full'), + alertId: 'CSFEE-ORACLE-CONSENSUS-HASH-CONTRACT-SET', + name: '🚨 CSFeeOracle: Consensus hash contract set', + description: (args: ethers.Result) => + `Consensus hash contract set to ${etherscanAddress(args.addr)}, previous contract was ${etherscanAddress(args.prevAddr)}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('PerfLeewaySet').format('full'), + alertId: 'CSFEE-ORACLE-PERF-LEEWAY-SET', + name: 'πŸ”΄ CSFeeOracle: Performance leeway updated', + description: (args: ethers.Result) => + `Performance leeway set to ${args.valueBP} basis points`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('FeeDistributorContractSet').format('full'), + alertId: 'CSFEE-ORACLE-FEE-DISTRIBUTOR-CONTRACT-SET', + name: 'πŸ”΄ CSFeeOracle: New CSFeeDistributor set', + description: (args: ethers.Result) => + `New CSFeeDistributor contract set to ${etherscanAddress(args.feeDistributorContract)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('ConsensusVersionSet').format('full'), + alertId: 'CSFEE-ORACLE-CONSENSUS-VERSION-SET', + name: 'πŸ”΄ CSFeeOracle: Consensus version set', + description: (args: ethers.Result) => + `Consensus version set to ${args.version}, previous version was ${args.prevVersion}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('WarnProcessingMissed').format('full'), + alertId: 'CSFEE-ORACLE-PROCESSING-MISSED', + name: 'πŸ”΅ CSFeeOracle: Processing missed', + description: (args: ethers.Result) => `Processing missed for slot ${args.refSlot}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('ReportSubmitted').format('full'), + alertId: 'CSFEE-ORACLE-REPORT-SUBMITTED', + name: 'πŸ”΅ CSFeeOracle: Report submitted', + description: (args: ethers.Result) => + `Report submitted for slot ${args.refSlot}\n` + + `Report hash: ${args.hash}\n` + + `Processing deadline time: ${args.processingDeadlineTime}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('ProcessingStarted').format('full'), + alertId: 'CSFEE-ORACLE-PROCESSING-STARTED', + name: 'πŸ”΅ CSFeeOracle: Processing started', + description: (args: ethers.Result) => + `Processing started for slot ${args.refSlot}\nReport hash: ${args.hash}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + ] } diff --git a/csm-alerts/src/services/EventsWatcher/events/pausable.ts b/csm-alerts/src/services/EventsWatcher/events/pausable.ts index 1503a88e0..44cbe419b 100644 --- a/csm-alerts/src/services/EventsWatcher/events/pausable.ts +++ b/csm-alerts/src/services/EventsWatcher/events/pausable.ts @@ -9,26 +9,26 @@ import { formatDelay } from '../../../utils/time' const IPausableUntil = PausableUntil__factory.createInterface() export function getPausableEvents(contracts: { name: string; address: string }[]): EventOfNotice[] { - return contracts.flatMap((contract) => { - return [ - { - address: contract.address, - abi: IPausableUntil.getEvent('Paused').format('full'), - alertId: `${toKebabCase(contract.name)}-PAUSED`, - name: `🚨 ${contract.name}: contract was paused`, - description: (args: Result) => `Contract paused for ${formatDelay(args.duration)}`, - severity: FindingSeverity.Critical, - type: FindingType.Info, - }, - { - address: contract.address, - abi: IPausableUntil.getEvent('Resumed').format('full'), - alertId: `${toKebabCase(contract.name)}-RESUMED`, - name: `🚨 ${contract.name}: contract was resumed`, - description: () => `Contract ${contract.address} was resumed`, - severity: FindingSeverity.Critical, - type: FindingType.Info, - }, - ] - }) + return contracts.flatMap((contract) => { + return [ + { + address: contract.address, + abi: IPausableUntil.getEvent('Paused').format('full'), + alertId: `${toKebabCase(contract.name)}-PAUSED`, + name: `🚨 ${contract.name}: contract was paused`, + description: (args: Result) => `Contract paused for ${formatDelay(args.duration)}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IPausableUntil.getEvent('Resumed').format('full'), + alertId: `${toKebabCase(contract.name)}-RESUMED`, + name: `🚨 ${contract.name}: contract was resumed`, + description: () => `Contract ${contract.address} was resumed`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + ] + }) } diff --git a/csm-alerts/src/services/EventsWatcher/events/proxies.ts b/csm-alerts/src/services/EventsWatcher/events/proxies.ts index c2391abb7..10a4a9365 100644 --- a/csm-alerts/src/services/EventsWatcher/events/proxies.ts +++ b/csm-alerts/src/services/EventsWatcher/events/proxies.ts @@ -6,37 +6,41 @@ import { etherscanAddress } from '../../../utils/string' const IOssifiableProxy = OssifiableProxy__factory.createInterface() -export function getOssifiedProxyEvents(contracts: { address: string; name: string }[]): EventOfNotice[] { - return contracts.flatMap((contract) => { - return [ - { - address: contract.address, - abi: IOssifiableProxy.getEvent('ProxyOssified').format('full'), - alertId: 'PROXY-OSSIFIED', - name: `🚨 ${contract.name}: Proxy Ossified`, - description: () => `Proxy for ${contract.name}(${etherscanAddress(contract.address)}) was ossified`, - severity: FindingSeverity.Critical, - type: FindingType.Info, - }, - { - address: contract.address, - abi: IOssifiableProxy.getEvent('Upgraded').format('full'), - alertId: 'PROXY-UPGRADED', - name: `🚨 ${contract.name}: Implementation Upgraded`, - description: (args: ethers.Result) => `The proxy implementation has been upgraded to ${args.implementation}`, - severity: FindingSeverity.Critical, - type: FindingType.Info, - }, - { - address: contract.address, - abi: IOssifiableProxy.getEvent('AdminChanged').format('full'), - alertId: 'PROXY-ADMIN-CHANGED', - name: `🚨 ${contract.name}: Admin Changed`, - description: (args: ethers.Result) => - `The proxy admin for ${contract.name}(${contract.address}) has been changed from ${etherscanAddress(args.previousAdmin)} to ${etherscanAddress(args.newAdmin)}`, - severity: FindingSeverity.Critical, - type: FindingType.Info, - }, - ] - }) +export function getOssifiedProxyEvents( + contracts: { address: string; name: string }[], +): EventOfNotice[] { + return contracts.flatMap((contract) => { + return [ + { + address: contract.address, + abi: IOssifiableProxy.getEvent('ProxyOssified').format('full'), + alertId: 'PROXY-OSSIFIED', + name: `🚨 ${contract.name}: Proxy Ossified`, + description: () => + `Proxy for ${contract.name}(${etherscanAddress(contract.address)}) was ossified`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IOssifiableProxy.getEvent('Upgraded').format('full'), + alertId: 'PROXY-UPGRADED', + name: `🚨 ${contract.name}: Implementation Upgraded`, + description: (args: ethers.Result) => + `The proxy implementation has been upgraded to ${args.implementation}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IOssifiableProxy.getEvent('AdminChanged').format('full'), + alertId: 'PROXY-ADMIN-CHANGED', + name: `🚨 ${contract.name}: Admin Changed`, + description: (args: ethers.Result) => + `The proxy admin for ${contract.name}(${contract.address}) has been changed from ${etherscanAddress(args.previousAdmin)} to ${etherscanAddress(args.newAdmin)}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + ] + }) } diff --git a/csm-alerts/src/services/EventsWatcher/events/roles.ts b/csm-alerts/src/services/EventsWatcher/events/roles.ts index 6e7149cd1..ed8028f7e 100644 --- a/csm-alerts/src/services/EventsWatcher/events/roles.ts +++ b/csm-alerts/src/services/EventsWatcher/events/roles.ts @@ -4,29 +4,31 @@ import { RolesMapping } from '../../../shared/roles' import { EventOfNotice } from '../../../shared/types' import { etherscanAddress } from '../../../utils/string' -export function getRolesMonitoringEvents(contracts: { name: string; address: string }[]): EventOfNotice[] { - return contracts.flatMap((contract) => { - return [ - { - address: contract.address, - abi: 'event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)', - alertId: `ROLE-GRANTED`, - name: `🚨 ${contract.name}: Role granted`, - description: (args: ethers.Result) => - `Role ${args.role} (${RolesMapping[args.role] ?? 'unknown'}) was granted to ${etherscanAddress(args.account)} on ${etherscanAddress(contract.address)}`, - severity: FindingSeverity.Critical, - type: FindingType.Info, - }, - { - address: contract.address, - abi: 'event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)', - alertId: `ROLE-REVOKED`, - name: `🚨 ${contract.name}: Role revoked`, - description: (args: ethers.Result) => - `Role ${args.role} (${RolesMapping[args.role] ?? 'unknown'}) was revoked from ${etherscanAddress(args.account)} on ${etherscanAddress(contract.address)}`, - severity: FindingSeverity.Critical, - type: FindingType.Info, - }, - ] - }) +export function getRolesMonitoringEvents( + contracts: { name: string; address: string }[], +): EventOfNotice[] { + return contracts.flatMap((contract) => { + return [ + { + address: contract.address, + abi: 'event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)', + alertId: `ROLE-GRANTED`, + name: `🚨 ${contract.name}: Role granted`, + description: (args: ethers.Result) => + `Role ${args.role} (${RolesMapping[args.role] ?? 'unknown'}) was granted to ${etherscanAddress(args.account)} on ${etherscanAddress(contract.address)}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: contract.address, + abi: 'event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)', + alertId: `ROLE-REVOKED`, + name: `🚨 ${contract.name}: Role revoked`, + description: (args: ethers.Result) => + `Role ${args.role} (${RolesMapping[args.role] ?? 'unknown'}) was revoked from ${etherscanAddress(args.account)} on ${etherscanAddress(contract.address)}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + ] + }) } diff --git a/csm-alerts/src/services/constants.holesky.ts b/csm-alerts/src/services/constants.holesky.ts index 2b1e1b1b5..e545bfcc6 100644 --- a/csm-alerts/src/services/constants.holesky.ts +++ b/csm-alerts/src/services/constants.holesky.ts @@ -1,28 +1,28 @@ import { DeployedAddresses } from '../shared/types' export const DEPLOYED_ADDRESSES: DeployedAddresses = { - CS_MODULE: '0x4562c3e63c2e586cD1651B958C22F88135aCAd4f', - CS_ACCOUNTING: '0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1', - CS_FEE_DISTRIBUTOR: '0xD7ba648C8F72669C6aE649648B516ec03D07c8ED', - CS_FEE_ORACLE: '0xaF57326C7d513085051b50912D51809ECC5d98Ee', - CS_VERIFIER: '0x6DcA479178E6Ae41CCEB72a88FfDaa3e10E83CB7', - CS_EARLY_ADOPTION: '0x71E92eA77C198a770d9f33A03277DbeB99989660', - CS_GATE_SEAL: '0x41F2677fae0222cF1f08Cd1c0AAa607B469654Ce', - LIDO_STETH: '0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034', - BURNER: '0x4E46BD7147ccf666E1d73A3A456fC7a68de82eCA', - HASH_CONSENSUS: '0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37', - STAKING_ROUTER: '0xd6EbF043D30A7fe46D1Db32BA90a0A51207FE229', + CS_MODULE: '0x4562c3e63c2e586cD1651B958C22F88135aCAd4f', + CS_ACCOUNTING: '0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1', + CS_FEE_DISTRIBUTOR: '0xD7ba648C8F72669C6aE649648B516ec03D07c8ED', + CS_FEE_ORACLE: '0xaF57326C7d513085051b50912D51809ECC5d98Ee', + CS_VERIFIER: '0x6DcA479178E6Ae41CCEB72a88FfDaa3e10E83CB7', + CS_EARLY_ADOPTION: '0x71E92eA77C198a770d9f33A03277DbeB99989660', + CS_GATE_SEAL: '0x41F2677fae0222cF1f08Cd1c0AAa607B469654Ce', + LIDO_STETH: '0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034', + BURNER: '0x4E46BD7147ccf666E1d73A3A456fC7a68de82eCA', + HASH_CONSENSUS: '0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37', + STAKING_ROUTER: '0xd6EbF043D30A7fe46D1Db32BA90a0A51207FE229', } export const ORACLE_MEMBERS: { [key: string]: string } = { - '0xF0F23944EfC5A63c53632C571E7377b85d5E6B6f': 'Chorus One', - '0xb29dD2f6672C0DFF2d2f173087739A42877A5172': 'Staking Facilities', - '0xD3b1e36A372Ca250eefF61f90E833Ca070559970': 'Stakefish', - '0x31fa51343297FFce0CC1E67a50B2D3428057D1b1': 'P2P', - '0xf7aE520e99ed3C41180B5E12681d31Aa7302E4e5': 'Chainlayer', - '0x4c75FA734a39f3a21C57e583c1c29942F021C6B7': 'bloXroute', - '0x81E411f1BFDa43493D7994F82fb61A415F6b8Fd4': 'Instadapp', - '0xfe43A8B0b481Ae9fB1862d31826532047d2d538c': 'MatrixedLink', - '0x12A1D74F8697b9f4F1eEBb0a9d0FB6a751366399': 'Lido', - '0xD892c09b556b547c80B7d8c8cB8d75bf541B2284': 'Lido', + '0xF0F23944EfC5A63c53632C571E7377b85d5E6B6f': 'Chorus One', + '0xb29dD2f6672C0DFF2d2f173087739A42877A5172': 'Staking Facilities', + '0xD3b1e36A372Ca250eefF61f90E833Ca070559970': 'Stakefish', + '0x31fa51343297FFce0CC1E67a50B2D3428057D1b1': 'P2P', + '0xf7aE520e99ed3C41180B5E12681d31Aa7302E4e5': 'Chainlayer', + '0x4c75FA734a39f3a21C57e583c1c29942F021C6B7': 'bloXroute', + '0x81E411f1BFDa43493D7994F82fb61A415F6b8Fd4': 'Instadapp', + '0xfe43A8B0b481Ae9fB1862d31826532047d2d538c': 'MatrixedLink', + '0x12A1D74F8697b9f4F1eEBb0a9d0FB6a751366399': 'Lido', + '0xD892c09b556b547c80B7d8c8cB8d75bf541B2284': 'Lido', } diff --git a/csm-alerts/src/services/constants.ts b/csm-alerts/src/services/constants.ts index c76ab86b7..5ae576c08 100644 --- a/csm-alerts/src/services/constants.ts +++ b/csm-alerts/src/services/constants.ts @@ -1,41 +1,41 @@ import { DeployedAddresses } from '../shared/types' export const DEPLOYED_ADDRESSES: DeployedAddresses = { - CS_MODULE: '0x0000000000000000000000000000000000000000', - CS_ACCOUNTING: '0x0000000000000000000000000000000000000000', - CS_FEE_DISTRIBUTOR: '0x0000000000000000000000000000000000000000', - CS_FEE_ORACLE: '0x0000000000000000000000000000000000000000', - CS_VERIFIER: '0x0000000000000000000000000000000000000000', - CS_EARLY_ADOPTION: '0x0000000000000000000000000000000000000000', - CS_GATE_SEAL: '0x0000000000000000000000000000000000000000', - LIDO_STETH: '0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034', - BURNER: '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84 ', - HASH_CONSENSUS: '0x0000000000000000000000000000000000000000', - STAKING_ROUTER: '0x0000000000000000000000000000000000000000', + CS_MODULE: '0x0000000000000000000000000000000000000000', + CS_ACCOUNTING: '0x0000000000000000000000000000000000000000', + CS_FEE_DISTRIBUTOR: '0x0000000000000000000000000000000000000000', + CS_FEE_ORACLE: '0x0000000000000000000000000000000000000000', + CS_VERIFIER: '0x0000000000000000000000000000000000000000', + CS_EARLY_ADOPTION: '0x0000000000000000000000000000000000000000', + CS_GATE_SEAL: '0x0000000000000000000000000000000000000000', + LIDO_STETH: '0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034', + BURNER: '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84 ', + HASH_CONSENSUS: '0x0000000000000000000000000000000000000000', + STAKING_ROUTER: '0x0000000000000000000000000000000000000000', } export const ALIASES: Record = { - CS_MODULE: 'CSM', - CS_ACCOUNTING: 'CSAccounting', - CS_FEE_DISTRIBUTOR: 'CSFeeDistributor', - CS_FEE_ORACLE: 'CSFeeOracle', - CS_VERIFIER: 'CSAccounting', - CS_EARLY_ADOPTION: 'CSEarlyAdoption', - CS_GATE_SEAL: 'CSM Gate Seal', - LIDO_STETH: 'Lido', - BURNER: 'Burner', - HASH_CONSENSUS: 'CSM HashConsensus', - STAKING_ROUTER: 'StakingRouter', + CS_MODULE: 'CSM', + CS_ACCOUNTING: 'CSAccounting', + CS_FEE_DISTRIBUTOR: 'CSFeeDistributor', + CS_FEE_ORACLE: 'CSFeeOracle', + CS_VERIFIER: 'CSAccounting', + CS_EARLY_ADOPTION: 'CSEarlyAdoption', + CS_GATE_SEAL: 'CSM Gate Seal', + LIDO_STETH: 'Lido', + BURNER: 'Burner', + HASH_CONSENSUS: 'CSM HashConsensus', + STAKING_ROUTER: 'StakingRouter', } export const ORACLE_MEMBERS: { [key: string]: string } = { - '0x140Bd8FbDc884f48dA7cb1c09bE8A2fAdfea776E': 'Chorus One', - '0x404335BcE530400a5814375E7Ec1FB55fAff3eA2': 'Staking Facilities', - '0x946D3b081ed19173dC83Cd974fC69e1e760B7d78': 'Stakefish', - '0x007DE4a5F7bc37E2F26c0cb2E8A95006EE9B89b5': 'P2P', - '0xc79F702202E3A6B0B6310B537E786B9ACAA19BAf': 'Chainlayer', - '0x61c91ECd902EB56e314bB2D5c5C07785444Ea1c8': 'bloXroute', - '0x1Ca0fEC59b86F549e1F1184d97cb47794C8Af58d': 'Instadapp', - '0xe57B3792aDCc5da47EF4fF588883F0ee0c9835C9': 'MatrixedLink', - '0xA7410857ABbf75043d61ea54e07D57A6EB6EF186': 'Kyber Network', + '0x140Bd8FbDc884f48dA7cb1c09bE8A2fAdfea776E': 'Chorus One', + '0x404335BcE530400a5814375E7Ec1FB55fAff3eA2': 'Staking Facilities', + '0x946D3b081ed19173dC83Cd974fC69e1e760B7d78': 'Stakefish', + '0x007DE4a5F7bc37E2F26c0cb2E8A95006EE9B89b5': 'P2P', + '0xc79F702202E3A6B0B6310B537E786B9ACAA19BAf': 'Chainlayer', + '0x61c91ECd902EB56e314bB2D5c5C07785444Ea1c8': 'bloXroute', + '0x1Ca0fEC59b86F549e1F1184d97cb47794C8Af58d': 'Instadapp', + '0xe57B3792aDCc5da47EF4fF588883F0ee0c9835C9': 'MatrixedLink', + '0xA7410857ABbf75043d61ea54e07D57A6EB6EF186': 'Kyber Network', } diff --git a/csm-alerts/src/shared/roles.ts b/csm-alerts/src/shared/roles.ts index daad2963b..8bd70b0c4 100644 --- a/csm-alerts/src/shared/roles.ts +++ b/csm-alerts/src/shared/roles.ts @@ -1,26 +1,26 @@ import { ethers, keccak256 } from '@fortanetwork/forta-bot' export const RolesMapping = { - [ethers.ZeroHash]: 'DEFAULT ADMIN', - [keccak256('PAUSE_ROLE')]: 'PAUSE', - [keccak256('RESUME_ROLE')]: 'RESUME', - [keccak256('MODULE_MANAGER_ROLE')]: 'MODULE MANAGER', - [keccak256('STAKING_ROUTER_ROLE')]: 'STAKING ROUTER', - [keccak256('REPORT_EL_REWARDS_STEALING_PENALTY_ROLE')]: 'REPORT EL REWARDS STEALING PENALTY', - [keccak256('SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE')]: 'SETTLE EL REWARDS STEALING PENALTY', - [keccak256('VERIFIER_ROLE')]: 'VERIFIER', - [keccak256('RECOVERER_ROLE')]: 'RECOVERER', - [keccak256('ACCOUNTING_MANAGER_ROLE')]: 'ACCOUNTING MANAGER', - [keccak256('MANAGE_BOND_CURVES_ROLE')]: 'MANAGE BOND CURVES', - [keccak256('SET_BOND_CURVE_ROLE')]: 'SET BOND CURVE', - [keccak256('RESET_BOND_CURVE_ROLE')]: 'RESET BOND CURVE', - [keccak256('CONTRACT_MANAGER_ROLE')]: 'CONTRACT MANAGER', - [keccak256('SUBMIT_DATA_ROLE')]: 'SUBMIT DATA', - [keccak256('DISABLE_CONSENSUS_ROLE')]: 'DISABLE CONSENSUS', - [keccak256('MANAGE_MEMBERS_AND_QUORUM_ROLE')]: 'MANAGE MEMBERS AND QUORUM', - [keccak256('MANAGE_FRAME_CONFIG_ROLE')]: 'MANAGE FRAME CONFIG', - [keccak256('MANAGE_FAST_LANE_CONFIG_ROLE')]: 'MANAGE FAST LANE CONFIG', - [keccak256('MANAGE_REPORT_PROCESSOR_ROLE')]: 'MANAGE REPORT PROCESSOR', - [keccak256('MANAGE_CONSENSUS_CONTRACT_ROLE')]: 'MANAGE CONSENSUS CONTRACT', - [keccak256('MANAGE_CONSENSUS_VERSION_ROLE')]: 'MANAGE CONSENSUS VERSION', + [ethers.ZeroHash]: 'DEFAULT ADMIN', + [keccak256('PAUSE_ROLE')]: 'PAUSE', + [keccak256('RESUME_ROLE')]: 'RESUME', + [keccak256('MODULE_MANAGER_ROLE')]: 'MODULE MANAGER', + [keccak256('STAKING_ROUTER_ROLE')]: 'STAKING ROUTER', + [keccak256('REPORT_EL_REWARDS_STEALING_PENALTY_ROLE')]: 'REPORT EL REWARDS STEALING PENALTY', + [keccak256('SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE')]: 'SETTLE EL REWARDS STEALING PENALTY', + [keccak256('VERIFIER_ROLE')]: 'VERIFIER', + [keccak256('RECOVERER_ROLE')]: 'RECOVERER', + [keccak256('ACCOUNTING_MANAGER_ROLE')]: 'ACCOUNTING MANAGER', + [keccak256('MANAGE_BOND_CURVES_ROLE')]: 'MANAGE BOND CURVES', + [keccak256('SET_BOND_CURVE_ROLE')]: 'SET BOND CURVE', + [keccak256('RESET_BOND_CURVE_ROLE')]: 'RESET BOND CURVE', + [keccak256('CONTRACT_MANAGER_ROLE')]: 'CONTRACT MANAGER', + [keccak256('SUBMIT_DATA_ROLE')]: 'SUBMIT DATA', + [keccak256('DISABLE_CONSENSUS_ROLE')]: 'DISABLE CONSENSUS', + [keccak256('MANAGE_MEMBERS_AND_QUORUM_ROLE')]: 'MANAGE MEMBERS AND QUORUM', + [keccak256('MANAGE_FRAME_CONFIG_ROLE')]: 'MANAGE FRAME CONFIG', + [keccak256('MANAGE_FAST_LANE_CONFIG_ROLE')]: 'MANAGE FAST LANE CONFIG', + [keccak256('MANAGE_REPORT_PROCESSOR_ROLE')]: 'MANAGE REPORT PROCESSOR', + [keccak256('MANAGE_CONSENSUS_CONTRACT_ROLE')]: 'MANAGE CONSENSUS CONTRACT', + [keccak256('MANAGE_CONSENSUS_VERSION_ROLE')]: 'MANAGE CONSENSUS VERSION', } diff --git a/csm-alerts/src/shared/types.ts b/csm-alerts/src/shared/types.ts index 705d0b176..48a669eab 100644 --- a/csm-alerts/src/shared/types.ts +++ b/csm-alerts/src/shared/types.ts @@ -1,25 +1,25 @@ import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' export type EventOfNotice = { - name: string - address: string - abi: string | string[] - alertId: string - description: CallableFunction - severity: FindingSeverity - type: FindingType + name: string + address: string + abi: string | string[] + alertId: string + description: CallableFunction + severity: FindingSeverity + type: FindingType } export type DeployedAddresses = { - CS_MODULE: string - CS_ACCOUNTING: string - CS_FEE_DISTRIBUTOR: string - CS_FEE_ORACLE: string - CS_VERIFIER: string - CS_EARLY_ADOPTION: string - CS_GATE_SEAL: string - LIDO_STETH: string - BURNER: string - HASH_CONSENSUS: string - STAKING_ROUTER: string + CS_MODULE: string + CS_ACCOUNTING: string + CS_FEE_DISTRIBUTOR: string + CS_FEE_ORACLE: string + CS_VERIFIER: string + CS_EARLY_ADOPTION: string + CS_GATE_SEAL: string + LIDO_STETH: string + BURNER: string + HASH_CONSENSUS: string + STAKING_ROUTER: string } diff --git a/csm-alerts/src/utils/epochs.ts b/csm-alerts/src/utils/epochs.ts index 93973828f..484d7173c 100644 --- a/csm-alerts/src/utils/epochs.ts +++ b/csm-alerts/src/utils/epochs.ts @@ -1,18 +1,18 @@ import { SECONDS_PER_SLOT, SLOTS_PER_EPOCH } from '../shared/constants' export function getEpoch(chainId: number, timestamp: number) { - let genesisTimestamp: number | undefined + let genesisTimestamp: number | undefined - switch (chainId) { - case 1: - genesisTimestamp = 1606824023 - break - case 17_000: - genesisTimestamp = 1695902400 - break - default: - throw Error(`Unsupported chain ${chainId} to get genesis timestamp`) - } + switch (chainId) { + case 1: + genesisTimestamp = 1606824023 + break + case 17_000: + genesisTimestamp = 1695902400 + break + default: + throw Error(`Unsupported chain ${chainId} to get genesis timestamp`) + } - return Math.floor((timestamp - genesisTimestamp) / SECONDS_PER_SLOT / SLOTS_PER_EPOCH) + return Math.floor((timestamp - genesisTimestamp) / SECONDS_PER_SLOT / SLOTS_PER_EPOCH) } diff --git a/csm-alerts/src/utils/findings.ts b/csm-alerts/src/utils/findings.ts index 186c282ce..f2972e89a 100644 --- a/csm-alerts/src/utils/findings.ts +++ b/csm-alerts/src/utils/findings.ts @@ -1,4 +1,10 @@ -import { BlockEvent, Finding, FindingSeverity, FindingType, TransactionEvent } from '@fortanetwork/forta-bot' +import { + BlockEvent, + Finding, + FindingSeverity, + FindingType, + TransactionEvent, +} from '@fortanetwork/forta-bot' import { FindingSource } from '@fortanetwork/forta-bot/dist/findings/finding.source' import { toKebabCase } from './string' @@ -6,110 +12,115 @@ import { APP_NAME } from '../config' import Version from './version' export function sourceFromEvent(event: TransactionEvent | BlockEvent): FindingSource { - const source: FindingSource = {} + const source: FindingSource = {} - if ('transaction' in event) source.transactions = [{ chainId: event.chainId, hash: event.transaction.hash }] - source.blocks = [{ chainId: event.chainId, hash: event.block.hash, number: event.block.number }] + if ('transaction' in event) + source.transactions = [{ chainId: event.chainId, hash: event.transaction.hash }] + source.blocks = [{ chainId: event.chainId, hash: event.block.hash, number: event.block.number }] - return source + return source } export function launchAlert(): Finding { - return Finding.fromObject({ - name: `πŸš€πŸš€πŸš€ Bot ${APP_NAME} launched`, - description: `Commit ${Version.commitHashShort}`, - alertId: 'BOT-LAUNCH', - severity: FindingSeverity.Info, - type: FindingType.Info, - }) + return Finding.fromObject({ + name: `πŸš€πŸš€πŸš€ Bot ${APP_NAME} launched`, + description: `Commit ${Version.commitHashShort}`, + alertId: 'BOT-LAUNCH', + severity: FindingSeverity.Info, + type: FindingType.Info, + }) } export function invariantAlert(event: BlockEvent | TransactionEvent, message: string): Finding { - return Finding.fromObject({ - name: '🚨 Assert invariant failed', - description: message, - alertId: 'ASSERT-FAILED', - source: sourceFromEvent(event), - severity: FindingSeverity.Critical, - type: FindingType.Info, - }) + return Finding.fromObject({ + name: '🚨 Assert invariant failed', + description: message, + alertId: 'ASSERT-FAILED', + source: sourceFromEvent(event), + severity: FindingSeverity.Critical, + type: FindingType.Info, + }) } export function errorAlert(name: string, err: string | Error | undefined): Finding { - return Finding.fromObject({ - name: name, - description: String(err), - alertId: 'CODE-ERROR', - severity: FindingSeverity.Unknown, - type: FindingType.Degraded, - metadata: { - stack: `${err instanceof Error ? err.stack : null}`, - message: `${err instanceof Error ? err.message : null}`, - name: `${err instanceof Error ? err.name : null}`, - }, - }) + return Finding.fromObject({ + name: name, + description: String(err), + alertId: 'CODE-ERROR', + severity: FindingSeverity.Unknown, + type: FindingType.Degraded, + metadata: { + stack: `${err instanceof Error ? err.stack : null}`, + message: `${err instanceof Error ? err.message : null}`, + name: `${err instanceof Error ? err.name : null}`, + }, + }) } -export function failedTxAlert(txEvent: TransactionEvent, description: string, reason: string): Finding { - return Finding.fromObject({ - name: `🟣 CRITICAL: ${reason}`, - description: `Transaction reverted. ${description}`, - alertId: `CSFEE-${toKebabCase(reason)}`, - source: sourceFromEvent(txEvent), - severity: FindingSeverity.Critical, - type: FindingType.Info, - }) +export function failedTxAlert( + txEvent: TransactionEvent, + description: string, + reason: string, +): Finding { + return Finding.fromObject({ + name: `🟣 CRITICAL: ${reason}`, + description: `Transaction reverted. ${description}`, + alertId: `CSFEE-${toKebabCase(reason)}`, + source: sourceFromEvent(txEvent), + severity: FindingSeverity.Critical, + type: FindingType.Info, + }) } export const NetworkErrorFinding = 'NETWORK-ERROR' export function networkAlert(err: Error, name: string, desc: string): Finding { - const f = Finding.fromObject({ - name: name, - description: desc, - alertId: NetworkErrorFinding, - severity: FindingSeverity.Unknown, - type: FindingType.Degraded, - metadata: { - stack: `${err.stack}`, - message: `${err.message}`, - name: `${err.name}`, - }, - }) - - return f + const f = Finding.fromObject({ + name: name, + description: desc, + alertId: NetworkErrorFinding, + severity: FindingSeverity.Unknown, + type: FindingType.Degraded, + metadata: { + stack: `${err.stack}`, + message: `${err.message}`, + name: `${err.name}`, + }, + }) + + return f } export function dbAlert(err: Error, name: string, desc: string): Finding { - const f = Finding.fromObject({ - name: name, - description: desc, - alertId: 'DB-ERROR', - severity: FindingSeverity.Unknown, - type: FindingType.Degraded, - metadata: { - stack: `${err.stack}`, - message: `${err.message}`, - name: `${err.name}`, - }, - }) - - return f + const f = Finding.fromObject({ + name: name, + description: desc, + alertId: 'DB-ERROR', + severity: FindingSeverity.Unknown, + type: FindingType.Degraded, + metadata: { + stack: `${err.stack}`, + message: `${err.message}`, + name: `${err.name}`, + }, + }) + + return f } export class NetworkError extends Error { - constructor(e: unknown, name?: string) { - super() - - if (name !== undefined) { - this.name = name - } - - if (e instanceof Error) { - this.stack = e.stack - this.message = e.message - } else { - this.message = `${e}` + constructor(e: unknown, name?: string) { + super() + + if (name !== undefined) { + this.name = name + } + + if (e instanceof Error) { + this.stack = e.stack + this.message = e.message + } else { + this.message = `${e}` + } } - } } diff --git a/csm-alerts/src/utils/logs.ts b/csm-alerts/src/utils/logs.ts index 9ebdd0015..60e0cdfe9 100644 --- a/csm-alerts/src/utils/logs.ts +++ b/csm-alerts/src/utils/logs.ts @@ -3,20 +3,22 @@ import { ethers } from '@fortanetwork/forta-bot' const LOG_FILTER_CHUNK = 2000 export async function getLogsByChunks( - contract: ethers.Contract, - filter: ethers.ContractEventName, - startblock: number, - endBlock: number, + contract: ethers.Contract, + filter: ethers.ContractEventName, + startblock: number, + endBlock: number, ) { - const events: ethers.Log[] = [] - let endBlockChunk - let startBlockChunk = startblock - do { - endBlockChunk = - endBlock > startBlockChunk + LOG_FILTER_CHUNK - 1 ? startBlockChunk + LOG_FILTER_CHUNK - 1 : endBlock - const eventsChunk = await contract.queryFilter(filter, startBlockChunk, endBlockChunk) - events.push(...eventsChunk) - startBlockChunk = endBlockChunk + 1 - } while (endBlockChunk < endBlock) - return events + const events: ethers.Log[] = [] + let endBlockChunk + let startBlockChunk = startblock + do { + endBlockChunk = + endBlock > startBlockChunk + LOG_FILTER_CHUNK - 1 + ? startBlockChunk + LOG_FILTER_CHUNK - 1 + : endBlock + const eventsChunk = await contract.queryFilter(filter, startBlockChunk, endBlockChunk) + events.push(...eventsChunk) + startBlockChunk = endBlockChunk + 1 + } while (endBlockChunk < endBlock) + return events } diff --git a/csm-alerts/src/utils/metrics/metrics.ts b/csm-alerts/src/utils/metrics/metrics.ts index 743e4e790..e10942706 100644 --- a/csm-alerts/src/utils/metrics/metrics.ts +++ b/csm-alerts/src/utils/metrics/metrics.ts @@ -6,83 +6,83 @@ export const HandleBlockLabel = 'handleBlock' export const HandleTxLabel = 'handleTx' export class Metrics { - private readonly registry: Registry - private readonly prefix: string + private readonly registry: Registry + private readonly prefix: string - public readonly healthStatus: Gauge - public readonly buildInfo: Gauge + public readonly healthStatus: Gauge + public readonly buildInfo: Gauge - public readonly etherJsRequest: Counter - public readonly networkErrors: Counter - public readonly lastBlockNumber: Gauge - public readonly etherJsDurationHistogram: Histogram - public readonly lastAgentTouch: Gauge - public readonly processedIterations: Counter - public readonly summaryHandlers: Summary + public readonly etherJsRequest: Counter + public readonly networkErrors: Counter + public readonly lastBlockNumber: Gauge + public readonly etherJsDurationHistogram: Histogram + public readonly lastAgentTouch: Gauge + public readonly processedIterations: Counter + public readonly summaryHandlers: Summary - constructor(registry: Registry, prefix: string) { - this.registry = registry - this.prefix = prefix + constructor(registry: Registry, prefix: string) { + this.registry = registry + this.prefix = prefix - this.buildInfo = new Gauge({ - name: this.prefix + 'build_info', - help: 'Build information', - labelNames: ['commitHash' as const], - registers: [this.registry], - }) + this.buildInfo = new Gauge({ + name: this.prefix + 'build_info', + help: 'Build information', + labelNames: ['commitHash' as const], + registers: [this.registry], + }) - this.healthStatus = new Gauge({ - name: this.prefix + 'health_status', - help: 'Bot health status', - labelNames: ['instance'] as const, - registers: [this.registry], - }) + this.healthStatus = new Gauge({ + name: this.prefix + 'health_status', + help: 'Bot health status', + labelNames: ['instance'] as const, + registers: [this.registry], + }) - this.etherJsRequest = new Counter({ - name: this.prefix + 'etherjs_request_total', - help: 'Total number of requests via ether.js library', - labelNames: ['method' as const, 'status' as const] as const, - registers: [this.registry], - }) + this.etherJsRequest = new Counter({ + name: this.prefix + 'etherjs_request_total', + help: 'Total number of requests via ether.js library', + labelNames: ['method' as const, 'status' as const] as const, + registers: [this.registry], + }) - this.etherJsDurationHistogram = new Histogram({ - name: this.prefix + 'ether_requests_duration_seconds', - help: 'Histogram of the duration of requests in seconds', - labelNames: ['method', 'status'], - buckets: [0.001, 0.01, 0.1, 0.5, 1, 2.5, 5, 10], - }) + this.etherJsDurationHistogram = new Histogram({ + name: this.prefix + 'ether_requests_duration_seconds', + help: 'Histogram of the duration of requests in seconds', + labelNames: ['method', 'status'], + buckets: [0.001, 0.01, 0.1, 0.5, 1, 2.5, 5, 10], + }) - this.lastAgentTouch = new Gauge({ - name: this.prefix + 'block_timestamp', - help: 'The last agent iteration', - labelNames: ['method' as const] as const, - registers: [this.registry], - }) + this.lastAgentTouch = new Gauge({ + name: this.prefix + 'block_timestamp', + help: 'The last agent iteration', + labelNames: ['method' as const] as const, + registers: [this.registry], + }) - this.lastBlockNumber = new Gauge({ - name: this.prefix + 'last_block_number', - help: 'The last agent block number', - registers: [this.registry], - }) + this.lastBlockNumber = new Gauge({ + name: this.prefix + 'last_block_number', + help: 'The last agent block number', + registers: [this.registry], + }) - this.networkErrors = new Counter({ - name: this.prefix + 'network_errors_total', - help: 'Total number of network errors', - registers: [this.registry], - }) + this.networkErrors = new Counter({ + name: this.prefix + 'network_errors_total', + help: 'Total number of network errors', + registers: [this.registry], + }) - this.processedIterations = new Counter({ - name: this.prefix + 'processed_iterations_total', - help: 'Total number of finding iterations', - labelNames: ['method', 'status'], - registers: [this.registry], - }) + this.processedIterations = new Counter({ + name: this.prefix + 'processed_iterations_total', + help: 'Total number of finding iterations', + labelNames: ['method', 'status'], + registers: [this.registry], + }) - this.summaryHandlers = new Summary({ - name: this.prefix + 'request_processing_seconds', - help: 'Time spent processing request (block or transaction)', - labelNames: ['method'], - registers: [this.registry], - }) - } + this.summaryHandlers = new Summary({ + name: this.prefix + 'request_processing_seconds', + help: 'Time spent processing request (block or transaction)', + labelNames: ['method'], + registers: [this.registry], + }) + } } diff --git a/csm-alerts/src/utils/require.ts b/csm-alerts/src/utils/require.ts index 4d1ff8591..53bced876 100644 --- a/csm-alerts/src/utils/require.ts +++ b/csm-alerts/src/utils/require.ts @@ -1,8 +1,8 @@ import { RUN_TIER } from '../config' export enum RedefineMode { - Strict = 'strict', - Merge = 'merge', + Strict = 'strict', + Merge = 'merge', } /** @@ -13,39 +13,45 @@ export enum RedefineMode { * @param path relative to module path to the main file to import. * @param mode `strict` or `merge`. Default: `strict`. */ -export function requireWithTier(module: NodeModule, path: string, mode: RedefineMode = RedefineMode.Strict): T { - const defaultContent = require(`${module.path}/${path}`) - if (!RUN_TIER) return defaultContent - let tieredContent: any - // NOTE: It fails if it can't find the requested tier. - tieredContent = require(`${module.path}/${path}.${RUN_TIER}`) - module.exports.__tier__ = RUN_TIER - if (mode == RedefineMode.Strict) { - const valid = (key: string) => { - return key in tieredContent && typeof defaultContent[key] == typeof tieredContent[key] - } - if (Object.keys(defaultContent).every((key) => valid(key))) { - return tieredContent - } else { - throw new Error( - `Failed to import module: '${module.path}/${path}.${RUN_TIER}' doesn't contain all keys or unmatched types +export function requireWithTier( + module: NodeModule, + path: string, + mode: RedefineMode = RedefineMode.Strict, +): T { + const defaultContent = require(`${module.path}/${path}`) + if (!RUN_TIER) return defaultContent + let tieredContent: any + // NOTE: It fails if it can't find the requested tier. + tieredContent = require(`${module.path}/${path}.${RUN_TIER}`) + module.exports.__tier__ = RUN_TIER + if (mode == RedefineMode.Strict) { + const valid = (key: string) => { + return key in tieredContent && typeof defaultContent[key] == typeof tieredContent[key] + } + if (Object.keys(defaultContent).every((key) => valid(key))) { + return tieredContent + } else { + throw new Error( + `Failed to import module: '${module.path}/${path}.${RUN_TIER}' doesn't contain all keys or unmatched types with '${module.path}/${path}'`, - ) - } - } - if (mode == RedefineMode.Merge) { - const valid = (key: string) => { - if (key in defaultContent) { - return typeof defaultContent[key] == typeof tieredContent[key] - } else { - return true - } + ) + } } - if (Object.keys(tieredContent).every((key) => valid(key))) { - return { ...defaultContent, ...tieredContent } - } else { - throw new Error(`Failed to import module: '${path}.${RUN_TIER}' unmatched types with '${path}'`) + if (mode == RedefineMode.Merge) { + const valid = (key: string) => { + if (key in defaultContent) { + return typeof defaultContent[key] == typeof tieredContent[key] + } else { + return true + } + } + if (Object.keys(tieredContent).every((key) => valid(key))) { + return { ...defaultContent, ...tieredContent } + } else { + throw new Error( + `Failed to import module: '${path}.${RUN_TIER}' unmatched types with '${path}'`, + ) + } } - } - throw new Error(`Unknown require mode: ${mode}`) + throw new Error(`Unknown require mode: ${mode}`) } diff --git a/csm-alerts/src/utils/string.ts b/csm-alerts/src/utils/string.ts index fe1333ecd..02b637495 100644 --- a/csm-alerts/src/utils/string.ts +++ b/csm-alerts/src/utils/string.ts @@ -4,20 +4,20 @@ import { RUN_TIER } from '../config' import { SHARES_PRECISION, WEI_PER_ETH } from '../shared/constants' export function etherscanAddress(address: string): string { - const subpath = RUN_TIER == 'holesky' ? 'holesky.' : '' - return `[${address}](https://${subpath}etherscan.io/address/${address})` + const subpath = RUN_TIER == 'holesky' ? 'holesky.' : '' + return `[${address}](https://${subpath}etherscan.io/address/${address})` } export function toKebabCase(str: string): string { - return str.replace(/_/g, '-') + return str.replace(/_/g, '-') } export function formatShares(amount: bigint): string { - amount = amount - (amount % (SHARES_PRECISION / 100n)) - return `${ethers.formatEther(amount)} Γ— 1e18 shares` + amount = amount - (amount % (SHARES_PRECISION / 100n)) + return `${ethers.formatEther(amount)} Γ— 1e18 shares` } export function formatEther(amount: bigint): string { - amount = amount - (amount % (WEI_PER_ETH / 100n)) - return `${ethers.formatEther(amount)} ether` + amount = amount - (amount % (WEI_PER_ETH / 100n)) + return `${ethers.formatEther(amount)} ether` } diff --git a/csm-alerts/src/utils/time.ts b/csm-alerts/src/utils/time.ts index aa02ad33b..9dccd23d2 100644 --- a/csm-alerts/src/utils/time.ts +++ b/csm-alerts/src/utils/time.ts @@ -1,50 +1,50 @@ export function formatTime(timeInMillis: number): string { - const seconds = (timeInMillis / 1000).toFixed(3) - return `${seconds} seconds` + const seconds = (timeInMillis / 1000).toFixed(3) + return `${seconds} seconds` } export function elapsedTime(methodName: string, startTime: number): string { - const elapsedTime = new Date().getTime() - startTime - return `${methodName} started at ${formatTimeToHumanReadable(new Date(startTime))}. Elapsed: ${formatTime( - elapsedTime, - )}` + const elapsedTime = new Date().getTime() - startTime + return `${methodName} started at ${formatTimeToHumanReadable(new Date(startTime))}. Elapsed: ${formatTime( + elapsedTime, + )}` } function formatTimeToHumanReadable(date: Date): string { - return date.toLocaleTimeString('en-US', { - hour: '2-digit', - minute: '2-digit', - second: '2-digit', - hour12: false, - }) + return date.toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false, + }) } export function formatDelay(fullDelaySec: bigint | number): string { - fullDelaySec = BigInt(fullDelaySec) - - const sign = fullDelaySec >= 0 ? 1n : -1n - fullDelaySec = sign * fullDelaySec - - let delayDays = 0n - let delayHours = 0n - - let delayMin = fullDelaySec / 60n - const delaySec = fullDelaySec - delayMin * 60n - - if (delayMin >= 60) { - delayHours = delayMin / 60n - delayMin -= delayHours * 60n - } - if (delayHours >= 24) { - delayDays = delayHours / 24n - delayHours -= delayDays * 24n - } - - return ( - (sign == 1n ? '' : '-') + - (delayDays > 0 ? `${delayDays} day` : '') + - (delayHours > 0 ? ` ${delayHours} hr` : '') + - (delayMin > 0 ? ` ${delayMin} min` : '') + - (delaySec > 0 ? ` ${delaySec} sec` : '') - ) + fullDelaySec = BigInt(fullDelaySec) + + const sign = fullDelaySec >= 0 ? 1n : -1n + fullDelaySec = sign * fullDelaySec + + let delayDays = 0n + let delayHours = 0n + + let delayMin = fullDelaySec / 60n + const delaySec = fullDelaySec - delayMin * 60n + + if (delayMin >= 60) { + delayHours = delayMin / 60n + delayMin -= delayHours * 60n + } + if (delayHours >= 24) { + delayDays = delayHours / 24n + delayHours -= delayDays * 24n + } + + return ( + (sign == 1n ? '' : '-') + + (delayDays > 0 ? `${delayDays} day` : '') + + (delayHours > 0 ? ` ${delayHours} hr` : '') + + (delayMin > 0 ? ` ${delayMin} min` : '') + + (delaySec > 0 ? ` ${delaySec} sec` : '') + ) } diff --git a/csm-alerts/src/utils/version.ts b/csm-alerts/src/utils/version.ts index 3fd42b5c3..6913e5525 100644 --- a/csm-alerts/src/utils/version.ts +++ b/csm-alerts/src/utils/version.ts @@ -1,27 +1,27 @@ import path from 'path' export interface Version { - desc: string - commitHash: string - commitHashShort: string - commitMsg: string - commitMsgShort: string - isWdClean: boolean + desc: string + commitHash: string + commitHashShort: string + commitMsg: string + commitMsgShort: string + isWdClean: boolean } export default readVersion(path.join(__dirname, '..', '..', 'version.json')) function readVersion(versionFilePath: string): Version { - try { - return require(versionFilePath) - } catch (e) { - return { - desc: 'unknown', - commitHash: 'unknown', - commitHashShort: 'unknown', - commitMsg: 'unknown', - commitMsgShort: 'unknown', - isWdClean: false, + try { + return require(versionFilePath) + } catch (e) { + return { + desc: 'unknown', + commitHash: 'unknown', + commitHashShort: 'unknown', + commitMsg: 'unknown', + commitMsgShort: 'unknown', + isWdClean: false, + } } - } } From 271a87d1d4e3a4d86b0030fbb52f29aa808cc0e0 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Fri, 11 Oct 2024 10:40:07 +0300 Subject: [PATCH 05/45] chore: improve some HashConsensus findings --- .../services/CSFeeOracle/CSFeeOracle.srv.ts | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts index b9399a86c..ff0f29436 100644 --- a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts +++ b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts @@ -75,16 +75,19 @@ export class CSFeeOracleSrv { currentReportHashes.length > 0 && !currentReportHashes.includes(event.args.report) ) { - const f = Finding.fromObject({ - name: 'πŸ”΄ HashConsensus: Another report variant appeared (alternative hash)', - description: `More than one distinct report hash received for slot ${event.args.refSlot}. Member: ${event.args.member}. Report: ${event.args.report}`, - alertId: 'HASH-CONSENSUS-REPORT-RECEIVED', - source: sourceFromEvent(txEvent), - severity: FindingSeverity.High, - type: FindingType.Info, - }) - - out.push(f) + out.push( + Finding.fromObject({ + name: 'πŸ”΄ HashConsensus: Another report variant appeared (alternative hash)', + description: + `More than one distinct report hash received for slot ${event.args.refSlot}.` + + `Member: ${etherscanAddress(event.args.member)} (${ORACLE_MEMBERS[event.args.member] || 'unknown'}).` + + `Report: ${event.args.report}`, + alertId: 'HASH-CONSENSUS-REPORT-RECEIVED', + source: sourceFromEvent(txEvent), + severity: FindingSeverity.High, + type: FindingType.Info, + }), + ) } this.membersLastReport.set(event.args.member, { @@ -121,7 +124,9 @@ export class CSFeeOracleSrv { out.push( Finding.fromObject({ name: 'πŸ”΄ CSM: Sloppy oracle fast lane member', - description: `Member ${etherscanAddress(addr)} (${ORACLE_MEMBERS[addr] || 'unknown'}) was in the fast lane but did not report`, + description: + `Member ${etherscanAddress(addr)} (${ORACLE_MEMBERS[addr] || 'unknown'}) ` + + `was in the fast lane but did not report`, alertId: 'HASH-CONSENSUS-SLOPPY-MEMBER', source: sourceFromEvent(txEvent), severity: FindingSeverity.Medium, From 27a78d6cbfddc52d7b21f478e4120c485153f142 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Fri, 11 Oct 2024 10:40:20 +0300 Subject: [PATCH 06/45] fix: update .env.sample --- csm-alerts/.env.sample | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/csm-alerts/.env.sample b/csm-alerts/.env.sample index f51f39f28..1bed806b1 100644 --- a/csm-alerts/.env.sample +++ b/csm-alerts/.env.sample @@ -4,9 +4,11 @@ INSTANCE=forta HTTP_PORT=3000 LOG_FORMAT=simple LOG_LEVEL=debug -ETHEREUM_RPC_URL=https://holesky.drpc.org -FORTA_AGENT_RUN_TIER=testnet +RPC_URL=https://holesky.drpc.org +FORTA_AGENT_RUN_TIER=holesky ## FORTA compatible env names NODE_ENV=local FORTA_CHAIN_ID=17000 + +# vim: ft=sh From 0e03b19ef45457eccc4abec6f870fb42d31e37d9 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Fri, 11 Oct 2024 16:15:09 +0300 Subject: [PATCH 07/45] feat: add IPFS links --- csm-alerts/src/services/EventsWatcher/events/distributor.ts | 5 +++-- csm-alerts/src/utils/string.ts | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/csm-alerts/src/services/EventsWatcher/events/distributor.ts b/csm-alerts/src/services/EventsWatcher/events/distributor.ts index 0162cc30a..ff9ad7604 100644 --- a/csm-alerts/src/services/EventsWatcher/events/distributor.ts +++ b/csm-alerts/src/services/EventsWatcher/events/distributor.ts @@ -2,6 +2,7 @@ import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' import { CSFeeDistributor__factory } from '../../../generated/typechain' import { EventOfNotice } from '../../../shared/types' +import { ipfsLink } from '../../../utils/string' const ICSFeeDistributor = CSFeeDistributor__factory.createInterface() @@ -15,7 +16,7 @@ export function getCSFeeDistributorEvents(distributorAddress: string): EventOfNo description: (args: ethers.Result) => `Total Claimable Shares: ${args.totalClaimableShares}\n` + `Tree Root: ${args.treeRoot}\n` + - `Tree CID: ${args.treeCid}`, + `Tree CID: ${ipfsLink(args.treeCid)}`, severity: FindingSeverity.Info, type: FindingType.Info, }, @@ -24,7 +25,7 @@ export function getCSFeeDistributorEvents(distributorAddress: string): EventOfNo abi: ICSFeeDistributor.getEvent('DistributionLogUpdated').format('full'), alertId: 'CSFEE-DISTRIBUTOR-DISTRIBUTION-LOG-UPDATED', name: 'πŸ”΅ CSFeeDistributor: Distribution log updated', - description: (args: ethers.Result) => `Log CID: ${args.logCid}`, + description: (args: ethers.Result) => `Log CID: ${ipfsLink(args.logCid)}`, severity: FindingSeverity.Info, type: FindingType.Info, }, diff --git a/csm-alerts/src/utils/string.ts b/csm-alerts/src/utils/string.ts index 02b637495..fc4e569d3 100644 --- a/csm-alerts/src/utils/string.ts +++ b/csm-alerts/src/utils/string.ts @@ -21,3 +21,7 @@ export function formatEther(amount: bigint): string { amount = amount - (amount % (WEI_PER_ETH / 100n)) return `${ethers.formatEther(amount)} ether` } + +export function ipfsLink(cid: string): string { + return `[${cid}](https://ipfs.io/ipfs/${cid})` +} From 19a0e8444c0b30cb3d99125f077928ba55aa98c5 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Fri, 11 Oct 2024 16:15:37 +0300 Subject: [PATCH 08/45] chore: fix linter config --- csm-alerts/.eslintrc.js | 5 +- csm-alerts/package.json | 4 +- csm-alerts/src/main.ts | 2 +- .../services/CSAccounting/CSAccounting.srv.ts | 8 +- .../CSFeeDistributor/CSFeeDistributor.srv.ts | 115 ++++++++---------- .../services/CSFeeOracle/CSFeeOracle.srv.ts | 3 +- .../src/services/CSModule/CSModule.srv.ts | 8 +- .../EventsWatcher/EventsWatcher.srv.ts | 8 +- csm-alerts/src/shared/types.ts | 18 ++- csm-alerts/src/utils/require.ts | 3 +- csm-alerts/src/utils/version.ts | 5 +- 11 files changed, 94 insertions(+), 85 deletions(-) diff --git a/csm-alerts/.eslintrc.js b/csm-alerts/.eslintrc.js index 505439967..be795de0c 100644 --- a/csm-alerts/.eslintrc.js +++ b/csm-alerts/.eslintrc.js @@ -24,13 +24,16 @@ module.exports = { node: true, jest: true, }, - ignorePatterns: ['.eslintrc.js'], + // FIXME: Remove *.spec.ts after implementing tests. + ignorePatterns: ['.eslintrc.js', '*.spec.ts'], rules: { + '@typescript-eslint/no-unused-vars': 'warn', '@typescript-eslint/interface-name-prefix': 'off', '@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/no-require-imports': 'off', 'sort-imports': [ 'error', { diff --git a/csm-alerts/package.json b/csm-alerts/package.json index 48de6e211..c7449e633 100644 --- a/csm-alerts/package.json +++ b/csm-alerts/package.json @@ -33,8 +33,8 @@ "eslint:format": "eslint ./src --fix", "prettier:check": "prettier --check ./src", "prettier:format": "prettier --write ./src README.md", - "lint": "yarn run prettier:check && yarn run eslint:lint", - "format": "yarn run eslint:format && yarn run prettier:format", + "lint": "eslint ./src", + "format": "yarn lint --fix", "postinstall": "yarn generate-types" }, "dependencies": { diff --git a/csm-alerts/src/main.ts b/csm-alerts/src/main.ts index e999b8427..af25a5e8b 100644 --- a/csm-alerts/src/main.ts +++ b/csm-alerts/src/main.ts @@ -15,7 +15,7 @@ import { CSFeeDistributorSrv } from './services/CSFeeDistributor/CSFeeDistributo import { CSFeeOracleSrv } from './services/CSFeeOracle/CSFeeOracle.srv' import { CSModuleSrv } from './services/CSModule/CSModule.srv' import { EventsWatcherSrv } from './services/EventsWatcher/EventsWatcher.srv' -import { errorAlert, launchAlert } from './utils/findings' +import { launchAlert } from './utils/findings' const logger = getLogger('main') diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts index e4c63a066..efd9e26c0 100644 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts @@ -13,6 +13,7 @@ import { IS_CLI } from '../../config' import { CSAccounting__factory, CSModule__factory, Lido__factory } from '../../generated/typechain' import { getLogger } from '../../logger' import { SECONDS_PER_DAY, WEI_PER_ETH } from '../../shared/constants' +import { Service } from '../../shared/types' import { sourceFromEvent } from '../../utils/findings' import { RedefineMode, requireWithTier } from '../../utils/require' import { formatEther } from '../../utils/string' @@ -32,7 +33,7 @@ const ACCOUNTING_BALANCE_EXCESS_SHARES_MAX = WEI_PER_ETH / 10n const CURVE_EARLY_ADOPTION_ID = 1n const CURVE_DEFAULT_ID = 0n -export class CSAccountingSrv { +export class CSAccountingSrv implements Service { private readonly logger: Logger private lastFiredAt = { @@ -52,10 +53,7 @@ export class CSAccountingSrv { ] } - public async handleTransaction( - txEvent: TransactionEvent, - provider: ethers.Provider, - ): Promise { + public async handleTransaction(txEvent: TransactionEvent): Promise { return [ ...this.handleStETHApprovalEvents(txEvent), ...this.handleSetBondCurveEvent(txEvent), diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts index f0444c89b..f22ea5358 100644 --- a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts @@ -17,8 +17,9 @@ import { } from '../../generated/typechain' import { getLogger } from '../../logger' import { SECONDS_PER_DAY, SECONDS_PER_SLOT, SLOTS_PER_EPOCH } from '../../shared/constants' +import { Service } from '../../shared/types' import { getEpoch } from '../../utils/epochs' -import { failedTxAlert, invariantAlert, sourceFromEvent } from '../../utils/findings' +import { invariantAlert, sourceFromEvent } from '../../utils/findings' import { getLogsByChunks } from '../../utils/logs' import { RedefineMode, requireWithTier } from '../../utils/require' import { formatDelay } from '../../utils/time' @@ -31,7 +32,7 @@ const { DEPLOYED_ADDRESSES } = requireWithTier( ) const ICSFeeDistributor = CSFeeDistributor__factory.createInterface() -export class CSFeeDistributorSrv { +export class CSFeeDistributorSrv implements Service { private readonly logger: Logger private lastFiredAt = { @@ -99,10 +100,7 @@ export class CSFeeDistributorSrv { ] } - public async handleTransaction( - txEvent: TransactionEvent, - provider: ethers.Provider, - ): Promise { + public async handleTransaction(txEvent: TransactionEvent): Promise { const distributionDataUpdatedEvents = filterLog( txEvent.logs, ICSFeeDistributor.getEvent('DistributionDataUpdated').format('full'), @@ -113,12 +111,7 @@ export class CSFeeDistributorSrv { this.state.lastDistributionUpdatedAt = txEvent.block.timestamp } - return ( - await Promise.all([ - this.handleTransferSharesInvalidReceiver(txEvent), - this.handleRevertedTx(txEvent, provider), - ]) - ).flat() + return this.handleTransferSharesInvalidReceiver(txEvent) } private handleDistributionOverdue(blockEvent: BlockEvent): Finding[] { @@ -191,55 +184,55 @@ export class CSFeeDistributorSrv { return out } - private async handleRevertedTx( - txEvent: TransactionEvent, - provider: ethers.Provider, - ): Promise { - // if (!(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR.toLowerCase() in txEvent.addresses)) { - // return [] - // } - // - // const txReceipt = await provider.getTransactionReceipt(txEvent.hash) - // // Nothing to do if the transaction succeeded. - // if (txReceipt?.status === 0) { - // this.logger.debug(`Skipping successful transaction ${txEvent.hash}`) - // return [] - // } - // - // // FIXME: I can't find a node with getTransactionResult call working. - // let decodedLog: ethers.ErrorDescription | null = null - // try { - // const data = await txReceipt?.getResult() - // decodedLog = CSFeeDistributorInterface.parseError(data ?? '') - // } catch (error: any) { - // if (error.code === 'UNSUPPORTED_OPERATION') { - // this.logger.debug('Ethereum RPC does not support `getTransactionResult`') - // return [] - // } - // - // throw error - // } - // - // const reason = decodedLog?.name - // if (!reason) { - // return [] - // } - // - // switch (reason) { - // case 'InvalidShares': - // return [failedTxAlert(txEvent, 'CSFeeOracle reports incorrect amount of shares to distribute', 'InvalidShares')] - // case 'NotEnoughShares': - // return [failedTxAlert(txEvent, 'CSFeeDistributor internal accounting error', 'NotEnoughShares')] - // case 'InvalidTreeRoot': - // return [failedTxAlert(txEvent, 'CSFeeOracle built incorrect report', 'InvalidTreeRoot')] - // case 'InvalidTreeCID': - // return [failedTxAlert(txEvent, 'CSFeeOracle built incorrect report', 'InvalidTreeCID')] - // default: - // this.logger.warn(`Unrecognized revert reason: ${reason}`) - // } - - return [] - } + // private async handleRevertedTx( + // txEvent: TransactionEvent, + // provider: ethers.Provider, + // ): Promise { + // if (!(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR.toLowerCase() in txEvent.addresses)) { + // return [] + // } + // + // const txReceipt = await provider.getTransactionReceipt(txEvent.hash) + // // Nothing to do if the transaction succeeded. + // if (txReceipt?.status === 0) { + // this.logger.debug(`Skipping successful transaction ${txEvent.hash}`) + // return [] + // } + // + // // FIXME: I can't find a node with getTransactionResult call working. + // let decodedLog: ethers.ErrorDescription | null = null + // try { + // const data = await txReceipt?.getResult() + // decodedLog = CSFeeDistributorInterface.parseError(data ?? '') + // } catch (error: any) { + // if (error.code === 'UNSUPPORTED_OPERATION') { + // this.logger.debug('Ethereum RPC does not support `getTransactionResult`') + // return [] + // } + // + // throw error + // } + // + // const reason = decodedLog?.name + // if (!reason) { + // return [] + // } + // + // switch (reason) { + // case 'InvalidShares': + // return [failedTxAlert(txEvent, 'CSFeeOracle reports incorrect amount of shares to distribute', 'InvalidShares')] + // case 'NotEnoughShares': + // return [failedTxAlert(txEvent, 'CSFeeDistributor internal accounting error', 'NotEnoughShares')] + // case 'InvalidTreeRoot': + // return [failedTxAlert(txEvent, 'CSFeeOracle built incorrect report', 'InvalidTreeRoot')] + // case 'InvalidTreeCID': + // return [failedTxAlert(txEvent, 'CSFeeOracle built incorrect report', 'InvalidTreeCID')] + // default: + // this.logger.warn(`Unrecognized revert reason: ${reason}`) + // } + // + // return [] + // } private async checkInvariants(blockEvent: BlockEvent, provider: ethers.Provider) { const distributor = CSFeeDistributor__factory.connect( diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts index ff0f29436..cdb1d7805 100644 --- a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts +++ b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts @@ -8,6 +8,7 @@ import { } from '@fortanetwork/forta-bot' import { CSFeeOracle__factory, HashConsensus__factory } from '../../generated/typechain' +import { Service } from '../../shared/types' import { sourceFromEvent } from '../../utils/findings' import { RedefineMode, requireWithTier } from '../../utils/require' import { etherscanAddress } from '../../utils/string' @@ -23,7 +24,7 @@ const ICSFeeOracle = CSFeeOracle__factory.createInterface() // TODO: Extract HashConsensus part maybe? -export class CSFeeOracleSrv { +export class CSFeeOracleSrv implements Service { private membersLastReport: Map< string, { diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.ts b/csm-alerts/src/services/CSModule/CSModule.srv.ts index 8cf8a87aa..91768ecdc 100644 --- a/csm-alerts/src/services/CSModule/CSModule.srv.ts +++ b/csm-alerts/src/services/CSModule/CSModule.srv.ts @@ -13,6 +13,7 @@ import { IS_CLI } from '../../config' import { CSModule__factory, StakingRouter__factory } from '../../generated/typechain' import { getLogger } from '../../logger' import { BASIS_POINT_MUL, SECONDS_PER_DAY } from '../../shared/constants' +import { Service } from '../../shared/types' import { sourceFromEvent } from '../../utils/findings' import { RedefineMode, requireWithTier } from '../../utils/require' import * as Constants from '../constants' @@ -49,7 +50,7 @@ class Batch { } } -export class CSModuleSrv { +export class CSModuleSrv implements Service { private readonly logger: Logger private lastFiredAt = { @@ -69,10 +70,7 @@ export class CSModuleSrv { ] } - async handleTransaction( - txEvent: TransactionEvent, - provider: ethers.Provider, - ): Promise { + async handleTransaction(txEvent: TransactionEvent): Promise { return this.handleNotableOperatorsCreated(txEvent) } diff --git a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts index 0407680e2..3c6e3d386 100644 --- a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts +++ b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts @@ -1,7 +1,7 @@ -import { Finding, TransactionEvent, ethers } from '@fortanetwork/forta-bot' +import { Finding, TransactionEvent } from '@fortanetwork/forta-bot' import { handleEventsOfNotice } from '../../entity/events' -import { DeployedAddresses, EventOfNotice } from '../../shared/types' +import { DeployedAddresses, EventOfNotice, Service } from '../../shared/types' import { RedefineMode, requireWithTier } from '../../utils/require' import * as Constants from '../constants' import * as Events from './events' @@ -44,7 +44,7 @@ const CSM_PAUSABLE_CONTRACTS = [ asContract('CS_FEE_ORACLE'), ] -export class EventsWatcherSrv { +export class EventsWatcherSrv implements Service { private readonly eventsOfNotice: EventOfNotice[] constructor() { @@ -61,7 +61,7 @@ export class EventsWatcherSrv { ] } - public handleTransaction(txEvent: TransactionEvent, provider: ethers.Provider): Finding[] { + public async handleTransaction(txEvent: TransactionEvent): Promise { return handleEventsOfNotice(txEvent, this.eventsOfNotice) } } diff --git a/csm-alerts/src/shared/types.ts b/csm-alerts/src/shared/types.ts index 48a669eab..1b8b916e6 100644 --- a/csm-alerts/src/shared/types.ts +++ b/csm-alerts/src/shared/types.ts @@ -1,4 +1,10 @@ -import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' +import { + FindingSeverity, + FindingType, + HandleBlock, + HandleTransaction, + ethers, +} from '@fortanetwork/forta-bot' export type EventOfNotice = { name: string @@ -23,3 +29,13 @@ export type DeployedAddresses = { HASH_CONSENSUS: string STAKING_ROUTER: string } + +interface Initialize { + (blockIdentifier: ethers.BlockTag, provider: ethers.Provider): Promise +} + +export interface Service { + handleTransaction?: HandleTransaction + handleBlock?: HandleBlock + initialize?: Initialize +} diff --git a/csm-alerts/src/utils/require.ts b/csm-alerts/src/utils/require.ts index 53bced876..80a38b576 100644 --- a/csm-alerts/src/utils/require.ts +++ b/csm-alerts/src/utils/require.ts @@ -20,9 +20,8 @@ export function requireWithTier( ): T { const defaultContent = require(`${module.path}/${path}`) if (!RUN_TIER) return defaultContent - let tieredContent: any // NOTE: It fails if it can't find the requested tier. - tieredContent = require(`${module.path}/${path}.${RUN_TIER}`) + const tieredContent = require(`${module.path}/${path}.${RUN_TIER}`) module.exports.__tier__ = RUN_TIER if (mode == RedefineMode.Strict) { const valid = (key: string) => { diff --git a/csm-alerts/src/utils/version.ts b/csm-alerts/src/utils/version.ts index 6913e5525..f21e2ccff 100644 --- a/csm-alerts/src/utils/version.ts +++ b/csm-alerts/src/utils/version.ts @@ -1,6 +1,6 @@ import path from 'path' -export interface Version { +export interface VersionJSON { desc: string commitHash: string commitHashShort: string @@ -11,9 +11,10 @@ export interface Version { export default readVersion(path.join(__dirname, '..', '..', 'version.json')) -function readVersion(versionFilePath: string): Version { +function readVersion(versionFilePath: string): VersionJSON { try { return require(versionFilePath) + // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { return { desc: 'unknown', From 21308f018c0534248b0e666a3d8151d9d0c5827f Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Tue, 15 Oct 2024 09:57:06 +0300 Subject: [PATCH 09/45] chore: some alerts touch ups --- csm-alerts/src/services/EventsWatcher/events/oracle.ts | 2 +- csm-alerts/src/services/EventsWatcher/events/pausable.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/csm-alerts/src/services/EventsWatcher/events/oracle.ts b/csm-alerts/src/services/EventsWatcher/events/oracle.ts index 9d19fe42a..7871b9e48 100644 --- a/csm-alerts/src/services/EventsWatcher/events/oracle.ts +++ b/csm-alerts/src/services/EventsWatcher/events/oracle.ts @@ -64,7 +64,7 @@ export function getHashConsensusEvents( alertId: 'HASH-CONSENSUS-FRAME-CONFIG-SET', name: 'πŸ”΄ HashConsensus: Frame config set', description: (args: ethers.Result) => - `Frame configuration set.\n` + + `Frame configuration set:\n` + `New initial epoch: ${args.newInitialEpoch}\n` + `Epochs per frame: ${args.newEpochsPerFrame}`, severity: FindingSeverity.High, diff --git a/csm-alerts/src/services/EventsWatcher/events/pausable.ts b/csm-alerts/src/services/EventsWatcher/events/pausable.ts index 44cbe419b..a996384b9 100644 --- a/csm-alerts/src/services/EventsWatcher/events/pausable.ts +++ b/csm-alerts/src/services/EventsWatcher/events/pausable.ts @@ -3,7 +3,7 @@ import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' import { PausableUntil__factory } from '../../../generated/typechain' import { EventOfNotice } from '../../../shared/types' -import { toKebabCase } from '../../../utils/string' +import { etherscanAddress, toKebabCase } from '../../../utils/string' import { formatDelay } from '../../../utils/time' const IPausableUntil = PausableUntil__factory.createInterface() @@ -16,7 +16,7 @@ export function getPausableEvents(contracts: { name: string; address: string }[] abi: IPausableUntil.getEvent('Paused').format('full'), alertId: `${toKebabCase(contract.name)}-PAUSED`, name: `🚨 ${contract.name}: contract was paused`, - description: (args: Result) => `Contract paused for ${formatDelay(args.duration)}`, + description: (args: Result) => `Contract ${etherscanAddress(contract.address)} paused for ${formatDelay(args.duration)}`, severity: FindingSeverity.Critical, type: FindingType.Info, }, @@ -25,7 +25,7 @@ export function getPausableEvents(contracts: { name: string; address: string }[] abi: IPausableUntil.getEvent('Resumed').format('full'), alertId: `${toKebabCase(contract.name)}-RESUMED`, name: `🚨 ${contract.name}: contract was resumed`, - description: () => `Contract ${contract.address} was resumed`, + description: () => `Contract ${etherscanAddress(contract.address)} was resumed`, severity: FindingSeverity.Critical, type: FindingType.Info, }, From 38b9c637ecbd80e1c70f089871358061f9d2759c Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Tue, 15 Oct 2024 10:00:21 +0300 Subject: [PATCH 10/45] feat: extract block identifier in range mode --- csm-alerts/src/main.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/csm-alerts/src/main.ts b/csm-alerts/src/main.ts index af25a5e8b..dc6b16a0b 100644 --- a/csm-alerts/src/main.ts +++ b/csm-alerts/src/main.ts @@ -120,6 +120,11 @@ async function getHandlers() { async function parseArgs() { let blockIdentifier: string | number | undefined = process.env['FORTA_CLI_BLOCK'] + + if (process.env['FORTA_CLI_RANGE']) { + blockIdentifier = process.env['FORTA_CLI_RANGE'].split('..')[0] + } + if (blockIdentifier && !blockIdentifier.startsWith('0x')) { blockIdentifier = parseInt(blockIdentifier) } From 70783ad7ef6e3a7cc605f14b530de5d2f79e1670 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Tue, 15 Oct 2024 10:00:44 +0300 Subject: [PATCH 11/45] chore: fill in mainnet addresses --- csm-alerts/src/services/constants.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/csm-alerts/src/services/constants.ts b/csm-alerts/src/services/constants.ts index 5ae576c08..07c86b6a8 100644 --- a/csm-alerts/src/services/constants.ts +++ b/csm-alerts/src/services/constants.ts @@ -1,17 +1,17 @@ import { DeployedAddresses } from '../shared/types' export const DEPLOYED_ADDRESSES: DeployedAddresses = { - CS_MODULE: '0x0000000000000000000000000000000000000000', - CS_ACCOUNTING: '0x0000000000000000000000000000000000000000', - CS_FEE_DISTRIBUTOR: '0x0000000000000000000000000000000000000000', - CS_FEE_ORACLE: '0x0000000000000000000000000000000000000000', - CS_VERIFIER: '0x0000000000000000000000000000000000000000', - CS_EARLY_ADOPTION: '0x0000000000000000000000000000000000000000', - CS_GATE_SEAL: '0x0000000000000000000000000000000000000000', - LIDO_STETH: '0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034', - BURNER: '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84 ', - HASH_CONSENSUS: '0x0000000000000000000000000000000000000000', - STAKING_ROUTER: '0x0000000000000000000000000000000000000000', + CS_MODULE: '0xdA7dE2ECdDfccC6c3AF10108Db212ACBBf9EA83F', + CS_ACCOUNTING: '0x4d72BFF1BeaC69925F8Bd12526a39BAAb069e5Da', + CS_FEE_DISTRIBUTOR: '0xD99CC66fEC647E68294C6477B40fC7E0F6F618D0', + CS_FEE_ORACLE: '0x4D4074628678Bd302921c20573EEa1ed38DdF7FB', + CS_VERIFIER: '0x3Dfc50f22aCA652a0a6F28a0F892ab62074b5583', + CS_EARLY_ADOPTION: '0x3D5148ad93e2ae5DedD1f7A8B3C19E7F67F90c0E', + CS_GATE_SEAL: '0x5cFCa30450B1e5548F140C24A47E36c10CE306F0', + LIDO_STETH: '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', + BURNER: '0xD15a672319Cf0352560eE76d9e89eAB0889046D3', + HASH_CONSENSUS: '0x71093efF8D8599b5fA340D665Ad60fA7C80688e4', + STAKING_ROUTER: '0xFdDf38947aFB03C621C71b06C9C70bce73f12999', } export const ALIASES: Record = { From dbfbc1558e8d0fcb5274c39390b88876b959e2d3 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Tue, 15 Oct 2024 12:23:51 +0300 Subject: [PATCH 12/45] chore: use common alert id for launch event --- csm-alerts/src/utils/findings.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csm-alerts/src/utils/findings.ts b/csm-alerts/src/utils/findings.ts index f2972e89a..90af36224 100644 --- a/csm-alerts/src/utils/findings.ts +++ b/csm-alerts/src/utils/findings.ts @@ -25,7 +25,7 @@ export function launchAlert(): Finding { return Finding.fromObject({ name: `πŸš€πŸš€πŸš€ Bot ${APP_NAME} launched`, description: `Commit ${Version.commitHashShort}`, - alertId: 'BOT-LAUNCH', + alertId: 'LIDO-AGENT-LAUNCHED', severity: FindingSeverity.Info, type: FindingType.Info, }) From ff607c65efdec3098f7cfd54ea6eb814603731bd Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Tue, 15 Oct 2024 12:24:23 +0300 Subject: [PATCH 13/45] fix: formatDelay function --- csm-alerts/src/utils/time.ts | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/csm-alerts/src/utils/time.ts b/csm-alerts/src/utils/time.ts index 9dccd23d2..93242c09d 100644 --- a/csm-alerts/src/utils/time.ts +++ b/csm-alerts/src/utils/time.ts @@ -22,6 +22,10 @@ function formatTimeToHumanReadable(date: Date): string { export function formatDelay(fullDelaySec: bigint | number): string { fullDelaySec = BigInt(fullDelaySec) + if (fullDelaySec === 0n) { + return '0 sec' + } + const sign = fullDelaySec >= 0 ? 1n : -1n fullDelaySec = sign * fullDelaySec @@ -40,11 +44,14 @@ export function formatDelay(fullDelaySec: bigint | number): string { delayHours -= delayDays * 24n } - return ( - (sign == 1n ? '' : '-') + - (delayDays > 0 ? `${delayDays} day` : '') + - (delayHours > 0 ? ` ${delayHours} hr` : '') + - (delayMin > 0 ? ` ${delayMin} min` : '') + - (delaySec > 0 ? ` ${delaySec} sec` : '') - ) + const delayString = [ + delayDays > 0 ? `${delayDays} day` : '', + delayHours > 0 ? `${delayHours} hr` : '', + delayMin > 0 ? `${delayMin} min` : '', + delaySec > 0 ? `${delaySec} sec` : '', + ] + .filter(Boolean) + .join(' ') + + return `${sign ? '' : '-'}${delayString}` } From a2fc787096052d4dbfc4fd6c514481458ad4d370 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Tue, 15 Oct 2024 14:29:06 +0300 Subject: [PATCH 14/45] feat: add SDKv1 shim --- csm-alerts/package.json | 2 + csm-alerts/src/agent.ts | 117 +++ .../services/CSAccounting/CSAccounting.srv.ts | 6 +- .../CSFeeDistributor/CSFeeDistributor.srv.ts | 6 +- .../services/CSFeeOracle/CSFeeOracle.srv.ts | 12 + .../src/services/CSModule/CSModule.srv.ts | 6 +- .../EventsWatcher/EventsWatcher.srv.ts | 10 + csm-alerts/src/shared/types.ts | 1 + csm-alerts/src/utils/shim.ts | 39 + csm-alerts/yarn.lock | 743 +++++++++++++++++- 10 files changed, 899 insertions(+), 43 deletions(-) create mode 100644 csm-alerts/src/agent.ts create mode 100644 csm-alerts/src/utils/shim.ts diff --git a/csm-alerts/package.json b/csm-alerts/package.json index c7449e633..f2aa2a8fb 100644 --- a/csm-alerts/package.json +++ b/csm-alerts/package.json @@ -48,7 +48,9 @@ "dotenv": "^16.4.5", "ethers": "^6.9.0", "express": "^4.19.2", + "forta-agent": "^0.1.48", "fp-ts": "^2.16.1", + "google-protobuf": "^3.21.4", "knex": "^3.1.0", "lodash": "^4.17.21", "prom-client": "^15.1.2", diff --git a/csm-alerts/src/agent.ts b/csm-alerts/src/agent.ts new file mode 100644 index 000000000..ae879b5b7 --- /dev/null +++ b/csm-alerts/src/agent.ts @@ -0,0 +1,117 @@ +// SDKv1 aka 'forta-agent' shim. + +import { getChainId, getProvider } from '@fortanetwork/forta-bot' +import { Finding, HandleBlock, HandleTransaction, Initialize, getJsonRpcUrl } from 'forta-agent' +import yargs from 'yargs' + +import { getLogger } from './logger' +import { CSAccountingSrv } from './services/CSAccounting/CSAccounting.srv' +import { CSFeeDistributorSrv } from './services/CSFeeDistributor/CSFeeDistributor.srv' +import { CSFeeOracleSrv } from './services/CSFeeOracle/CSFeeOracle.srv' +import { CSModuleSrv } from './services/CSModule/CSModule.srv' +import { EventsWatcherSrv } from './services/EventsWatcher/EventsWatcher.srv' +import { launchAlert } from './utils/findings' +import { blockEventV1toV2, findingV2toV1, txEventV1toV2 } from './utils/shim' + +const logger = getLogger('agentV1') + +const SERVICES = [ + new CSFeeDistributorSrv(), + new EventsWatcherSrv(), + new CSAccountingSrv(), + new CSFeeOracleSrv(), + new CSModuleSrv(), +] + +let isLaunchReported = false + +const handleBlock: HandleBlock = async (blockEvent) => { + const out: Finding[] = [] + + const provider = await getProvider({ rpcUrl: getJsonRpcUrl() }) + const blockEventV2 = blockEventV1toV2(blockEvent, getChainId()) + + for (const srv of SERVICES.filter((srv) => 'handleBlock' in srv)) { + const findings = await srv.handleBlock(blockEventV2, provider) + out.push(...findings.map(findingV2toV1)) + } + + if (!isLaunchReported) { + out.push(findingV2toV1(launchAlert())) + isLaunchReported = true + } + + return out +} + +const handleTransaction: HandleTransaction = async (txEvent) => { + const out: Finding[] = [] + + const provider = await getProvider({ rpcUrl: getJsonRpcUrl() }) + const txEventV2 = txEventV1toV2(txEvent, getChainId()) + + for (const srv of SERVICES.filter((srv) => 'handleTransaction' in srv)) { + const findings = await srv.handleTransaction(txEventV2, provider) + out.push(...findings.map(findingV2toV1)) + } + + return out +} + +const initialize: Initialize = async () => { + const { blockIdentifier } = await parseArgs() + + for (const srv of SERVICES.filter((srv) => 'initialize' in srv)) { + logger.debug(`Running 'initialize' on ${srv.getName()}`) + await srv.initialize( + blockIdentifier ?? 'latest', + await getProvider({ + rpcUrl: getJsonRpcUrl(), + }), + ) + } + + logger.debug('Initialization complete') +} + +async function parseArgs() { + const argv = await yargs(process.argv.slice(2)) + .option('range', { type: 'string' }) + .option('block', { type: 'string' }) + .option('tx', { type: 'string' }).argv + + let blockIdentifier: string | number | undefined = argv.block + + if (argv.range) { + blockIdentifier = argv.range.split('..')[0] + } + + if (blockIdentifier && !blockIdentifier.startsWith('0x')) { + blockIdentifier = parseInt(blockIdentifier) + } + + const txIdentifier = argv.tx + if (txIdentifier) { + const provider = await getProvider({ + rpcUrl: getJsonRpcUrl(), + }) + + const tx = await provider.getTransaction(txIdentifier) + if (!tx?.blockHash) { + throw Error(`Transaction ${txIdentifier} not mined`) + } + + blockIdentifier = tx.blockHash + } + + return { + blockIdentifier, + txIdentifier, + } +} + +export default { + handleTransaction, + handleBlock, + initialize, +} diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts index efd9e26c0..41c84591b 100644 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts @@ -43,7 +43,11 @@ export class CSAccountingSrv implements Service { } constructor() { - this.logger = getLogger(CSAccountingSrv.name) + this.logger = getLogger(this.getName()) + } + + getName() { + return CSAccountingSrv.name } async handleBlock(blockEvent: BlockEvent, provider: ethers.Provider): Promise { diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts index f22ea5358..e62f2fdab 100644 --- a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts @@ -46,7 +46,11 @@ export class CSFeeDistributorSrv implements Service { } constructor() { - this.logger = getLogger(CSFeeDistributorSrv.name) + this.logger = getLogger(this.getName()) + } + + getName() { + return CSFeeDistributorSrv.name } async initialize(blockIdentifier: ethers.BlockTag, provider: ethers.Provider): Promise { diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts index cdb1d7805..c8750592b 100644 --- a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts +++ b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts @@ -6,8 +6,10 @@ import { ethers, filterLog, } from '@fortanetwork/forta-bot' +import { Logger } from 'winston' import { CSFeeOracle__factory, HashConsensus__factory } from '../../generated/typechain' +import { getLogger } from '../../logger' import { Service } from '../../shared/types' import { sourceFromEvent } from '../../utils/findings' import { RedefineMode, requireWithTier } from '../../utils/require' @@ -25,6 +27,8 @@ const ICSFeeOracle = CSFeeOracle__factory.createInterface() // TODO: Extract HashConsensus part maybe? export class CSFeeOracleSrv implements Service { + private readonly logger: Logger + private membersLastReport: Map< string, { @@ -33,6 +37,14 @@ export class CSFeeOracleSrv implements Service { } > = new Map() + constructor() { + this.logger = getLogger(this.getName()) + } + + getName() { + return CSFeeOracleSrv.name + } + public async initialize( blockIdentifier: ethers.BlockTag, provider: ethers.Provider, diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.ts b/csm-alerts/src/services/CSModule/CSModule.srv.ts index 91768ecdc..317664c75 100644 --- a/csm-alerts/src/services/CSModule/CSModule.srv.ts +++ b/csm-alerts/src/services/CSModule/CSModule.srv.ts @@ -60,7 +60,11 @@ export class CSModuleSrv implements Service { } constructor() { - this.logger = getLogger(CSModuleSrv.name) + this.logger = getLogger(this.getName()) + } + + getName() { + return CSModuleSrv.name } async handleBlock(blockEvent: BlockEvent, provider: ethers.Provider): Promise { diff --git a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts index 3c6e3d386..ecaf8eaff 100644 --- a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts +++ b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts @@ -1,10 +1,12 @@ import { Finding, TransactionEvent } from '@fortanetwork/forta-bot' +import { Logger } from 'winston' import { handleEventsOfNotice } from '../../entity/events' import { DeployedAddresses, EventOfNotice, Service } from '../../shared/types' import { RedefineMode, requireWithTier } from '../../utils/require' import * as Constants from '../constants' import * as Events from './events' +import { getLogger } from '../../logger' const { ALIASES, DEPLOYED_ADDRESSES, ORACLE_MEMBERS } = requireWithTier( module, @@ -45,6 +47,8 @@ const CSM_PAUSABLE_CONTRACTS = [ ] export class EventsWatcherSrv implements Service { + private readonly logger: Logger + private readonly eventsOfNotice: EventOfNotice[] constructor() { @@ -59,6 +63,12 @@ export class EventsWatcherSrv implements Service { ...Events.getRolesMonitoringEvents(CSM_ACL_CONTRACTS), ...Events.getPausableEvents(CSM_PAUSABLE_CONTRACTS), ] + + this.logger = getLogger(this.getName()) + } + + getName() { + return EventsWatcherSrv.name } public async handleTransaction(txEvent: TransactionEvent): Promise { diff --git a/csm-alerts/src/shared/types.ts b/csm-alerts/src/shared/types.ts index 1b8b916e6..4e2dc9f09 100644 --- a/csm-alerts/src/shared/types.ts +++ b/csm-alerts/src/shared/types.ts @@ -38,4 +38,5 @@ export interface Service { handleTransaction?: HandleTransaction handleBlock?: HandleBlock initialize?: Initialize + getName: () => string } diff --git a/csm-alerts/src/utils/shim.ts b/csm-alerts/src/utils/shim.ts new file mode 100644 index 000000000..fba5122f4 --- /dev/null +++ b/csm-alerts/src/utils/shim.ts @@ -0,0 +1,39 @@ +import { + BlockEvent as BlockEventV2, + Finding as FindingV2, + TransactionEvent as TransactionEventV2, +} from '@fortanetwork/forta-bot' +import { + BlockEvent as BlockEventV1, + Finding as FindingV1, + TransactionEvent as TransactionEventV1, +} from 'forta-agent' + +export function blockEventV1toV2( + blockEvent: BlockEventV1, + chainId: number | undefined, +): BlockEventV2 { + return new BlockEventV2(chainId ?? 1, blockEvent.block) +} + +export function txEventV1toV2( + txEvent: TransactionEventV1, + chainId: number | undefined, +): TransactionEventV2 { + return new TransactionEventV2( + chainId ?? 1, + txEvent.transaction, + [], // traces + txEvent.addresses, + txEvent.block, + txEvent.logs, + txEvent.contractAddress, + ) +} + +export function findingV2toV1(finding: FindingV2): FindingV1 { + return FindingV1.fromObject({ + ...finding, + labels: [], + }) +} diff --git a/csm-alerts/yarn.lock b/csm-alerts/yarn.lock index 542b6cdda..f9888b171 100644 --- a/csm-alerts/yarn.lock +++ b/csm-alerts/yarn.lock @@ -393,7 +393,7 @@ dependencies: levn "^0.4.1" -"@ethersproject/abi@^5.0.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -408,7 +408,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@^5.7.0": +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== @@ -421,7 +421,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@^5.7.0": +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== @@ -432,7 +432,7 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@^5.7.0": +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -443,14 +443,14 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@^5.7.0": +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@^5.7.0": +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== @@ -458,7 +458,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -467,21 +467,37 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@^5.7.0": +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/hash@^5.7.0": +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -496,7 +512,44 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/keccak256@^5.7.0": +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -504,26 +557,34 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@^5.7.0": +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@^5.7.0": +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/properties@^5.7.0": +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@^5.0.0": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.0.0": version "5.7.2" resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -549,7 +610,7 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@^5.7.0": +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== @@ -557,7 +618,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@^5.7.0": +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== @@ -565,7 +626,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@^5.7.0": +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== @@ -574,7 +635,7 @@ "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@^5.7.0": +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== @@ -586,7 +647,19 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/strings@^5.7.0": +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -595,7 +668,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -610,7 +683,37 @@ "@ethersproject/rlp" "^5.7.0" "@ethersproject/signing-key" "^5.7.0" -"@ethersproject/web@^5.7.0": +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -621,6 +724,17 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@faker-js/faker@^8.3.1": version "8.4.1" resolved "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz" @@ -658,6 +772,35 @@ murmurhash3js "^3.0.1" sha3 "^2.1.4" +"@grpc/grpc-js@^1.3.6": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.2.tgz#97eda82dd49bb9c24eaf6434ea8d7de446e95aac" + integrity sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg== + dependencies: + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" + +"@grpc/proto-loader@^0.6.4": + version "0.6.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.13.tgz#008f989b72a40c60c96cd4088522f09b05ac66bc" + integrity sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g== + dependencies: + "@types/long" "^4.0.1" + lodash.camelcase "^4.3.0" + long "^4.0.0" + protobufjs "^6.11.3" + yargs "^16.2.0" + +"@grpc/proto-loader@^0.7.13": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" + integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" @@ -930,6 +1073,11 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== + "@noble/curves@1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz" @@ -993,6 +1141,59 @@ resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + "@rtsao/scc@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" @@ -1199,6 +1400,11 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.9.tgz#0dc4902c229f6b8e2ac5456522104d7b1a230290" integrity sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w== +"@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + "@types/mime@^1": version "1.3.5" resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" @@ -1223,6 +1429,13 @@ resolved "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz" integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== +"@types/node@>=13.7.0": + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== + dependencies: + undici-types "~6.19.2" + "@types/node@^20.14.2": version "20.16.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.10.tgz#0cc3fdd3daf114a4776f54ba19726a01c907ef71" @@ -1291,6 +1504,11 @@ resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/ws@^8.5.10": version "8.5.12" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" @@ -1469,6 +1687,11 @@ acorn@^8.11.0, acorn@^8.12.0, acorn@^8.4.1, acorn@^8.9.0: resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + aes-js@4.0.0-beta.5: version "4.0.0-beta.5" resolved "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz" @@ -1626,6 +1849,15 @@ arraybuffer.prototype.slice@^1.0.3: is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" +asn1.js@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + async-mutex@^0.4.0: version "0.4.1" resolved "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz" @@ -1633,6 +1865,13 @@ async-mutex@^0.4.0: dependencies: tslib "^2.4.0" +async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + async@^3.2.3: version "3.2.5" resolved "https://registry.npmjs.org/async/-/async-3.2.5.tgz" @@ -1650,6 +1889,14 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" +awilix@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/awilix/-/awilix-4.3.4.tgz#aeecc662efa96256981af3bc6243eb201c8b4a4f" + integrity sha512-NgRwUPxUnoK+OTRa2fXcRQVFPOPQXlwCN1FJPkhO3IHKQJHokhdVpDfgz9L3VZTcA1iSaOFE3N/Q/5P7lIDqig== + dependencies: + camel-case "^4.1.2" + glob "^7.1.6" + awilix@^9.0.0: version "9.0.0" resolved "https://registry.npmjs.org/awilix/-/awilix-9.0.0.tgz" @@ -1762,7 +2009,7 @@ bintrees@1.0.2: resolved "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz" integrity sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw== -bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -1812,12 +2059,12 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -brorand@^1.1.0: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browserify-aes@1.2.0: +browserify-aes@1.2.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -1829,6 +2076,50 @@ browserify-aes@1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz#06e530907fe2949dc21fc3c2e2302e10b1437238" + integrity sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ== + dependencies: + bn.js "^5.2.1" + randombytes "^2.1.0" + safe-buffer "^5.2.1" + +browserify-sign@^4.0.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" + integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== + dependencies: + bn.js "^5.2.1" + browserify-rsa "^4.1.0" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.5" + hash-base "~3.0" + inherits "^2.0.4" + parse-asn1 "^5.1.7" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + browserslist@^4.23.1: version "4.24.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" @@ -1957,7 +2248,7 @@ ci-info@^3.2.0: resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -cipher-base@^1.0.0, cipher-base@^1.0.1: +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== @@ -1970,6 +2261,15 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz" integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" @@ -2106,7 +2406,20 @@ cookie@0.6.0: resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== -create-hash@^1.1.0: +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== @@ -2117,6 +2430,18 @@ create-hash@^1.1.0: ripemd160 "^2.0.1" sha.js "^2.4.0" +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + create-jest@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz" @@ -2144,6 +2469,23 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypto-browserify@3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + data-view-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" @@ -2254,6 +2596,14 @@ depd@2.0.0: resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" @@ -2274,6 +2624,15 @@ diff@^4.0.1: resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" @@ -2330,6 +2689,19 @@ elliptic@6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.5: + version "6.5.7" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" + integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emittery@^0.13.1: version "0.13.1" resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" @@ -2761,6 +3133,42 @@ ethereum-cryptography@1.1.2: "@scure/bip32" "1.1.0" "@scure/bip39" "1.1.0" +ethers@^5.5.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + ethers@^6.9.0: version "6.13.1" resolved "https://registry.npmjs.org/ethers/-/ethers-6.13.1.tgz" @@ -2774,7 +3182,7 @@ ethers@^6.9.0: tslib "2.4.0" ws "8.17.1" -evp_bytestokey@^1.0.3: +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== @@ -3017,6 +3425,33 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +forta-agent@^0.1.48: + version "0.1.48" + resolved "https://registry.yarnpkg.com/forta-agent/-/forta-agent-0.1.48.tgz#d2660eb0c8db3daf554079176836ba5bec8d3d4f" + integrity sha512-fk3mar7/Avqg/4OHFmgv01ww/azr1XM+g5KcSnwvNxZy3KDMi7aFp1jAjPCsBjs8ZyVcR03ITUlbtFpRVgZB4Q== + dependencies: + "@grpc/grpc-js" "^1.3.6" + "@grpc/proto-loader" "^0.6.4" + "@types/uuid" "^8.3.4" + async-retry "^1.3.3" + awilix "^4.3.4" + axios "^1.6.2" + base64-arraybuffer "^1.0.2" + ethers "^5.5.1" + flat-cache "^3.0.4" + form-data "^4.0.0" + jsonc "^2.0.0" + keythereum "^1.2.0" + lodash "^4.17.21" + murmurhash3js "^3.0.1" + n-readlines "^1.0.1" + prompts "^2.4.1" + python-shell "^3.0.0" + sha3 "^2.1.4" + shelljs "^0.8.4" + uuid "^8.3.2" + yargs "^17.0.1" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" @@ -3149,7 +3584,7 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -3209,6 +3644,11 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" +google-protobuf@^3.21.4: + version "3.21.4" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.4.tgz#2f933e8b6e5e9f8edde66b7be0024b68f77da6c9" + integrity sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ== + gopd@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" @@ -3274,6 +3714,14 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" +hash-base@~3.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" @@ -3380,7 +3828,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3579,6 +4027,11 @@ isarray@^2.0.5: resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -4091,6 +4544,26 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +keccak@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +keythereum@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/keythereum/-/keythereum-1.2.0.tgz#3e6c2d7451ef4fde011f8008348c194f7e58c86a" + integrity sha512-u3XnjIruOmjIvJ4tH1Wdr2y0X8+z8BZTQ+dqJuDMyLvNWw6VnH9XKtt0yauSE+96Bq97h6CPm4w5LbW3i28x0g== + dependencies: + crypto-browserify "3.12.0" + keccak "3.0.1" + scrypt-js "3.0.1" + secp256k1 "4.0.2" + sjcl "1.0.6" + uuid "3.0.0" + keythereum@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/keythereum/-/keythereum-2.0.0.tgz#d06de5511d8327f58a6451058208d6327793bb55" @@ -4201,6 +4674,16 @@ logform@^2.6.0, logform@^2.6.1: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +long@^5.0.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" @@ -4281,6 +4764,14 @@ micromatch@^4.0.4: braces "^3.0.3" picomatch "^2.3.1" +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" @@ -4371,6 +4862,11 @@ murmurhash3js@^3.0.1: resolved "https://registry.npmjs.org/murmurhash3js/-/murmurhash3js-3.0.1.tgz" integrity sha512-KL8QYUaxq7kUbcl0Yto51rMcYt7E/4N4BG3/c96Iqw1PQrTRspu8Cpx4TZ4Nunib1d4bEkIH3gjCYlP2RLBdow== +n-readlines@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/n-readlines/-/n-readlines-1.0.1.tgz#bbb7364d38bc31a170a199f986fcacfa76b95f6e" + integrity sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -4389,6 +4885,16 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-gyp-build@^4.2.0: + version "4.8.2" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" + integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" @@ -4555,6 +5061,18 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-asn1@^5.0.0, parse-asn1@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06" + integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== + dependencies: + asn1.js "^4.10.1" + browserify-aes "^1.2.0" + evp_bytestokey "^1.0.3" + hash-base "~3.0" + pbkdf2 "^3.1.2" + safe-buffer "^5.2.1" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" @@ -4616,6 +5134,17 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pbkdf2@^3.0.3, pbkdf2@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + pg-connection-string@2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz" @@ -4690,6 +5219,11 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + prom-client@^15.1.2: version "15.1.3" resolved "https://registry.npmjs.org/prom-client/-/prom-client-15.1.3.tgz" @@ -4698,7 +5232,7 @@ prom-client@^15.1.2: "@opentelemetry/api" "^1.4.0" tdigest "^0.1.1" -prompts@^2.0.1, prompts@^2.4.2: +prompts@^2.0.1, prompts@^2.4.1, prompts@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -4706,6 +5240,43 @@ prompts@^2.0.1, prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" +protobufjs@^6.11.3: + version "6.11.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" + integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + +protobufjs@^7.2.5: + version "7.4.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" @@ -4724,6 +5295,18 @@ pstree.remy@^1.1.8: resolved "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + punycode@^2.1.0: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" @@ -4734,6 +5317,11 @@ pure-rand@^6.0.0: resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== +python-shell@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/python-shell/-/python-shell-3.0.1.tgz#c3d3b11536e6ebdb8d6a2602482f7180d940bb13" + integrity sha512-TWeotuxe1auhXa5bGRScxnc2J+0r41NBntSa6RYZtMBLtAEsvCboKrEbW6DvASosWQepVkhZZlT3B5Ei766G+Q== + qs@6.11.0: version "6.11.0" resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" @@ -4746,6 +5334,21 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + range-parser@~1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" @@ -4766,6 +5369,19 @@ react-is@^18.0.0: resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== +readable-stream@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" @@ -4859,6 +5475,11 @@ resolve@^1.1.6, resolve@^1.20.0, resolve@^1.22.4, resolve@^1.8.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +retry@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" @@ -4871,7 +5492,7 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -ripemd160@^2.0.1: +ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== @@ -4896,12 +5517,12 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0: +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -4925,6 +5546,20 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" + integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== + dependencies: + elliptic "^6.5.2" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" @@ -4996,7 +5631,7 @@ setprototypeof@1.2.0: resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -sha.js@^2.4.0: +sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== @@ -5023,7 +5658,7 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@^0.8.5: +shelljs@^0.8.4, shelljs@^0.8.5: version "0.8.5" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== @@ -5066,6 +5701,11 @@ sisteransi@^1.0.5: resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +sjcl@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/sjcl/-/sjcl-1.0.6.tgz#6415462a63cc0d4215c49baec9d3fa0c1b53520f" + integrity sha512-oUVs+hzMSWEZ3rdeDL461QilvvEU2OL9q6T42lpVi2C5Proej9obVZ1nQeY9T96NxoMy/dqw82m33MfNNEmYJg== + slash@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" @@ -5156,7 +5796,7 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.1.1: +string_decoder@^1.1.1, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== @@ -5573,7 +6213,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@^1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -5583,7 +6223,12 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@8.3.2: +uuid@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.0.tgz#6728fc0459c450d796a99c31837569bdf672d728" + integrity sha512-rqE1LoOVLv3QrZMjb4NkF5UWlkurCfPyItVnFPNKDDGkHw4dQUdE4zMcLqx28+0Kcf3+bnUk4PisaiRJT4aiaQ== + +uuid@8.3.2, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -5729,12 +6374,30 @@ yallist@^3.0.2: resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.3.1, yargs@^17.7.2: +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.0.1, yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From ac7d0d75f66f201022f026204f236a022ef52928 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 16 Oct 2024 10:18:53 +0300 Subject: [PATCH 15/45] fix: cleanup findings --- csm-alerts/src/abis/ACL.json | 1 + .../services/CSAccounting/CSAccounting.srv.ts | 134 ++++-------------- .../CSFeeDistributor/CSFeeDistributor.srv.ts | 67 ++------- .../services/CSFeeOracle/CSFeeOracle.srv.ts | 75 +++++----- .../src/services/CSModule/CSModule.srv.ts | 8 +- .../EventsWatcher/events/accounting.ts | 11 +- .../EventsWatcher/events/assetRecoverer.ts | 13 +- .../EventsWatcher/events/distributor.ts | 8 +- .../services/EventsWatcher/events/module.ts | 20 +-- .../services/EventsWatcher/events/oracle.ts | 70 +++++---- .../services/EventsWatcher/events/pausable.ts | 5 +- .../services/EventsWatcher/events/proxies.ts | 7 +- .../services/EventsWatcher/events/roles.ts | 31 +++- 13 files changed, 180 insertions(+), 270 deletions(-) create mode 100644 csm-alerts/src/abis/ACL.json diff --git a/csm-alerts/src/abis/ACL.json b/csm-alerts/src/abis/ACL.json new file mode 100644 index 000000000..5bcb04d5b --- /dev/null +++ b/csm-alerts/src/abis/ACL.json @@ -0,0 +1 @@ +[{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]}] diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts index 41c84591b..ed671f7c3 100644 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts @@ -16,7 +16,7 @@ import { SECONDS_PER_DAY, WEI_PER_ETH } from '../../shared/constants' import { Service } from '../../shared/types' import { sourceFromEvent } from '../../utils/findings' import { RedefineMode, requireWithTier } from '../../utils/require' -import { formatEther } from '../../utils/string' +import { etherscanAddress } from '../../utils/string' import * as Constants from '../constants' const { DEPLOYED_ADDRESSES } = requireWithTier( @@ -26,9 +26,6 @@ const { DEPLOYED_ADDRESSES } = requireWithTier( ) const CHECK_ACCOUNTING_INTERVAL_BLOCKS = 301 // ~ every hour -const CHECK_OPERATORS_INTERVAL_BLOCKS = 2401 // ~ 3 times a day -const BOND_AVG_WEI_MIN = WEI_PER_ETH * 1n -const LOCK_TOTAL_WEI_MAX = WEI_PER_ETH * 32n const ACCOUNTING_BALANCE_EXCESS_SHARES_MAX = WEI_PER_ETH / 10n const CURVE_EARLY_ADOPTION_ID = 1n const CURVE_DEFAULT_ID = 0n @@ -36,11 +33,7 @@ const CURVE_DEFAULT_ID = 0n export class CSAccountingSrv implements Service { private readonly logger: Logger - private lastFiredAt = { - accountingExcessShares: 0, - totalLockAlert: 0, - avgBondAlert: 0, - } + private lastFiredAt = { accountingExcessShares: 0 } constructor() { this.logger = getLogger(this.getName()) @@ -51,10 +44,7 @@ export class CSAccountingSrv implements Service { } async handleBlock(blockEvent: BlockEvent, provider: ethers.Provider): Promise { - return [ - ...(await this.checkAccountingSharesDiscrepancy(blockEvent, provider)), - ...(await this.handleBondAndLockValues(blockEvent, provider)), - ] + return [...(await this.checkAccountingSharesDiscrepancy(blockEvent, provider))] } public async handleTransaction(txEvent: TransactionEvent): Promise { @@ -64,77 +54,6 @@ export class CSAccountingSrv implements Service { ] } - public async handleBondAndLockValues( - blockEvent: BlockEvent, - provider: ethers.Provider, - ): Promise { - if (blockEvent.blockNumber % CHECK_OPERATORS_INTERVAL_BLOCKS !== 0 && !IS_CLI) { - return [] - } - - const accounting = CSAccounting__factory.connect(DEPLOYED_ADDRESSES.CS_ACCOUNTING, provider) - const csm = CSModule__factory.connect(DEPLOYED_ADDRESSES.CS_MODULE, provider) - const ethCallOpts = { blockTag: blockEvent.blockHash } - - const operatorsCount = await csm.getNodeOperatorsCount(ethCallOpts) - this.logger.debug(`Total operators count: ${operatorsCount}`) - - let totalValidators = 0n - let totalBondWei = 0n - let totalLockWei = 0n - - for (let noId = 0; noId < operatorsCount; noId++) { - totalValidators += await csm.getNodeOperatorNonWithdrawnKeys(noId, ethCallOpts) - totalBondWei += (await accounting.getBondSummary(noId, ethCallOpts)).current - totalLockWei += await accounting.getActualLockedBond(noId, ethCallOpts) - } - this.logger.debug(`Read ${operatorsCount} operators info`) - - const avgBondWei = totalBondWei / totalValidators - - this.logger.debug(`Averave bond is ${formatEther(avgBondWei)}`) - this.logger.debug(`Total bond is ${formatEther(totalBondWei)}`) - this.logger.debug(`Total lock is ${formatEther(totalLockWei)}`) - - const now = blockEvent.block.timestamp - const out: Finding[] = [] - - if (now - this.lastFiredAt.avgBondAlert > SECONDS_PER_DAY) { - if (avgBondWei < BOND_AVG_WEI_MIN) { - const f = Finding.fromObject({ - name: `🟒 CSAccounting: Average bond value for a validator is below threshold.`, - description: `Average bond value for a validator is less than ${formatEther(BOND_AVG_WEI_MIN)}`, - alertId: 'CS-ACCOUNTING-AVERAGE-BOND-VALUE', - // source: sourceFromEvent(blockEvent), - severity: FindingSeverity.Low, - type: FindingType.Info, - }) - - out.push(f) - this.lastFiredAt.avgBondAlert = now - } - } - - if (now - this.lastFiredAt.totalLockAlert > SECONDS_PER_DAY) { - if (totalLockWei > LOCK_TOTAL_WEI_MAX) { - const f = Finding.fromObject({ - name: `🟒 Total bond lock exceeds threshold.`, - description: `Total bond lock is more than ${formatEther(LOCK_TOTAL_WEI_MAX)}`, - alertId: 'CS-ACCOUNTING-TOTAL-BOND-LOCK', - // NOTE: Do not include the source to reach quorum. - // source: sourceFromEvent(blockEvent), - severity: FindingSeverity.Low, - type: FindingType.Info, - }) - - out.push(f) - this.lastFiredAt.totalLockAlert = now - } - } - - return out - } - async checkAccountingSharesDiscrepancy( blockEvent: BlockEvent, provider: ethers.Provider, @@ -186,23 +105,27 @@ export class CSAccountingSrv implements Service { return out } - // TODO: Does it makes sense for us at all? handleStETHApprovalEvents(txEvent: TransactionEvent): Finding[] { const approvalEvents = filterLog( txEvent.logs, - Lido__factory.createInterface().getEvent('TransferShares').format('full'), + Lido__factory.createInterface().getEvent('Approval').format('full'), DEPLOYED_ADDRESSES.LIDO_STETH, ) const out: Finding[] = [] for (const event of approvalEvents) { - if (event.args.owner === DEPLOYED_ADDRESSES.CS_ACCOUNTING) { + if ( + event.args.owner === DEPLOYED_ADDRESSES.CS_ACCOUNTING && + event.args.spender !== DEPLOYED_ADDRESSES.BURNER + ) { const f = Finding.fromObject({ - name: `πŸ”΅ Lido stETH: Approval`, - description: `${event.args.spender} received allowance from ${event.args.owner} to ${event.args.value}`, + name: `πŸ”΄ Unexpected stETH approval from CSAccounting`, + description: + `${etherscanAddress(event.args.spender)} received allowance from ` + + `${etherscanAddress(event.args.owner)} for ${event.args.value} stETH`, alertId: 'STETH-APPROVAL', source: sourceFromEvent(txEvent), - severity: FindingSeverity.Low, + severity: FindingSeverity.Critical, type: FindingType.Info, }) out.push(f) @@ -212,27 +135,23 @@ export class CSAccountingSrv implements Service { } handleSetBondCurveEvent(txEvent: TransactionEvent): Finding[] { - const events = filterLog( + const curveSetEvents = filterLog( txEvent.logs, CSAccounting__factory.createInterface().getEvent('BondCurveSet').format('full'), DEPLOYED_ADDRESSES.CS_ACCOUNTING, ) + const creationEvents = filterLog( + txEvent.logs, + CSModule__factory.createInterface().getEvent('NodeOperatorAdded').format('full'), + DEPLOYED_ADDRESSES.CS_MODULE, + ) + const createdIds = creationEvents.map((e) => e.args.nodeOperatorId) + const out: Finding[] = [] - for (const e of events) { - if (e.args.curveId == CURVE_EARLY_ADOPTION_ID) { - out.push( - Finding.fromObject({ - alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', - name: 'πŸ”΅ CSAccounting: Bond curve set', - description: `Early adoption bond curve set for Node Operator #${e.args.nodeOperatorId}`, - source: sourceFromEvent(txEvent), - severity: FindingSeverity.Info, - type: FindingType.Info, - }), - ) - } else if (e.args.curveId == CURVE_DEFAULT_ID) { + for (const e of curveSetEvents) { + if (e.args.curveId == CURVE_DEFAULT_ID) { out.push( Finding.fromObject({ alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', @@ -244,6 +163,13 @@ export class CSAccountingSrv implements Service { }), ) } else { + if ( + e.args.curveId == CURVE_EARLY_ADOPTION_ID && + createdIds.includes(e.args.nodeOperatorId) + ) { + continue + } + out.push( Finding.fromObject({ alertId: 'CS-ACCOUNTING-BOND-CURVE-SET', diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts index e62f2fdab..e4a541080 100644 --- a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts @@ -93,7 +93,8 @@ export class CSFeeDistributorSrv implements Service { this.state.lastDistributionUpdatedAt = (await lastDistributionEvent.getBlock())?.timestamp ?? 0 this.logger.debug( - `Last distribution observed at timestamp ${this.state.lastDistributionUpdatedAt}`, + `Last distribution observed at timestamp ${this.state.lastDistributionUpdatedAt}` + + ` (${formatDelay(toBlock.timestamp - this.state.lastDistributionUpdatedAt)} ago)`, ) } @@ -169,9 +170,8 @@ export class CSFeeDistributorSrv implements Service { const out: Finding[] = [] for (const event of transferSharesEvents) { if ( - event.args.from.toLowerCase() === - DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR.toLowerCase() && - event.args.to.toLowerCase() !== DEPLOYED_ADDRESSES.CS_ACCOUNTING.toLowerCase() + event.args.from === DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR && + event.args.to !== DEPLOYED_ADDRESSES.CS_ACCOUNTING ) { const f = Finding.fromObject({ name: `🚨 CSFeeDistributor: Invalid TransferShares receiver`, @@ -188,56 +188,6 @@ export class CSFeeDistributorSrv implements Service { return out } - // private async handleRevertedTx( - // txEvent: TransactionEvent, - // provider: ethers.Provider, - // ): Promise { - // if (!(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR.toLowerCase() in txEvent.addresses)) { - // return [] - // } - // - // const txReceipt = await provider.getTransactionReceipt(txEvent.hash) - // // Nothing to do if the transaction succeeded. - // if (txReceipt?.status === 0) { - // this.logger.debug(`Skipping successful transaction ${txEvent.hash}`) - // return [] - // } - // - // // FIXME: I can't find a node with getTransactionResult call working. - // let decodedLog: ethers.ErrorDescription | null = null - // try { - // const data = await txReceipt?.getResult() - // decodedLog = CSFeeDistributorInterface.parseError(data ?? '') - // } catch (error: any) { - // if (error.code === 'UNSUPPORTED_OPERATION') { - // this.logger.debug('Ethereum RPC does not support `getTransactionResult`') - // return [] - // } - // - // throw error - // } - // - // const reason = decodedLog?.name - // if (!reason) { - // return [] - // } - // - // switch (reason) { - // case 'InvalidShares': - // return [failedTxAlert(txEvent, 'CSFeeOracle reports incorrect amount of shares to distribute', 'InvalidShares')] - // case 'NotEnoughShares': - // return [failedTxAlert(txEvent, 'CSFeeDistributor internal accounting error', 'NotEnoughShares')] - // case 'InvalidTreeRoot': - // return [failedTxAlert(txEvent, 'CSFeeOracle built incorrect report', 'InvalidTreeRoot')] - // case 'InvalidTreeCID': - // return [failedTxAlert(txEvent, 'CSFeeOracle built incorrect report', 'InvalidTreeCID')] - // default: - // this.logger.warn(`Unrecognized revert reason: ${reason}`) - // } - // - // return [] - // } - private async checkInvariants(blockEvent: BlockEvent, provider: ethers.Provider) { const distributor = CSFeeDistributor__factory.connect( DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, @@ -252,12 +202,15 @@ export class CSFeeDistributorSrv implements Service { const treeRoot = await distributor.treeRoot({ blockTag }) const treeCid = await distributor.treeCid({ blockTag }) if (treeRoot !== ethers.ZeroHash && treeCid === '') { - out.push(invariantAlert(blockEvent, 'Tree exists, but no CID.')) + out.push(invariantAlert(blockEvent, 'Tree exists, but no CID')) + } + if (treeRoot === ethers.ZeroHash && treeCid !== '') { + out.push(invariantAlert(blockEvent, 'Tree CID exists, but no root')) } if ( - (await steth.sharesOf(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, { blockTag })) < - (await distributor.totalClaimableShares({ blockTag })) + (await distributor.totalClaimableShares({ blockTag })) > + (await steth.sharesOf(distributor, { blockTag })) ) { out.push(invariantAlert(blockEvent, "distributed more than the contract's balance")) } diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts index c8750592b..21178e257 100644 --- a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts +++ b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts @@ -24,8 +24,6 @@ const { DEPLOYED_ADDRESSES, ORACLE_MEMBERS } = requireWithTier const IHashConsensus = HashConsensus__factory.createInterface() const ICSFeeOracle = CSFeeOracle__factory.createInterface() -// TODO: Extract HashConsensus part maybe? - export class CSFeeOracleSrv implements Service { private readonly logger: Logger @@ -52,11 +50,20 @@ export class CSFeeOracleSrv implements Service { const hc = HashConsensus__factory.connect(DEPLOYED_ADDRESSES.HASH_CONSENSUS, provider) const [members] = await hc.getMembers({ blockTag: blockIdentifier }) for (const m of members) { - const lastReport = await hc.getConsensusStateForMember(m, { blockTag: blockIdentifier }) - this.membersLastReport.set(m, { - refSlot: lastReport.lastMemberReportRefSlot, - report: lastReport.currentFrameMemberReport, - }) + try { + const lastReport = await hc.getConsensusStateForMember(m, { + blockTag: blockIdentifier, + }) + this.membersLastReport.set(m, { + refSlot: lastReport.lastMemberReportRefSlot, + report: lastReport.currentFrameMemberReport, + }) + } catch (e: any) { + if (e.reason === 'InitialEpochIsYetToArrive()') { + this.logger.debug('Initial epoch is not reached yet') + break + } + } } } @@ -71,44 +78,42 @@ export class CSFeeOracleSrv implements Service { } private handleAlternativeHashReceived(txEvent: TransactionEvent): Finding[] { - const out: Finding[] = [] - const [event] = filterLog( txEvent.logs, IHashConsensus.getEvent('ReportReceived').format('full'), DEPLOYED_ADDRESSES.HASH_CONSENSUS, ) - if (event) { - const currentReportHashes = [...this.membersLastReport.values()] - .filter((r) => r.refSlot === event.args.refSlot) - .map((r) => r.report) + if (!event) { + return [] + } - if ( - currentReportHashes.length > 0 && - !currentReportHashes.includes(event.args.report) - ) { - out.push( - Finding.fromObject({ - name: 'πŸ”΄ HashConsensus: Another report variant appeared (alternative hash)', - description: - `More than one distinct report hash received for slot ${event.args.refSlot}.` + - `Member: ${etherscanAddress(event.args.member)} (${ORACLE_MEMBERS[event.args.member] || 'unknown'}).` + - `Report: ${event.args.report}`, - alertId: 'HASH-CONSENSUS-REPORT-RECEIVED', - source: sourceFromEvent(txEvent), - severity: FindingSeverity.High, - type: FindingType.Info, - }), - ) - } + const out: Finding[] = [] - this.membersLastReport.set(event.args.member, { - refSlot: event.args.refSlot, - report: event.args.report, - }) + const currentReportHashes = [...this.membersLastReport.values()] + .filter((r) => r.refSlot === event.args.refSlot) + .map((r) => r.report) + + if (currentReportHashes.length > 0 && !currentReportHashes.includes(event.args.report)) { + out.push( + Finding.fromObject({ + name: 'πŸ”΄ HashConsensus: Alternative report received', + description: + `Member ${etherscanAddress(event.args.member)} (${ORACLE_MEMBERS[event.args.member] || 'unknown'}) ` + + `has reported a hash unmatched by other members. Reference slot: ${event.args.refSlot}`, + alertId: 'HASH-CONSENSUS-RECEIVED-ALTERNATIVE-HASH', + source: sourceFromEvent(txEvent), + severity: FindingSeverity.High, + type: FindingType.Info, + }), + ) } + this.membersLastReport.set(event.args.member, { + refSlot: event.args.refSlot, + report: event.args.report, + }) + return out } diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.ts b/csm-alerts/src/services/CSModule/CSModule.srv.ts index 317664c75..7c31a18cc 100644 --- a/csm-alerts/src/services/CSModule/CSModule.srv.ts +++ b/csm-alerts/src/services/CSModule/CSModule.srv.ts @@ -26,6 +26,7 @@ const { DEPLOYED_ADDRESSES } = requireWithTier( const ICSModule = CSModule__factory.createInterface() const CHECK_QUEUE_INTERVAL_BLOCKS = 1801 // ~ 4 times a day +const CHECK_SHARE_INTERVAL_BLOCKS = 2401 // ~ 3 times a day const TARGET_SHARE_USED_PERCENT_MAX = 95 const QUEUE_EMPTY_BATCHES_MAX = 30 const QUEUE_VALIDATORS_MAX = 200 @@ -108,6 +109,10 @@ export class CSModuleSrv implements Service { blockEvent: BlockEvent, provider: ethers.Provider, ): Promise { + if (blockEvent.blockNumber % CHECK_SHARE_INTERVAL_BLOCKS !== 0 && !IS_CLI) { + return [] + } + const stakingRouter = StakingRouter__factory.connect( DEPLOYED_ADDRESSES.STAKING_ROUTER, provider, @@ -148,7 +153,7 @@ export class CSModuleSrv implements Service { const now = blockEvent.block.timestamp const out: Finding[] = [] - if (now - this.lastFiredAt.moduleShareIsCloseToTargetShare > SECONDS_PER_DAY) { + if (now - this.lastFiredAt.moduleShareIsCloseToTargetShare > SECONDS_PER_DAY * 7) { if (percentUsed > TARGET_SHARE_USED_PERCENT_MAX) { const f = Finding.fromObject({ name: `🟒 CSModule: Module's share is close to the target share.`, @@ -213,7 +218,6 @@ export class CSModuleSrv implements Service { queueLookup.set(nodeOperatorId, depositableFromBatch) } - // TODO: Think about how it works in on-chain code. index = batch.next() } diff --git a/csm-alerts/src/services/EventsWatcher/events/accounting.ts b/csm-alerts/src/services/EventsWatcher/events/accounting.ts index f83018bbf..828b2f101 100644 --- a/csm-alerts/src/services/EventsWatcher/events/accounting.ts +++ b/csm-alerts/src/services/EventsWatcher/events/accounting.ts @@ -1,6 +1,7 @@ -import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' +import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' import { CSAccounting__factory } from '../../../generated/typechain' +import * as CSAccounting from '../../../generated/typechain/CSAccounting' import { EventOfNotice } from '../../../shared/types' import { etherscanAddress, formatEther } from '../../../utils/string' @@ -13,8 +14,8 @@ export function getCSAccountingEvents(accounting: string): EventOfNotice[] { abi: ICSAccounting.getEvent('ChargePenaltyRecipientSet').format('full'), alertId: 'CS-ACCOUNTING-CHARGE-PENALTY-RECIPIENT-SET', name: '🚨 CSAccounting: Charge penalty recipient set', - description: (args: ethers.Result) => - `Charge penalty recipient set to ${etherscanAddress(args.chargeRecipient)} (expecting the treasury)`, + description: (args: CSAccounting.ChargePenaltyRecipientSetEvent.OutputObject) => + `Charge penalty recipient set to ${etherscanAddress(args.chargePenaltyRecipient)} (expecting the treasury)`, severity: FindingSeverity.Critical, type: FindingType.Info, }, @@ -23,7 +24,7 @@ export function getCSAccountingEvents(accounting: string): EventOfNotice[] { abi: ICSAccounting.getEvent('BondCurveUpdated').format('full'), alertId: 'CS-ACCOUNTING-BOND-CURVE-UPDATED', name: '🚨 CSAccounting: Bond curve updated', - description: (args: ethers.Result) => { + description: (args: CSAccounting.BondCurveUpdatedEvent.OutputObject) => { const bondCurveString = args.bondCurve .map((value: bigint) => formatEther(value)) .join(', ') @@ -37,7 +38,7 @@ export function getCSAccountingEvents(accounting: string): EventOfNotice[] { abi: ICSAccounting.getEvent('BondCurveAdded').format('full'), alertId: 'CS-ACCOUNTING-BOND-CURVE-ADDED', name: 'πŸ”΄ CSAccounting: Bond curve added', - description: (args: ethers.Result) => { + description: (args: CSAccounting.BondCurveAddedEvent.OutputObject) => { const bondCurveString = args.bondCurve .map((value: bigint) => formatEther(value)) .join(', ') diff --git a/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts b/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts index 08634cfee..8516ea703 100644 --- a/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts +++ b/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts @@ -1,6 +1,7 @@ -import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' +import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' import { AssetRecoverer__factory } from '../../../generated/typechain' +import * as AssetRecoverer from '../../../generated/typechain/AssetRecoverer' import { EventOfNotice } from '../../../shared/types' import { etherscanAddress, formatEther, formatShares } from '../../../utils/string' @@ -16,7 +17,7 @@ export function getAssetRecovererEvents( abi: IAssetRecoverer.getEvent('ERC20Recovered').format('full'), alertId: 'ASSET-RECOVERER-ERC20-RECOVERED', name: 'πŸ”΄ AssetRecoverer: ERC20 recovered', - description: (args: ethers.Result) => + description: (args: AssetRecoverer.ERC20RecoveredEvent.OutputObject) => `ERC20 recovered on ${contract.name}:\n` + `Recipient: ${etherscanAddress(args.recipient)}\n` + `Token: ${etherscanAddress(args.token)}\n` + @@ -29,7 +30,7 @@ export function getAssetRecovererEvents( abi: IAssetRecoverer.getEvent('ERC721Recovered').format('full'), alertId: 'ASSET-RECOVERER-ERC721-RECOVERED', name: 'πŸ”΄ AssetRecoverer: ERC721 recovered', - description: (args: ethers.Result) => + description: (args: AssetRecoverer.ERC721RecoveredEvent.OutputObject) => `ERC721 recovered on ${contract.name}:\n` + `Recipient: ${etherscanAddress(args.recipient)}\n` + `Token: ${etherscanAddress(args.token)}\n` + @@ -42,7 +43,7 @@ export function getAssetRecovererEvents( abi: IAssetRecoverer.getEvent('ERC1155Recovered').format('full'), alertId: 'ASSET-RECOVERER-ERC1155-RECOVERED', name: 'πŸ”΄ AssetRecoverer: ERC1155 recovered', - description: (args: ethers.Result) => + description: (args: AssetRecoverer.ERC1155RecoveredEvent.OutputObject) => `ERC1155 recovered on ${contract.name}:\n` + `Recipient: ${etherscanAddress(args.recipient)}\n` + `Token: ${etherscanAddress(args.token)}\n` + @@ -56,7 +57,7 @@ export function getAssetRecovererEvents( abi: IAssetRecoverer.getEvent('EtherRecovered').format('full'), alertId: 'ASSET-RECOVERER-ETHER-RECOVERED', name: 'πŸ”΄ AssetRecoverer: Ether recovered', - description: (args: ethers.Result) => + description: (args: AssetRecoverer.EtherRecoveredEvent.OutputObject) => `Ether recovered on ${contract.name}:\n` + `Recipient: ${etherscanAddress(args.recipient)}\n` + `Amount: ${formatEther(args.amount)}`, @@ -68,7 +69,7 @@ export function getAssetRecovererEvents( abi: IAssetRecoverer.getEvent('StETHSharesRecovered').format('full'), alertId: 'ASSET-RECOVERER-STETH-SHARES-RECOVERED', name: 'πŸ”΄ AssetRecoverer: StETH Shares recovered', - description: (args: ethers.Result) => + description: (args: AssetRecoverer.StETHSharesRecoveredEvent.OutputObject) => `StETH Shares recovered on ${contract.name}:\n` + `Recipient: ${etherscanAddress(args.recipient)}\n` + `Amount: ${formatShares(args.shares)}`, diff --git a/csm-alerts/src/services/EventsWatcher/events/distributor.ts b/csm-alerts/src/services/EventsWatcher/events/distributor.ts index ff9ad7604..0fd167eb8 100644 --- a/csm-alerts/src/services/EventsWatcher/events/distributor.ts +++ b/csm-alerts/src/services/EventsWatcher/events/distributor.ts @@ -1,6 +1,7 @@ -import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' +import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' import { CSFeeDistributor__factory } from '../../../generated/typechain' +import * as CSFeeDistributor from '../../../generated/typechain/CSFeeDistributor' import { EventOfNotice } from '../../../shared/types' import { ipfsLink } from '../../../utils/string' @@ -13,7 +14,7 @@ export function getCSFeeDistributorEvents(distributorAddress: string): EventOfNo abi: ICSFeeDistributor.getEvent('DistributionDataUpdated').format('full'), alertId: 'CSFEE-DISTRIBUTOR-DISTRIBUTION-DATA-UPDATED', name: 'πŸ”΅ CSFeeDistributor: Distribution data updated', - description: (args: ethers.Result) => + description: (args: CSFeeDistributor.DistributionDataUpdatedEvent.OutputObject) => `Total Claimable Shares: ${args.totalClaimableShares}\n` + `Tree Root: ${args.treeRoot}\n` + `Tree CID: ${ipfsLink(args.treeCid)}`, @@ -25,7 +26,8 @@ export function getCSFeeDistributorEvents(distributorAddress: string): EventOfNo abi: ICSFeeDistributor.getEvent('DistributionLogUpdated').format('full'), alertId: 'CSFEE-DISTRIBUTOR-DISTRIBUTION-LOG-UPDATED', name: 'πŸ”΅ CSFeeDistributor: Distribution log updated', - description: (args: ethers.Result) => `Log CID: ${ipfsLink(args.logCid)}`, + description: (args: CSFeeDistributor.DistributionLogUpdatedEvent.OutputObject) => + `Log CID: ${ipfsLink(args.logCid)}`, severity: FindingSeverity.Info, type: FindingType.Info, }, diff --git a/csm-alerts/src/services/EventsWatcher/events/module.ts b/csm-alerts/src/services/EventsWatcher/events/module.ts index 8729db654..327c5b42e 100644 --- a/csm-alerts/src/services/EventsWatcher/events/module.ts +++ b/csm-alerts/src/services/EventsWatcher/events/module.ts @@ -1,6 +1,7 @@ -import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' +import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' import { CSModule__factory } from '../../../generated/typechain' +import * as CSModule from '../../../generated/typechain/CSModule' import { EventOfNotice } from '../../../shared/types' import { formatEther } from '../../../utils/string' @@ -22,7 +23,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { abi: ICSModule.getEvent('VettedSigningKeysCountDecreased').format('full'), alertId: 'CS-MODULE-VETTED-SIGNING-KEYS-DECREASED', name: 'πŸ”΅ CSModule: Node Operator vetted signing keys decreased', - description: (args: ethers.Result) => + description: (args: CSModule.VettedSigningKeysCountDecreasedEvent.OutputObject) => `Vetted signing keys decreased for Node Operator #${args.nodeOperatorId}`, severity: FindingSeverity.High, type: FindingType.Info, @@ -32,7 +33,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { abi: ICSModule.getEvent('TargetValidatorsCountChanged').format('full'), alertId: 'CS-MODULE-TARGET-LIMIT-MODE-CHANGED', name: '🟠 CSModule: Target limit mode changed', - description: (args: ethers.Result) => + description: (args: CSModule.TargetValidatorsCountChangedEvent.OutputObject) => `Target limit mode: ${args.targetLimitMode} (${ args.targetLimitMode === 0n ? 'disabled' @@ -48,8 +49,9 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { abi: ICSModule.getEvent('ELRewardsStealingPenaltyReported').format('full'), alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-REPORTED', name: 'πŸ”΄ CSModule: EL Rewards stealing penalty reported', - description: (args: ethers.Result) => - `EL Rewards stealing penalty reported for Node Operator #${args.nodeOperatorId} with ${formatEther(args.stolenAmount)} potentially stolen`, + description: (args: CSModule.ELRewardsStealingPenaltyReportedEvent.OutputObject) => + `EL Rewards stealing penalty reported for Node Operator #${args.nodeOperatorId} ` + + `with ${formatEther(args.stolenAmount)} potentially stolen`, severity: FindingSeverity.High, type: FindingType.Info, }, @@ -58,7 +60,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { abi: ICSModule.getEvent('ELRewardsStealingPenaltyCancelled').format('full'), alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-CANCELLED', name: 'πŸ”΄ CSModule: EL Rewards stealing penalty cancelled', - description: (args: ethers.Result) => + description: (args: CSModule.ELRewardsStealingPenaltyCancelledEvent.OutputObject) => `EL Rewards stealing penalty (${formatEther(args.amount)}) cancelled for Node Operator #${args.nodeOperatorId}`, severity: FindingSeverity.High, type: FindingType.Info, @@ -68,7 +70,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { abi: ICSModule.getEvent('ELRewardsStealingPenaltySettled').format('full'), alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-SETTLED', name: 'πŸ”΄ CSModule: EL Rewards stealing penalty settled', - description: (args: ethers.Result) => + description: (args: CSModule.ELRewardsStealingPenaltySettledEvent.OutputObject) => `EL Rewards stealing penalty settled for Node Operator #${args.nodeOperatorId}`, severity: FindingSeverity.High, type: FindingType.Info, @@ -78,8 +80,8 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { abi: ICSModule.getEvent('ELRewardsStealingPenaltyCompensated').format('full'), alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-COMPENSATED', name: 'πŸ”΄ CSModule: EL Rewards stealing penalty compensated', - description: (args: ethers.Result) => - `${formatEther(args.stolenAmount)} of EL Rewards stealing penalty was compensated for Node Operator #${args.nodeOperatorId}`, + description: (args: CSModule.ELRewardsStealingPenaltyCompensatedEvent.OutputObject) => + `${formatEther(args.amount)} of EL Rewards stealing penalty was compensated for Node Operator #${args.nodeOperatorId}`, severity: FindingSeverity.High, type: FindingType.Info, }, diff --git a/csm-alerts/src/services/EventsWatcher/events/oracle.ts b/csm-alerts/src/services/EventsWatcher/events/oracle.ts index 7871b9e48..60de8bf5f 100644 --- a/csm-alerts/src/services/EventsWatcher/events/oracle.ts +++ b/csm-alerts/src/services/EventsWatcher/events/oracle.ts @@ -1,6 +1,8 @@ -import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' +import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' import { CSFeeOracle__factory, HashConsensus__factory } from '../../../generated/typechain' +import * as CSFeeOracle from '../../../generated/typechain/CSFeeOracle' +import * as HashConsensus from '../../../generated/typechain/HashConsensus' import { EventOfNotice } from '../../../shared/types' import { etherscanAddress } from '../../../utils/string' @@ -17,7 +19,7 @@ export function getHashConsensusEvents( abi: IHashConsensus.getEvent('MemberAdded').format('full'), alertId: 'HASH-CONSENSUS-MEMBER-ADDED', name: 'πŸ”΄ HashConsensus: Member added', - description: (args: ethers.Result) => + description: (args: HashConsensus.MemberAddedEvent.OutputObject) => `New member ${etherscanAddress(args.addr)} (${knownMembers[args.addr] ?? 'unknown'}) added\n` + `Total members: ${args.newTotalMembers}\n` + `New quorum: ${args.newQuorum}`, @@ -29,7 +31,7 @@ export function getHashConsensusEvents( abi: IHashConsensus.getEvent('MemberRemoved').format('full'), alertId: 'HASH-CONSENSUS-MEMBER-REMOVED', name: 'πŸ”΄ HashConsensus: Member removed', - description: (args: ethers.Result) => + description: (args: HashConsensus.MemberRemovedEvent.OutputObject) => `Member ${etherscanAddress(args.addr)} (${knownMembers[args.addr] ?? 'unknown'}) removed\n` + `Total members: ${args.newTotalMembers}\n` + `New quorum: ${args.newQuorum}`, @@ -41,7 +43,7 @@ export function getHashConsensusEvents( abi: IHashConsensus.getEvent('QuorumSet').format('full'), alertId: 'HASH-CONSENSUS-QUORUM-SET', name: 'πŸ”΄ HashConsensus: Quorum set', - description: (args: ethers.Result) => + description: (args: HashConsensus.QuorumSetEvent.OutputObject) => `Quorum set to ${args.newQuorum}.\n` + `Total members: ${args.totalMembers}\n` + `Previous quorum: ${args.prevQuorum}`, @@ -53,7 +55,7 @@ export function getHashConsensusEvents( abi: IHashConsensus.getEvent('FastLaneConfigSet').format('full'), alertId: 'HASH-CONSENSUS-FASTLANE-CONFIG-SET', name: 'πŸ”΄ HashConsensus: Fastlane config set', - description: (args: ethers.Result) => + description: (args: HashConsensus.FastLaneConfigSetEvent.OutputObject) => `Fastlane configuration set with length slots: ${args.fastLaneLengthSlots}`, severity: FindingSeverity.High, type: FindingType.Info, @@ -63,7 +65,7 @@ export function getHashConsensusEvents( abi: IHashConsensus.getEvent('FrameConfigSet').format('full'), alertId: 'HASH-CONSENSUS-FRAME-CONFIG-SET', name: 'πŸ”΄ HashConsensus: Frame config set', - description: (args: ethers.Result) => + description: (args: HashConsensus.FrameConfigSetEvent.OutputObject) => `Frame configuration set:\n` + `New initial epoch: ${args.newInitialEpoch}\n` + `Epochs per frame: ${args.newEpochsPerFrame}`, @@ -75,8 +77,9 @@ export function getHashConsensusEvents( abi: IHashConsensus.getEvent('ReportProcessorSet').format('full'), alertId: 'HASH-CONSENSUS-REPORT-PROCESSOR-SET', name: 'πŸ”΄ HashConsensus: Report processor set', - description: (args: ethers.Result) => - `Current processor: ${etherscanAddress(args.processor)}\nPrevious processor: ${etherscanAddress(args.prevProcessor)}`, + description: (args: HashConsensus.ReportProcessorSetEvent.OutputObject) => + `Previous processor: ${etherscanAddress(args.prevProcessor)}\n` + + `Current processor: ${etherscanAddress(args.processor)}`, severity: FindingSeverity.High, type: FindingType.Info, }, @@ -85,7 +88,8 @@ export function getHashConsensusEvents( abi: IHashConsensus.getEvent('ConsensusLost').format('full'), alertId: 'HASH-CONSENSUS-LOST', name: 'πŸ”΄ HashConsensus: Consensus lost', - description: (args: ethers.Result) => `Consensus lost for slot ${args.refSlot}`, + description: (args: HashConsensus.ConsensusLostEvent.OutputObject) => + `Consensus lost for slot ${args.refSlot}`, severity: FindingSeverity.High, type: FindingType.Info, }, @@ -94,7 +98,7 @@ export function getHashConsensusEvents( abi: IHashConsensus.getEvent('ConsensusReached').format('full'), alertId: 'HASH-CONSENSUS-REACHED', name: 'πŸ”΅ HashConsensus: Consensus reached, report received', - description: (args: ethers.Result) => + description: (args: HashConsensus.ConsensusReachedEvent.OutputObject) => `Consensus reached for slot ${args.refSlot}\n` + `Report hash: ${args.report}\n` + `Support: ${args.support}`, @@ -106,22 +110,12 @@ export function getHashConsensusEvents( export function getCSFeeOracleEvents(address: string): EventOfNotice[] { return [ - { - address, - abi: ICSFeeOracle.getEvent('ConsensusHashContractSet').format('full'), - alertId: 'CSFEE-ORACLE-CONSENSUS-HASH-CONTRACT-SET', - name: '🚨 CSFeeOracle: Consensus hash contract set', - description: (args: ethers.Result) => - `Consensus hash contract set to ${etherscanAddress(args.addr)}, previous contract was ${etherscanAddress(args.prevAddr)}`, - severity: FindingSeverity.Critical, - type: FindingType.Info, - }, { address, abi: ICSFeeOracle.getEvent('PerfLeewaySet').format('full'), alertId: 'CSFEE-ORACLE-PERF-LEEWAY-SET', name: 'πŸ”΄ CSFeeOracle: Performance leeway updated', - description: (args: ethers.Result) => + description: (args: CSFeeOracle.PerfLeewaySetEvent.OutputObject) => `Performance leeway set to ${args.valueBP} basis points`, severity: FindingSeverity.High, type: FindingType.Info, @@ -131,9 +125,20 @@ export function getCSFeeOracleEvents(address: string): EventOfNotice[] { abi: ICSFeeOracle.getEvent('FeeDistributorContractSet').format('full'), alertId: 'CSFEE-ORACLE-FEE-DISTRIBUTOR-CONTRACT-SET', name: 'πŸ”΄ CSFeeOracle: New CSFeeDistributor set', - description: (args: ethers.Result) => + description: (args: CSFeeOracle.FeeDistributorContractSetEvent.OutputObject) => `New CSFeeDistributor contract set to ${etherscanAddress(args.feeDistributorContract)}`, - severity: FindingSeverity.High, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address, + abi: ICSFeeOracle.getEvent('ConsensusHashContractSet').format('full'), + alertId: 'CSFEE-ORACLE-CONSENSUS-HASH-CONTRACT-SET', + name: '🚨 CSFeeOracle: Consensus hash contract set', + description: (args: CSFeeOracle.ConsensusHashContractSetEvent.OutputObject) => + `Consensus hash contract set to ${etherscanAddress(args.addr)}, ` + + `previous contract was ${etherscanAddress(args.prevAddr)}`, + severity: FindingSeverity.Critical, type: FindingType.Info, }, { @@ -141,7 +146,7 @@ export function getCSFeeOracleEvents(address: string): EventOfNotice[] { abi: ICSFeeOracle.getEvent('ConsensusVersionSet').format('full'), alertId: 'CSFEE-ORACLE-CONSENSUS-VERSION-SET', name: 'πŸ”΄ CSFeeOracle: Consensus version set', - description: (args: ethers.Result) => + description: (args: CSFeeOracle.ConsensusVersionSetEvent.OutputObject) => `Consensus version set to ${args.version}, previous version was ${args.prevVersion}`, severity: FindingSeverity.High, type: FindingType.Info, @@ -151,8 +156,9 @@ export function getCSFeeOracleEvents(address: string): EventOfNotice[] { abi: ICSFeeOracle.getEvent('WarnProcessingMissed').format('full'), alertId: 'CSFEE-ORACLE-PROCESSING-MISSED', name: 'πŸ”΅ CSFeeOracle: Processing missed', - description: (args: ethers.Result) => `Processing missed for slot ${args.refSlot}`, - severity: FindingSeverity.Info, + description: (args: CSFeeOracle.WarnProcessingMissedEvent.OutputObject) => + `Processing missed for slot ${args.refSlot}`, + severity: FindingSeverity.High, type: FindingType.Info, }, { @@ -160,22 +166,12 @@ export function getCSFeeOracleEvents(address: string): EventOfNotice[] { abi: ICSFeeOracle.getEvent('ReportSubmitted').format('full'), alertId: 'CSFEE-ORACLE-REPORT-SUBMITTED', name: 'πŸ”΅ CSFeeOracle: Report submitted', - description: (args: ethers.Result) => + description: (args: CSFeeOracle.ReportSubmittedEvent.OutputObject) => `Report submitted for slot ${args.refSlot}\n` + `Report hash: ${args.hash}\n` + `Processing deadline time: ${args.processingDeadlineTime}`, severity: FindingSeverity.Info, type: FindingType.Info, }, - { - address, - abi: ICSFeeOracle.getEvent('ProcessingStarted').format('full'), - alertId: 'CSFEE-ORACLE-PROCESSING-STARTED', - name: 'πŸ”΅ CSFeeOracle: Processing started', - description: (args: ethers.Result) => - `Processing started for slot ${args.refSlot}\nReport hash: ${args.hash}`, - severity: FindingSeverity.Info, - type: FindingType.Info, - }, ] } diff --git a/csm-alerts/src/services/EventsWatcher/events/pausable.ts b/csm-alerts/src/services/EventsWatcher/events/pausable.ts index a996384b9..ee032a20e 100644 --- a/csm-alerts/src/services/EventsWatcher/events/pausable.ts +++ b/csm-alerts/src/services/EventsWatcher/events/pausable.ts @@ -1,7 +1,7 @@ -import { Result } from '@ethersproject/abi/lib' import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' import { PausableUntil__factory } from '../../../generated/typechain' +import * as PausableUntil from '../../../generated/typechain/PausableUntil' import { EventOfNotice } from '../../../shared/types' import { etherscanAddress, toKebabCase } from '../../../utils/string' import { formatDelay } from '../../../utils/time' @@ -16,7 +16,8 @@ export function getPausableEvents(contracts: { name: string; address: string }[] abi: IPausableUntil.getEvent('Paused').format('full'), alertId: `${toKebabCase(contract.name)}-PAUSED`, name: `🚨 ${contract.name}: contract was paused`, - description: (args: Result) => `Contract ${etherscanAddress(contract.address)} paused for ${formatDelay(args.duration)}`, + description: (args: PausableUntil.PausedEvent.OutputObject) => + `Contract ${etherscanAddress(contract.address)} paused for ${formatDelay(args.duration)}`, severity: FindingSeverity.Critical, type: FindingType.Info, }, diff --git a/csm-alerts/src/services/EventsWatcher/events/proxies.ts b/csm-alerts/src/services/EventsWatcher/events/proxies.ts index 10a4a9365..1333d8446 100644 --- a/csm-alerts/src/services/EventsWatcher/events/proxies.ts +++ b/csm-alerts/src/services/EventsWatcher/events/proxies.ts @@ -1,6 +1,7 @@ -import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' +import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' import { OssifiableProxy__factory } from '../../../generated/typechain' +import * as OssifiableProxy from '../../../generated/typechain/OssifiableProxy' import { EventOfNotice } from '../../../shared/types' import { etherscanAddress } from '../../../utils/string' @@ -26,7 +27,7 @@ export function getOssifiedProxyEvents( abi: IOssifiableProxy.getEvent('Upgraded').format('full'), alertId: 'PROXY-UPGRADED', name: `🚨 ${contract.name}: Implementation Upgraded`, - description: (args: ethers.Result) => + description: (args: OssifiableProxy.UpgradedEvent.OutputObject) => `The proxy implementation has been upgraded to ${args.implementation}`, severity: FindingSeverity.Critical, type: FindingType.Info, @@ -36,7 +37,7 @@ export function getOssifiedProxyEvents( abi: IOssifiableProxy.getEvent('AdminChanged').format('full'), alertId: 'PROXY-ADMIN-CHANGED', name: `🚨 ${contract.name}: Admin Changed`, - description: (args: ethers.Result) => + description: (args: OssifiableProxy.AdminChangedEvent.OutputObject) => `The proxy admin for ${contract.name}(${contract.address}) has been changed from ${etherscanAddress(args.previousAdmin)} to ${etherscanAddress(args.newAdmin)}`, severity: FindingSeverity.Critical, type: FindingType.Info, diff --git a/csm-alerts/src/services/EventsWatcher/events/roles.ts b/csm-alerts/src/services/EventsWatcher/events/roles.ts index ed8028f7e..fcc046a5e 100644 --- a/csm-alerts/src/services/EventsWatcher/events/roles.ts +++ b/csm-alerts/src/services/EventsWatcher/events/roles.ts @@ -1,9 +1,13 @@ -import { FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' +import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' +import { ACL__factory } from '../../../generated/typechain' +import * as ACL from '../../../generated/typechain/ACL' import { RolesMapping } from '../../../shared/roles' import { EventOfNotice } from '../../../shared/types' import { etherscanAddress } from '../../../utils/string' +const IACL = ACL__factory.createInterface() + export function getRolesMonitoringEvents( contracts: { name: string; address: string }[], ): EventOfNotice[] { @@ -11,21 +15,34 @@ export function getRolesMonitoringEvents( return [ { address: contract.address, - abi: 'event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)', + abi: IACL.getEvent('RoleGranted').format('full'), alertId: `ROLE-GRANTED`, name: `🚨 ${contract.name}: Role granted`, - description: (args: ethers.Result) => - `Role ${args.role} (${RolesMapping[args.role] ?? 'unknown'}) was granted to ${etherscanAddress(args.account)} on ${etherscanAddress(contract.address)}`, + description: (args: ACL.RoleGrantedEvent.OutputObject) => + `Role ${args.role} (${RolesMapping[args.role] ?? 'unknown'}) was granted ` + + `to ${etherscanAddress(args.account)} on ${etherscanAddress(contract.address)}`, severity: FindingSeverity.Critical, type: FindingType.Info, }, { address: contract.address, - abi: 'event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)', + abi: IACL.getEvent('RoleRevoked').format('full'), alertId: `ROLE-REVOKED`, name: `🚨 ${contract.name}: Role revoked`, - description: (args: ethers.Result) => - `Role ${args.role} (${RolesMapping[args.role] ?? 'unknown'}) was revoked from ${etherscanAddress(args.account)} on ${etherscanAddress(contract.address)}`, + description: (args: ACL.RoleRevokedEvent.OutputObject) => + `Role ${args.role} (${RolesMapping[args.role] ?? 'unknown'}) was revoked ` + + `from ${etherscanAddress(args.account)} on ${etherscanAddress(contract.address)}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + { + address: contract.address, + abi: IACL.getEvent('RoleAdminChanged').format('full'), + alertId: `ROLE-GRANTED`, + name: `🚨 ${contract.name}: Role's admin role changed`, + description: (args: ACL.RoleAdminChangedEvent.OutputObject) => + `Admin role of role ${args.role} (${RolesMapping[args.role] ?? 'unknown'}) was changed ` + + `from ${args.previousAdminRole} to ${args.newAdminRole} on ${etherscanAddress(contract.address)}`, severity: FindingSeverity.Critical, type: FindingType.Info, }, From 702a402e3a810a7904d55fcb044f82d11e808362 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 16 Oct 2024 14:47:36 +0300 Subject: [PATCH 16/45] chore: fix typing --- .../src/services/CSFeeDistributor/CSFeeDistributor.srv.ts | 2 +- csm-alerts/src/utils/logs.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts index e4a541080..6b2d657ee 100644 --- a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts @@ -76,7 +76,7 @@ export class CSFeeDistributorSrv implements Service { } const distributedEvents = await getLogsByChunks( - distributor as any, + distributor, distributor.filters.DistributionDataUpdated, toBlock.number - frameInSlots * 2, toBlock.number, diff --git a/csm-alerts/src/utils/logs.ts b/csm-alerts/src/utils/logs.ts index 60e0cdfe9..6802df5b9 100644 --- a/csm-alerts/src/utils/logs.ts +++ b/csm-alerts/src/utils/logs.ts @@ -3,7 +3,7 @@ import { ethers } from '@fortanetwork/forta-bot' const LOG_FILTER_CHUNK = 2000 export async function getLogsByChunks( - contract: ethers.Contract, + contract: ethers.BaseContract, filter: ethers.ContractEventName, startblock: number, endBlock: number, From 24acf97c5cb01ea3d9684fb33d39f2a0d6f707e0 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:28:04 +0300 Subject: [PATCH 17/45] chore: remove unused env variables --- csm-alerts/.env.sample | 5 +---- csm-alerts/src/config.ts | 2 -- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/csm-alerts/.env.sample b/csm-alerts/.env.sample index 1bed806b1..9bdf264ae 100644 --- a/csm-alerts/.env.sample +++ b/csm-alerts/.env.sample @@ -1,14 +1,11 @@ APP_NAME=csm-alerts -INSTANCE=forta -HTTP_PORT=3000 LOG_FORMAT=simple LOG_LEVEL=debug -RPC_URL=https://holesky.drpc.org + FORTA_AGENT_RUN_TIER=holesky ## FORTA compatible env names -NODE_ENV=local FORTA_CHAIN_ID=17000 # vim: ft=sh diff --git a/csm-alerts/src/config.ts b/csm-alerts/src/config.ts index fe55b3767..dd0111a6f 100644 --- a/csm-alerts/src/config.ts +++ b/csm-alerts/src/config.ts @@ -1,7 +1,5 @@ export const RUN_TIER = process.env.FORTA_AGENT_RUN_TIER || null export const APP_NAME = process.env.APP_NAME || 'csm-alerts' -export const NODE_ENV = process.env.NODE_ENV || 'production' export const LOG_LEVEL = process.env.LOG_LEVEL || 'info' export const LOG_FORMAT = process.env.LOG_FORMAT || 'simple' -export const RPC_URL = process.env.RPC_URL || 'https://holesky.drpc.org' export const IS_CLI = !!(process.env.FORTA_CLI_BLOCK || process.env.FORTA_CLI_TX) From 082fd032bf75c742ab5d7600ec9f0e00488e81d3 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:29:19 +0300 Subject: [PATCH 18/45] chore: update .dockerignore --- csm-alerts/.dockerignore | 1 + 1 file changed, 1 insertion(+) diff --git a/csm-alerts/.dockerignore b/csm-alerts/.dockerignore index df4f0900f..fb578b504 100644 --- a/csm-alerts/.dockerignore +++ b/csm-alerts/.dockerignore @@ -2,3 +2,4 @@ node_modules/ dist/ forta.config.json generated +.env From ce8d6b0f75b0f50e144c40dc100941e1f63ba49a Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:29:28 +0300 Subject: [PATCH 19/45] feat: add .envrc --- csm-alerts/.envrc | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 csm-alerts/.envrc diff --git a/csm-alerts/.envrc b/csm-alerts/.envrc new file mode 100644 index 000000000..f9fc4cd7f --- /dev/null +++ b/csm-alerts/.envrc @@ -0,0 +1,3 @@ +layout node +use node +dotenv_if_exists From 9d951f21e3aefaa5adc073b73a17df87baa247c0 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:30:13 +0300 Subject: [PATCH 20/45] fix: trailing comma in tsconfig.json --- csm-alerts/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csm-alerts/tsconfig.json b/csm-alerts/tsconfig.json index 29128a7e8..54a278c10 100644 --- a/csm-alerts/tsconfig.json +++ b/csm-alerts/tsconfig.json @@ -10,6 +10,6 @@ "tests", "dist", "**/*spec.ts", - "**/*mock.ts", + "**/*mock.ts" ] } From 16a43b027f98402d1d6ab3baeabc6153557f5fab Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:30:45 +0300 Subject: [PATCH 21/45] fix: cleanup package.json scripts --- csm-alerts/package.json | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/csm-alerts/package.json b/csm-alerts/package.json index f2aa2a8fb..82e9349fb 100644 --- a/csm-alerts/package.json +++ b/csm-alerts/package.json @@ -21,20 +21,16 @@ "build": "tsc", "copy-version": "cp version.json dist", "start": "ts-node src/main.ts", - "start:prod": "node dist/main.js", - "start:docker:prod": "node src/main.js", + "start:prod:v2": "node src/main.js", + "start:prod:v1": "forta-agent run --prod", "range": "forta-bot run --range", "block": "forta-bot run --block", "tx": "forta-bot run --tx", - "push": "yarn run update-version && forta-agent push", + "push": "yarn run update-version && forta-bot push", "test": "jest", "generate-types": "typechain --target=ethers-v6 --out-dir=./src/generated/typechain ./src/abis/*", - "eslint:lint": "eslint ./src", - "eslint:format": "eslint ./src --fix", - "prettier:check": "prettier --check ./src", - "prettier:format": "prettier --write ./src README.md", "lint": "eslint ./src", - "format": "yarn lint --fix", + "format": "yarn lint --fix && prettier --write README.md", "postinstall": "yarn generate-types" }, "dependencies": { From 25b62e8bc6598c140ca10445981c62a91acf6753 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:30:59 +0300 Subject: [PATCH 22/45] docs: update README --- csm-alerts/README.md | 64 +++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/csm-alerts/README.md b/csm-alerts/README.md index 68cb77ead..bb9c449a7 100644 --- a/csm-alerts/README.md +++ b/csm-alerts/README.md @@ -2,7 +2,8 @@ ## Supported chains -- Holesky testnet +- Mainnet +- Holesky ## Alerts @@ -27,10 +28,7 @@ 8. 🚨 CRITICAL: role change: VERIFIER_ROLE 9. 🚨 CRITICAL: role change: RECOVERER_ROLE 2. **CSAccounting** - 1. General - 1. 🟒 LOW: Average bond value for a validator is below some threshold. - 2. 🟒 LOW: Total bond lock more than some value. - 3. 🟒 LOW: sharesOf(CSAccounting.address) - CSBondCoreStorage.totalBondShares > 0.1 ether + 1. General 3. 🟒 LOW: sharesOf(CSAccounting.address) - CSBondCoreStorage.totalBondShares > 0.1 ether 2. Events monitoring 1. 🚨 CRITICAL: ChargePenaltyRecipientSet(address chargeRecipient) 2. 🚨 CRITICAL: BondCurveUpdated(uint256 indexed curveId, uint256[] bondCurve) @@ -54,7 +52,6 @@ 4. πŸ”΄ HIGH: ConsensusVersionSet(uint256 indexed version, uint256 indexed prevVersion) 5. πŸ”΅ INFO: WarnProcessingMissed(uint256 indexed refSlot) 6. πŸ”΅ INFO: ReportSubmitted(uint256 indexed refSlot, bytes32 hash, uint256 processingDeadlineTime) - 7. πŸ”΅ INFO: ProcessingStarted(uint256 indexed refSlot, bytes32 hash) 2. Roles monitoring 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE 2. 🚨 CRITICAL: CONTRACT_MANAGER_ROLE @@ -86,6 +83,7 @@ 1. 🚨 CRITICAL: Receiver of TransferShares is NOT CSAccounting, if from is CSFeeDistributor 2. πŸ”΄ HIGH: No fees distributed for X days (repeat every 1 day). 3. πŸ”΅ INFO: DistributionDataUpdated -> Oracle settled a new report. + 4. πŸ”΅ INFO: DistributionLogUpdated. 2. Roles monitoring 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE 2. 🚨 CRITICAL: RECOVERER_ROLE @@ -130,32 +128,54 @@ 4. πŸ”΄ HIGH: ERC721Recovered() 5. πŸ”΄ HIGH: ERC1155Recovered() -## Development (Forta specific) +## Deployment -Edit `alerting-forta//forta.config.json` and set `jsonRpcUrl` to your JSON-RPC provider. Install deps: +- Make sure you have uncommitted changes +- Run `yarn push` command +- Copy the resulting docker image reference +- Deploy a new version via https://app.forta.network with the image reference from the previous step -``` +## Development + +Install dependencies. + +```shell yarn install -yarn build -yarn start ``` -In separate console run +Create a `forta.config.json` file with the following content and replace Ethereum RPC URL with the +one you're gonna use for development. +```json +{ + "localRpcUrls": { + "ethereum": "http://127.0.0.1:8545" + } +} ``` -docker-compose up -d + +To start the bot in local mode just run: + +```shell +yarn run start ``` -## Testing alerts +Use one of the following commands to check specific range/block/transaction(s): -1. For testing alerts you have to install promtool on your machine. +```shell +yarn run range $BLOCK_NUMBER..$BLOCK_NUMBER +yarn run block $SOME_BLOCK_NUMBER_OR_HASH +yarn run tx $SOME_TX_HASH[,$ANOTHER_HASH] +``` - ``` - make tools - ``` +## Forta bot v1 or v2? -2. Check alerts +This bot is developed using SDKv2, so it's the v2 bot. But the project provides a shim to be used as +a v1 bot, though not well tested. By default, the `yarn push` command uses the Dockerfile in the +repository to build an image of the v2 bot. If you want to push an image to be used as a v1 bot, +replace the command in the Dockerfile with `yarn run start:prod:v1`. - ``` - make test_alerts - ``` +```diff +- CMD ["yarn", "run", "start:prod:v2"] ++ CMD ["yarn", "run", "start:prod:v1"] +``` From 09e3db5b0a35957c7b16bd8e66e3d85b2b9cd288 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:31:28 +0300 Subject: [PATCH 23/45] fix: support transactions separated by comma --- csm-alerts/src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csm-alerts/src/main.ts b/csm-alerts/src/main.ts index dc6b16a0b..3fccc0c8f 100644 --- a/csm-alerts/src/main.ts +++ b/csm-alerts/src/main.ts @@ -129,7 +129,7 @@ async function parseArgs() { blockIdentifier = parseInt(blockIdentifier) } - const txIdentifier = process.env['FORTA_CLI_TX'] + const txIdentifier = process.env['FORTA_CLI_TX']?.split(',')[0] if (txIdentifier) { const provider = await getProvider({ rpcUrl: RPC_URL, From 657d66a4c1d607e9ff8827777ab6bf724b5ac5ce Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:38:27 +0300 Subject: [PATCH 24/45] fix: update Dockerfile command --- csm-alerts/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csm-alerts/Dockerfile b/csm-alerts/Dockerfile index 8a7338a9e..ec9253ced 100644 --- a/csm-alerts/Dockerfile +++ b/csm-alerts/Dockerfile @@ -28,4 +28,4 @@ COPY --from=builder /app/dist ./src COPY version.json ./ ENTRYPOINT ["/sbin/tini", "--"] -CMD ["yarn", "run", "start:docker:prod"] +CMD ["yarn", "run", "start:prod:v2"] From 3ac81bb6cb8120465925b1cc56c07e0f66ba15aa Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:47:51 +0300 Subject: [PATCH 25/45] feat: using JWT-based provider --- csm-alerts/src/main.ts | 16 ++++------------ csm-alerts/src/shared/provider.ts | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 12 deletions(-) create mode 100644 csm-alerts/src/shared/provider.ts diff --git a/csm-alerts/src/main.ts b/csm-alerts/src/main.ts index 3fccc0c8f..5b19821e4 100644 --- a/csm-alerts/src/main.ts +++ b/csm-alerts/src/main.ts @@ -3,18 +3,17 @@ import { Finding, TransactionEvent, ethers, - getProvider, isProduction, scanEthereum, } from '@fortanetwork/forta-bot' -import { RPC_URL } from './config' import { getLogger } from './logger' import { CSAccountingSrv } from './services/CSAccounting/CSAccounting.srv' import { CSFeeDistributorSrv } from './services/CSFeeDistributor/CSFeeDistributor.srv' import { CSFeeOracleSrv } from './services/CSFeeOracle/CSFeeOracle.srv' import { CSModuleSrv } from './services/CSModule/CSModule.srv' import { EventsWatcherSrv } from './services/EventsWatcher/EventsWatcher.srv' +import { RPC_OPTS, getProvider } from './shared/provider' import { launchAlert } from './utils/findings' const logger = getLogger('main') @@ -25,7 +24,7 @@ async function main() { scanEthereum({ handleTransaction, handleBlock, - rpcUrl: RPC_URL, + ...RPC_OPTS, }) if (!isProduction) { @@ -52,12 +51,7 @@ async function getHandlers() { for (const srv of services) { if ('initialize' in srv) { - await srv.initialize( - blockIdentifier ?? 'latest', - await getProvider({ - rpcUrl: RPC_URL, - }), - ) + await srv.initialize(blockIdentifier ?? 'latest', await getProvider()) } } @@ -131,9 +125,7 @@ async function parseArgs() { const txIdentifier = process.env['FORTA_CLI_TX']?.split(',')[0] if (txIdentifier) { - const provider = await getProvider({ - rpcUrl: RPC_URL, - }) + const provider = await getProvider() const tx = await provider.getTransaction(txIdentifier) if (!tx?.blockHash) { diff --git a/csm-alerts/src/shared/provider.ts b/csm-alerts/src/shared/provider.ts new file mode 100644 index 000000000..8c97ec8c6 --- /dev/null +++ b/csm-alerts/src/shared/provider.ts @@ -0,0 +1,18 @@ +import { getProvider as getFortaProvider } from '@fortanetwork/forta-bot' +import { ScanEvmOptions } from '@fortanetwork/forta-bot/dist/scanning' + +const FORTA_PUBKEY_FINGERPRINT = '3B0B3496AB884A1FF0159863C04D8ECD12AACC1D287544AF1665DCE26F55402F' +const DRPC_KEY_BASE64 = 'QWpGRUdOTHAwMDh0bkE0dmR4Um53ODRMVTl3dmk3d1I3N2gzVGdGa1ZwNWo=' + +export const RPC_OPTS: Omit = { + rpcUrl: 'https://lb.drpc.org/ogrpc?network=ethereum', + rpcKeyId: FORTA_PUBKEY_FINGERPRINT, + rpcHeaders: { 'Drpc-Key': String(Buffer.from(DRPC_KEY_BASE64, 'base64')) }, + localRpcUrl: 'ethereum', +} + +export async function getProvider() { + return getFortaProvider({ + ...RPC_OPTS, + }) +} From de8fa8335660816d9494f9770f40aff7523d18c3 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Thu, 17 Oct 2024 09:28:57 +0300 Subject: [PATCH 26/45] chore: log block handler run --- csm-alerts/src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csm-alerts/src/main.ts b/csm-alerts/src/main.ts index 5b19821e4..5f243c741 100644 --- a/csm-alerts/src/main.ts +++ b/csm-alerts/src/main.ts @@ -79,7 +79,7 @@ async function getHandlers() { } async function handleBlock(blockEvent: BlockEvent, provider: ethers.Provider) { - logger.debug(`Running handlers for block ${blockEvent.blockNumber}`) + logger.info(`Running handlers for block ${blockEvent.blockNumber}`) const results = await Promise.allSettled( services From 27d3852c10a5a64cf5876ff05546b1ce93023531 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Thu, 17 Oct 2024 11:47:14 +0300 Subject: [PATCH 27/45] feat: add GateSeal alerts --- csm-alerts/src/abis/GateSeal.json | 1 + csm-alerts/src/agent.ts | 14 ++-- csm-alerts/src/main.ts | 14 ++-- .../EventsWatcher/EventsWatcher.srv.ts | 1 + .../services/EventsWatcher/events/gateseal.ts | 28 +++++++ .../services/EventsWatcher/events/index.ts | 1 + .../src/services/GateSeal/GateSeal.srv.ts | 76 +++++++++++++++++++ csm-alerts/src/services/index.ts | 6 ++ 8 files changed, 131 insertions(+), 10 deletions(-) create mode 100644 csm-alerts/src/abis/GateSeal.json create mode 100644 csm-alerts/src/services/EventsWatcher/events/gateseal.ts create mode 100644 csm-alerts/src/services/GateSeal/GateSeal.srv.ts create mode 100644 csm-alerts/src/services/index.ts diff --git a/csm-alerts/src/abis/GateSeal.json b/csm-alerts/src/abis/GateSeal.json new file mode 100644 index 000000000..1358d4b6e --- /dev/null +++ b/csm-alerts/src/abis/GateSeal.json @@ -0,0 +1 @@ +[{"name":"Sealed","inputs":[{"name":"gate_seal","type":"address","indexed":false},{"name":"sealed_by","type":"address","indexed":false},{"name":"sealed_for","type":"uint256","indexed":false},{"name":"sealable","type":"address","indexed":false},{"name":"sealed_at","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_sealing_committee","type":"address"},{"name":"_seal_duration_seconds","type":"uint256"},{"name":"_sealables","type":"address[]"},{"name":"_expiry_timestamp","type":"uint256"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"get_sealing_committee","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"get_seal_duration_seconds","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_sealables","inputs":[],"outputs":[{"name":"","type":"address[]"}]},{"stateMutability":"view","type":"function","name":"get_expiry_timestamp","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"is_expired","inputs":[],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"seal","inputs":[{"name":"_sealables","type":"address[]"}],"outputs":[]}] diff --git a/csm-alerts/src/agent.ts b/csm-alerts/src/agent.ts index ae879b5b7..e97dcc9d0 100644 --- a/csm-alerts/src/agent.ts +++ b/csm-alerts/src/agent.ts @@ -5,11 +5,14 @@ import { Finding, HandleBlock, HandleTransaction, Initialize, getJsonRpcUrl } fr import yargs from 'yargs' import { getLogger } from './logger' -import { CSAccountingSrv } from './services/CSAccounting/CSAccounting.srv' -import { CSFeeDistributorSrv } from './services/CSFeeDistributor/CSFeeDistributor.srv' -import { CSFeeOracleSrv } from './services/CSFeeOracle/CSFeeOracle.srv' -import { CSModuleSrv } from './services/CSModule/CSModule.srv' -import { EventsWatcherSrv } from './services/EventsWatcher/EventsWatcher.srv' +import { + CSAccountingSrv, + CSFeeDistributorSrv, + CSFeeOracleSrv, + CSModuleSrv, + EventsWatcherSrv, + GateSealSrv, +} from './services' import { launchAlert } from './utils/findings' import { blockEventV1toV2, findingV2toV1, txEventV1toV2 } from './utils/shim' @@ -21,6 +24,7 @@ const SERVICES = [ new CSAccountingSrv(), new CSFeeOracleSrv(), new CSModuleSrv(), + new GateSealSrv(), ] let isLaunchReported = false diff --git a/csm-alerts/src/main.ts b/csm-alerts/src/main.ts index 5f243c741..2d301f06f 100644 --- a/csm-alerts/src/main.ts +++ b/csm-alerts/src/main.ts @@ -8,11 +8,14 @@ import { } from '@fortanetwork/forta-bot' import { getLogger } from './logger' -import { CSAccountingSrv } from './services/CSAccounting/CSAccounting.srv' -import { CSFeeDistributorSrv } from './services/CSFeeDistributor/CSFeeDistributor.srv' -import { CSFeeOracleSrv } from './services/CSFeeOracle/CSFeeOracle.srv' -import { CSModuleSrv } from './services/CSModule/CSModule.srv' -import { EventsWatcherSrv } from './services/EventsWatcher/EventsWatcher.srv' +import { + CSAccountingSrv, + CSFeeDistributorSrv, + CSFeeOracleSrv, + CSModuleSrv, + EventsWatcherSrv, + GateSealSrv, +} from './services' import { RPC_OPTS, getProvider } from './shared/provider' import { launchAlert } from './utils/findings' @@ -47,6 +50,7 @@ async function getHandlers() { new CSAccountingSrv(), new CSFeeOracleSrv(), new CSModuleSrv(), + new GateSealSrv(), ] for (const srv of services) { diff --git a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts index ecaf8eaff..74855e4ba 100644 --- a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts +++ b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.ts @@ -55,6 +55,7 @@ export class EventsWatcherSrv implements Service { this.eventsOfNotice = [ ...Events.getHashConsensusEvents(DEPLOYED_ADDRESSES.HASH_CONSENSUS, ORACLE_MEMBERS), ...Events.getCSFeeDistributorEvents(DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR), + ...Events.getGateSealEvents(DEPLOYED_ADDRESSES.CS_GATE_SEAL, ALIASES), ...Events.getCSAccountingEvents(DEPLOYED_ADDRESSES.CS_ACCOUNTING), ...Events.getCSFeeOracleEvents(DEPLOYED_ADDRESSES.CS_FEE_ORACLE), ...Events.getCSModuleEvents(DEPLOYED_ADDRESSES.CS_MODULE), diff --git a/csm-alerts/src/services/EventsWatcher/events/gateseal.ts b/csm-alerts/src/services/EventsWatcher/events/gateseal.ts new file mode 100644 index 000000000..e4022cd96 --- /dev/null +++ b/csm-alerts/src/services/EventsWatcher/events/gateseal.ts @@ -0,0 +1,28 @@ +import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' + +import { GateSeal__factory } from '../../../generated/typechain' +import * as GateSeal from '../../../generated/typechain/GateSeal' +import { EventOfNotice } from '../../../shared/types' +import { etherscanAddress } from '../../../utils/string' +import { formatDelay } from '../../../utils/time' + +const IGateSeal = GateSeal__factory.createInterface() + +export function getGateSealEvents( + address: string, + knownContracts: { [key: string]: string }, +): EventOfNotice[] { + return [ + { + address: address, + abi: IGateSeal.getEvent('Sealed').format('full'), + alertId: 'CS-GATE-SEAL-SEALED', + name: '🚨 CSM Gate Seal paused a contract', + description: (args: GateSeal.SealedEvent.OutputObject) => + `${etherscanAddress(args.sealable)} (${knownContracts[args.sealable] ?? 'unknown'})` + + `was paused for ${formatDelay(args.sealed_for)} by ${etherscanAddress(args.sealed_by)}`, + severity: FindingSeverity.Critical, + type: FindingType.Info, + }, + ] +} diff --git a/csm-alerts/src/services/EventsWatcher/events/index.ts b/csm-alerts/src/services/EventsWatcher/events/index.ts index 08df6744d..d62e3d3c4 100644 --- a/csm-alerts/src/services/EventsWatcher/events/index.ts +++ b/csm-alerts/src/services/EventsWatcher/events/index.ts @@ -2,6 +2,7 @@ export * from './assetRecoverer' export * from './distributor' export * from './accounting' export * from './pausable' +export * from './gateseal' export * from './proxies' export * from './module' export * from './oracle' diff --git a/csm-alerts/src/services/GateSeal/GateSeal.srv.ts b/csm-alerts/src/services/GateSeal/GateSeal.srv.ts new file mode 100644 index 000000000..6648da4b8 --- /dev/null +++ b/csm-alerts/src/services/GateSeal/GateSeal.srv.ts @@ -0,0 +1,76 @@ +import { BlockEvent, Finding, FindingSeverity, FindingType, ethers } from '@fortanetwork/forta-bot' +import { Logger } from 'winston' + +import { IS_CLI } from '../../config' +import { GateSeal__factory } from '../../generated/typechain' +import { getLogger } from '../../logger' +import { SECONDS_PER_DAY } from '../../shared/constants' +import { Service } from '../../shared/types' +import { RedefineMode, requireWithTier } from '../../utils/require' +import { formatDelay } from '../../utils/time' +import * as Constants from '../constants' + +const { DEPLOYED_ADDRESSES } = requireWithTier( + module, + '../constants', + RedefineMode.Merge, +) + +const EXPIRATION_CHECK_INTERVAL_BLOCKS = 601 +const EXPIRATION_TIME_LEFT_SEC_MIN = SECONDS_PER_DAY * 28 * 3 + +export class GateSealSrv implements Service { + private readonly logger: Logger + + private readonly lastFiredAt = { + gateSealExpired: 0, + } + + constructor() { + this.logger = getLogger(this.getName()) + } + + getName() { + return GateSealSrv.name + } + + public async handleBlock( + blockEvent: BlockEvent, + provider: ethers.Provider, + ): Promise { + if (blockEvent.blockNumber % EXPIRATION_CHECK_INTERVAL_BLOCKS !== 0 && !IS_CLI) { + return [] + } + + const gs = GateSeal__factory.connect(DEPLOYED_ADDRESSES.CS_GATE_SEAL, provider) + const expiresAt = await gs.get_expiry_timestamp({ + blockTag: blockEvent.blockHash, + }) + + const now = blockEvent.block.timestamp + const expiresInSec = BigInt(now) - expiresAt + const isExpired = now <= expiresAt + + if (isExpired || expiresInSec > EXPIRATION_TIME_LEFT_SEC_MIN) { + return [] + } + + const out: Finding[] = [] + + if (now - this.lastFiredAt.gateSealExpired > SECONDS_PER_DAY * 7) { + const f = Finding.fromObject({ + name: `πŸ”΄ CSM GateSeal expires soon.`, + description: `CSM GateSeal expires in ${formatDelay(expiresInSec)}`, + alertId: 'CS-GATE-SEAL-EXPIRES-SOON', + // NOTE: Do not include the source to reach quorum. + // source: sourceFromEvent(blockEvent), + severity: FindingSeverity.High, + type: FindingType.Info, + }) + out.push(f) + this.lastFiredAt.gateSealExpired = now + } + + return out + } +} diff --git a/csm-alerts/src/services/index.ts b/csm-alerts/src/services/index.ts new file mode 100644 index 000000000..83e8825e8 --- /dev/null +++ b/csm-alerts/src/services/index.ts @@ -0,0 +1,6 @@ +export * from './CSFeeDistributor/CSFeeDistributor.srv' +export * from './EventsWatcher/EventsWatcher.srv' +export * from './CSAccounting/CSAccounting.srv' +export * from './CSFeeOracle/CSFeeOracle.srv' +export * from './CSModule/CSModule.srv' +export * from './GateSeal/GateSeal.srv' From 03d49283967a3c5413d5bc0ec2e601f6840ce021 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Thu, 17 Oct 2024 17:47:07 +0300 Subject: [PATCH 28/45] fix: check CSFeeDistributor invariants when it makes sense --- .../CSFeeDistributor/CSFeeDistributor.srv.ts | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts index 6b2d657ee..bd357214d 100644 --- a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts +++ b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.ts @@ -7,7 +7,6 @@ import { ethers, filterLog, } from '@fortanetwork/forta-bot' -import { Provider } from 'ethers' import { Logger } from 'winston' import { @@ -98,25 +97,30 @@ export class CSFeeDistributorSrv implements Service { ) } - async handleBlock(blockEvent: BlockEvent, provider: Provider): Promise { - return [ - ...this.handleDistributionOverdue(blockEvent), - ...(await this.checkInvariants(blockEvent, provider)), - ] + async handleBlock(blockEvent: BlockEvent): Promise { + return [...this.handleDistributionOverdue(blockEvent)] } - public async handleTransaction(txEvent: TransactionEvent): Promise { + public async handleTransaction( + txEvent: TransactionEvent, + provider: ethers.Provider, + ): Promise { const distributionDataUpdatedEvents = filterLog( txEvent.logs, ICSFeeDistributor.getEvent('DistributionDataUpdated').format('full'), DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, ) + const out: Finding[] = [] + if (distributionDataUpdatedEvents.length > 0) { this.state.lastDistributionUpdatedAt = txEvent.block.timestamp + out.push(...(await this.checkInvariants(txEvent, provider))) } - return this.handleTransferSharesInvalidReceiver(txEvent) + out.push(...this.handleTransferSharesInvalidReceiver(txEvent)) + + return out } private handleDistributionOverdue(blockEvent: BlockEvent): Finding[] { @@ -188,31 +192,31 @@ export class CSFeeDistributorSrv implements Service { return out } - private async checkInvariants(blockEvent: BlockEvent, provider: ethers.Provider) { + private async checkInvariants(txEvent: TransactionEvent, provider: ethers.Provider) { const distributor = CSFeeDistributor__factory.connect( DEPLOYED_ADDRESSES.CS_FEE_DISTRIBUTOR, provider, ) const steth = Lido__factory.connect(DEPLOYED_ADDRESSES.LIDO_STETH, provider) - const blockTag = blockEvent.blockHash + const blockTag = txEvent.block.hash const out: Finding[] = [] const treeRoot = await distributor.treeRoot({ blockTag }) const treeCid = await distributor.treeCid({ blockTag }) if (treeRoot !== ethers.ZeroHash && treeCid === '') { - out.push(invariantAlert(blockEvent, 'Tree exists, but no CID')) + out.push(invariantAlert(txEvent, 'Tree exists, but no CID')) } if (treeRoot === ethers.ZeroHash && treeCid !== '') { - out.push(invariantAlert(blockEvent, 'Tree CID exists, but no root')) + out.push(invariantAlert(txEvent, 'Tree CID exists, but no root')) } if ( (await distributor.totalClaimableShares({ blockTag })) > (await steth.sharesOf(distributor, { blockTag })) ) { - out.push(invariantAlert(blockEvent, "distributed more than the contract's balance")) + out.push(invariantAlert(txEvent, "distributed more than the contract's balance")) } return out From edecd2ee24ca537adebf7fbe2085fe924678a45d Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Thu, 17 Oct 2024 19:35:09 +0300 Subject: [PATCH 29/45] chore: add logging to v1 shim --- csm-alerts/src/agent.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/csm-alerts/src/agent.ts b/csm-alerts/src/agent.ts index e97dcc9d0..47494dc73 100644 --- a/csm-alerts/src/agent.ts +++ b/csm-alerts/src/agent.ts @@ -30,6 +30,8 @@ const SERVICES = [ let isLaunchReported = false const handleBlock: HandleBlock = async (blockEvent) => { + logger.info(`Running handlers for block ${blockEvent.blockNumber}`) + const out: Finding[] = [] const provider = await getProvider({ rpcUrl: getJsonRpcUrl() }) From 83252fe257fedec15881b44ccfd9bd44c1f48477 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Sat, 19 Oct 2024 14:15:46 +0300 Subject: [PATCH 30/45] feat: formatShares in updated distribution alert --- csm-alerts/src/services/EventsWatcher/events/distributor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csm-alerts/src/services/EventsWatcher/events/distributor.ts b/csm-alerts/src/services/EventsWatcher/events/distributor.ts index 0fd167eb8..4852b47bf 100644 --- a/csm-alerts/src/services/EventsWatcher/events/distributor.ts +++ b/csm-alerts/src/services/EventsWatcher/events/distributor.ts @@ -3,7 +3,7 @@ import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' import { CSFeeDistributor__factory } from '../../../generated/typechain' import * as CSFeeDistributor from '../../../generated/typechain/CSFeeDistributor' import { EventOfNotice } from '../../../shared/types' -import { ipfsLink } from '../../../utils/string' +import { formatShares, ipfsLink } from '../../../utils/string' const ICSFeeDistributor = CSFeeDistributor__factory.createInterface() @@ -15,7 +15,7 @@ export function getCSFeeDistributorEvents(distributorAddress: string): EventOfNo alertId: 'CSFEE-DISTRIBUTOR-DISTRIBUTION-DATA-UPDATED', name: 'πŸ”΅ CSFeeDistributor: Distribution data updated', description: (args: CSFeeDistributor.DistributionDataUpdatedEvent.OutputObject) => - `Total Claimable Shares: ${args.totalClaimableShares}\n` + + `Total Claimable Shares: ${formatShares(args.totalClaimableShares)}\n` + `Tree Root: ${args.treeRoot}\n` + `Tree CID: ${ipfsLink(args.treeCid)}`, severity: FindingSeverity.Info, From 45b2a63015a040e84338df387e170e2fdba22e7c Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Sat, 19 Oct 2024 14:23:09 +0300 Subject: [PATCH 31/45] chore: remove unused findings helpers --- csm-alerts/src/utils/findings.ts | 53 -------------------------------- 1 file changed, 53 deletions(-) diff --git a/csm-alerts/src/utils/findings.ts b/csm-alerts/src/utils/findings.ts index 90af36224..19ff9c08d 100644 --- a/csm-alerts/src/utils/findings.ts +++ b/csm-alerts/src/utils/findings.ts @@ -71,56 +71,3 @@ export function failedTxAlert( type: FindingType.Info, }) } - -export const NetworkErrorFinding = 'NETWORK-ERROR' - -export function networkAlert(err: Error, name: string, desc: string): Finding { - const f = Finding.fromObject({ - name: name, - description: desc, - alertId: NetworkErrorFinding, - severity: FindingSeverity.Unknown, - type: FindingType.Degraded, - metadata: { - stack: `${err.stack}`, - message: `${err.message}`, - name: `${err.name}`, - }, - }) - - return f -} - -export function dbAlert(err: Error, name: string, desc: string): Finding { - const f = Finding.fromObject({ - name: name, - description: desc, - alertId: 'DB-ERROR', - severity: FindingSeverity.Unknown, - type: FindingType.Degraded, - metadata: { - stack: `${err.stack}`, - message: `${err.message}`, - name: `${err.name}`, - }, - }) - - return f -} - -export class NetworkError extends Error { - constructor(e: unknown, name?: string) { - super() - - if (name !== undefined) { - this.name = name - } - - if (e instanceof Error) { - this.stack = e.stack - this.message = e.message - } else { - this.message = `${e}` - } - } -} From 1039f493fc9cb102a09358065ec124828518c46b Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Sat, 19 Oct 2024 14:23:24 +0300 Subject: [PATCH 32/45] chore: push code errors findings --- csm-alerts/src/main.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/csm-alerts/src/main.ts b/csm-alerts/src/main.ts index 2d301f06f..24bde492b 100644 --- a/csm-alerts/src/main.ts +++ b/csm-alerts/src/main.ts @@ -17,7 +17,7 @@ import { GateSealSrv, } from './services' import { RPC_OPTS, getProvider } from './shared/provider' -import { launchAlert } from './utils/findings' +import { errorAlert, launchAlert } from './utils/findings' const logger = getLogger('main') @@ -75,7 +75,7 @@ async function getHandlers() { out.push(...r.value) } else { // TODO: Some exceptions should crash an application in fact. - // out.push(errorAlert(`Error processing tx ${txEvent.transaction.hash}`, r.reason)) + out.push(errorAlert(`Error processing tx ${txEvent.transaction.hash}`, r.reason)) logger.error(r.reason) } } @@ -97,7 +97,7 @@ async function getHandlers() { out.push(...r.value) } else { // TODO: Some exceptions should crash an application in fact. - // out.push(errorAlert(`Error processing block ${blockEvent.block.hash}`, r.reason)) + out.push(errorAlert(`Error processing block ${blockEvent.block.hash}`, r.reason)) logger.error(r.reason) } } From 912f9fa6aa6f7cf9a5dce725ebf63cce60bcc44c Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Sat, 19 Oct 2024 14:23:46 +0300 Subject: [PATCH 33/45] build: switch to v1 bot in Dockerfile --- csm-alerts/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csm-alerts/Dockerfile b/csm-alerts/Dockerfile index ec9253ced..7c0859fc6 100644 --- a/csm-alerts/Dockerfile +++ b/csm-alerts/Dockerfile @@ -28,4 +28,4 @@ COPY --from=builder /app/dist ./src COPY version.json ./ ENTRYPOINT ["/sbin/tini", "--"] -CMD ["yarn", "run", "start:prod:v2"] +CMD ["yarn", "run", "start:prod:v1"] From 52f1608697000379cd659602efc0cc2c89979c7e Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:20:43 +0300 Subject: [PATCH 34/45] chore: drop tests --- .../CSAccounting/CSAccounting.srv.spec.ts | 174 ------ .../CSAccounting.srv.spec.ts.snap | 227 -------- .../CSFeeDistributor.srv.spec.ts | 97 ---- .../CSFeeDistributor.srv.spec.ts.snap | 44 -- .../CSFeeOracle/CSFeeOracle.srv.spec.ts | 223 -------- .../CSFeeOracle.srv.spec.ts.snap | 481 ----------------- .../services/CSModule/CSModule.srv.spec.ts | 147 ----- .../__snapshots__/CSModule.srv.spec.ts.snap | 108 ---- .../EventsWatcher/EventsWatcher.srv.spec.ts | 184 ------- .../ProxyWatcher.srv.spec.ts.snap | 511 ------------------ csm-alerts/tsconfig.json | 4 +- 11 files changed, 1 insertion(+), 2199 deletions(-) delete mode 100644 csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts delete mode 100644 csm-alerts/src/services/CSAccounting/__snapshots__/CSAccounting.srv.spec.ts.snap delete mode 100644 csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts delete mode 100644 csm-alerts/src/services/CSFeeDistributor/__snapshots__/CSFeeDistributor.srv.spec.ts.snap delete mode 100644 csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts delete mode 100644 csm-alerts/src/services/CSFeeOracle/__snapshots__/CSFeeOracle.srv.spec.ts.snap delete mode 100644 csm-alerts/src/services/CSModule/CSModule.srv.spec.ts delete mode 100644 csm-alerts/src/services/CSModule/__snapshots__/CSModule.srv.spec.ts.snap delete mode 100644 csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.spec.ts delete mode 100644 csm-alerts/src/services/EventsWatcher/__snapshots__/ProxyWatcher.srv.spec.ts.snap diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts deleted file mode 100644 index a103fc514..000000000 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.spec.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { DeploymentAddress, DeploymentAddresses } from '../../utils/constants.holesky' -import { expect } from '@jest/globals' -import { TransactionDto } from '../../entity/events' -import { - CSModule__factory, - CSAccounting__factory, - CSFeeDistributor__factory, - CSFeeOracle__factory, -} from '../../generated/typechain' -import { getCSAccountingEvents } from '../../utils/events/cs_accounting_events' -import { CSAccountingSrv, ICSAccountingClient } from './CSAccounting.srv' -import * as Winston from 'winston' -import { ETHProvider } from '../../clients/eth_provider' -import { ethers } from '@fortanetwork/forta-bot' -import { getFortaConfig } from 'forta-agent/dist/sdk/utils' -import promClient from 'prom-client' -import { Metrics } from '../../utils/metrics/metrics' - -const TEST_TIMEOUT = 120_000 // ms - -describe('CSAccounting event tests', () => { - const chainId = 17000 - - const logger: Winston.Logger = Winston.createLogger({ - format: Winston.format.simple(), - transports: [new Winston.transports.Console()], - }) - - const address: DeploymentAddress = DeploymentAddresses - - const fortaEthersProvider = new ethers.providers.JsonRpcProvider( - getFortaConfig().jsonRpcUrl, - chainId, - ) - const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) - const csAccountingRunner = CSAccounting__factory.connect( - address.CS_ACCOUNTING_ADDRESS, - fortaEthersProvider, - ) - const csFeeDistributorRunner = CSFeeDistributor__factory.connect( - address.CS_FEE_DISTRIBUTOR_ADDRESS, - fortaEthersProvider, - ) - const csFeeOracleRunner = CSFeeOracle__factory.connect( - address.CS_FEE_ORACLE_ADDRESS, - fortaEthersProvider, - ) - - const registry = new promClient.Registry() - const m = new Metrics(registry, 'test_') - - const csAccountingClient: ICSAccountingClient = new ETHProvider( - logger, - m, - fortaEthersProvider, - csModuleRunner, - csAccountingRunner, - csFeeDistributorRunner, - csFeeOracleRunner, - ) - - const csAccountingSrv = new CSAccountingSrv( - logger, - csAccountingClient, - getCSAccountingEvents(address.CS_ACCOUNTING_ADDRESS), - address.CS_ACCOUNTING_ADDRESS, - address.LIDO_STETH_ADDRESS, - address.CS_MODULE_ADDRESS, - ) - - test( - '🚨 CSAccounting: Bond Curve Updated', - async () => { - const txHash = '0x8b904da83d58e520c778cc562b10fa4e0943a9f991b9050d93481fdabf2da9c2' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = await csAccountingSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ CSAccounting: Bond Curve added, stETH Approval', - async () => { - const txHash = '0xcc92653babec3b1748d8e04de777796cab2d1ae40fbe926db857e9103a9b74a5' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = await csAccountingSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(4) - }, - TEST_TIMEOUT, - ) - - test( - '🚨 CSAccounting: Charge Penalty Recipient Set', - async () => { - const txHash = '0xf62269919009e1cb9c6ea8c29cb6c83f9c1d113d97d401ed5ff2b696cee6d82f' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = await csAccountingSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ CSAccounting: Bond Curve Set', - async () => { - const txHash = '0xcea4d214c8f6e4f3415fc941fdb6802f4243a7b3e12ba5288cf7e7df39d457a0' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = await csAccountingSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) -}) diff --git a/csm-alerts/src/services/CSAccounting/__snapshots__/CSAccounting.srv.spec.ts.snap b/csm-alerts/src/services/CSAccounting/__snapshots__/CSAccounting.srv.spec.ts.snap deleted file mode 100644 index 72e13d8f3..000000000 --- a/csm-alerts/src/services/CSAccounting/__snapshots__/CSAccounting.srv.spec.ts.snap +++ /dev/null @@ -1,227 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`CSAccounting event tests πŸ”΄ CSAccounting: Bond Curve Set 1`] = ` -[ - { - "array": [ - "ethereum", - 4, - [], - 4, - "CS-ACCOUNTING-BOND-CURVE-SET", - "πŸ”΄ CSAccounting: Bond curve set", - "Bond curve set for node operator ID 204 with curve ID 3", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "204,3", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; - -exports[`CSAccounting event tests πŸ”΄ CSAccounting: Bond Curve added, stETH Approval 1`] = ` -[ - { - "array": [ - "ethereum", - 4, - [], - 4, - "CS-ACCOUNTING-BOND-CURVE-ADDED", - "πŸ”΄ CSAccounting: Bond curve added", - "Bond curve added: [2.000 ETH, 3.900 ETH, 5.700 ETH, 7.400 ETH, 9.000 ETH, 10.500 ETH]", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "2000000000000000000,3900000000000000000,5700000000000000000,7400000000000000000,9000000000000000000,10500000000000000000", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 1, - , - 4, - "STETH-APPROVAL", - "πŸ”΅ Lido stETH: Approval", - "0x8d09a4502Cc8Cf1547aD300E066060D043f6982D received allowance from 0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1 to 115792089237316195423570985008687907853269984665640564039457584007913129639935", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": null, - }, - { - "array": [ - "ethereum", - 1, - , - 4, - "STETH-APPROVAL", - "πŸ”΅ Lido stETH: Approval", - "0xc7cc160b58F8Bb0baC94b80847E2CF2800565C50 received allowance from 0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1 to 115792089237316195423570985008687907853269984665640564039457584007913129639935", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": null, - }, - { - "array": [ - "ethereum", - 1, - , - 4, - "STETH-APPROVAL", - "πŸ”΅ Lido stETH: Approval", - "0x4E46BD7147ccf666E1d73A3A456fC7a68de82eCA received allowance from 0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1 to 115792089237316195423570985008687907853269984665640564039457584007913129639935", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": null, - }, -] -`; - -exports[`CSAccounting event tests 🚨 CSAccounting: Bond Curve Updated 1`] = ` -[ - { - "array": [ - "ethereum", - 5, - [], - 4, - "CS-ACCOUNTING-BOND-CURVE-UPDATED", - "🚨 CSAccounting: Bond curve updated", - "Bond curve updated with curve ID 3. Bond curve: [4.000 ETH, 5.000 ETH, 6.000 ETH, 7.000 ETH]", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "3,4000000000000000000,5000000000000000000,6000000000000000000,7000000000000000000", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; - -exports[`CSAccounting event tests 🚨 CSAccounting: Charge Penalty Recipient Set 1`] = ` -[ - { - "array": [ - "ethereum", - 5, - [], - 4, - "CS-ACCOUNTING-CHARGE-PENALTY-RECIPIENT-SET", - "🚨 CSAccounting: Charge penalty recipient set", - "Charge penalty recipient set to [0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d](https://etherscan.io/address/0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d) (expecting the treasury)", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; diff --git a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts b/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts deleted file mode 100644 index c36ebab3b..000000000 --- a/csm-alerts/src/services/CSFeeDistributor/CSFeeDistributor.srv.spec.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { DeploymentAddress, DeploymentAddresses } from '../../utils/constants.holesky' -import { expect } from '@jest/globals' -import { TransactionDto } from '../../entity/events' -import { - CSModule__factory, - CSAccounting__factory, - CSFeeDistributor__factory, - CSFeeOracle__factory, -} from '../../generated/typechain' -import { getCSFeeDistributorEvents } from '../../utils/events/cs_fee_distributor_events' -import { CSFeeDistributorSrv, ICSFeeDistributorClient } from './CSFeeDistributor.srv' -import * as Winston from 'winston' -import { ETHProvider } from '../../clients/eth_provider' -import { ethers } from '@fortanetwork/forta-bot' -import { getFortaConfig } from 'forta-agent/dist/sdk/utils' -import promClient from 'prom-client' -import { Metrics } from '../../utils/metrics/metrics' - -const TEST_TIMEOUT = 120_000 // ms - -describe('CsFeeDistributor event tests', () => { - const chainId = 17000 - - const logger: Winston.Logger = Winston.createLogger({ - format: Winston.format.simple(), - transports: [new Winston.transports.Console()], - }) - - const address: DeploymentAddress = DeploymentAddresses - - const fortaEthersProvider = new ethers.providers.JsonRpcProvider( - getFortaConfig().jsonRpcUrl, - chainId, - ) - const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) - const csAccountingRunner = CSAccounting__factory.connect( - address.CS_ACCOUNTING_ADDRESS, - fortaEthersProvider, - ) - const csFeeDistributorRunner = CSFeeDistributor__factory.connect( - address.CS_FEE_DISTRIBUTOR_ADDRESS, - fortaEthersProvider, - ) - const csFeeOracleRunner = CSFeeOracle__factory.connect( - address.CS_FEE_ORACLE_ADDRESS, - fortaEthersProvider, - ) - - const registry = new promClient.Registry() - const m = new Metrics(registry, 'test_') - - const csFeeDistributorClient: ICSFeeDistributorClient = new ETHProvider( - logger, - m, - fortaEthersProvider, - csModuleRunner, - csAccountingRunner, - csFeeDistributorRunner, - csFeeOracleRunner, - ) - - const csFeeDistributorSrv = new CSFeeDistributorSrv( - logger, - csFeeDistributorClient, - getCSFeeDistributorEvents(address.CS_FEE_DISTRIBUTOR_ADDRESS), - address.CS_ACCOUNTING_ADDRESS, - address.CS_FEE_DISTRIBUTOR_ADDRESS, - address.LIDO_STETH_ADDRESS, - address.HASH_CONSENSUS_ADDRESS, - ) - - test( - 'πŸ”΅ INFO: DistributionDataUpdated', - async () => { - const txHash = '0x33a9fb726d09d543c417cb0985a41a7bee39e81e8536b5969784a520f4d2e0c1' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = await csFeeDistributorSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) -}) diff --git a/csm-alerts/src/services/CSFeeDistributor/__snapshots__/CSFeeDistributor.srv.spec.ts.snap b/csm-alerts/src/services/CSFeeDistributor/__snapshots__/CSFeeDistributor.srv.spec.ts.snap deleted file mode 100644 index 1a6af2969..000000000 --- a/csm-alerts/src/services/CSFeeDistributor/__snapshots__/CSFeeDistributor.srv.spec.ts.snap +++ /dev/null @@ -1,44 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`CsFeeDistributor event tests πŸ”΅ INFO: DistributionDataUpdated 1`] = ` -[ - { - "array": [ - "ethereum", - 1, - [], - 4, - "CSFEE-DISTRIBUTOR-DISTRIBUTION-DATA-UPDATED", - "πŸ”΅ CSFeeDistributor: Distribution data updated", - "Distribution data updated: -Total Claimable Shares: 2437078762437100387 -Tree Root: 0xcdd2290902bce8a93962c331e2d57ca30c754f366e1194de5448239763f5cf0f -Tree CID: QmPi5y1gyDoALFz1ZqwFMVDDEyPtDfFoeewvknfkbdobp6", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "2437078762437100387,0xcdd2290902bce8a93962c331e2d57ca30c754f366e1194de5448239763f5cf0f,QmPi5y1gyDoALFz1ZqwFMVDDEyPtDfFoeewvknfkbdobp6", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts deleted file mode 100644 index 9940e4127..000000000 --- a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.spec.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { DeploymentAddress, DeploymentAddresses } from '../../utils/constants.holesky' -import { expect } from '@jest/globals' -import { TransactionDto } from '../../entity/events' -import { - CSModule__factory, - CSAccounting__factory, - CSFeeDistributor__factory, - CSFeeOracle__factory, -} from '../../generated/typechain' -import { CSFeeOracleSrv, ICSFeeOracleClient } from './CSFeeOracle.srv' -import * as Winston from 'winston' -import { ETHProvider } from '../../clients/eth_provider' -import { ethers } from '@fortanetwork/forta-bot' -import { getFortaConfig } from 'forta-agent/dist/sdk/utils' -import promClient from 'prom-client' -import { Metrics } from '../../utils/metrics/metrics' -import { - getCSFeeOracleEvents, - getHashConsensusEvents, -} from '../../utils/events/cs_fee_oracle_events' - -const TEST_TIMEOUT = 120_000 // ms - -describe('CSFeeOracle and HashConsensus events tests', () => { - const chainId = 17000 - - const logger: Winston.Logger = Winston.createLogger({ - format: Winston.format.simple(), - transports: [new Winston.transports.Console()], - }) - - const address: DeploymentAddress = DeploymentAddresses - - const fortaEthersProvider = new ethers.providers.JsonRpcProvider( - getFortaConfig().jsonRpcUrl, - chainId, - ) - const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) - const csAccountingRunner = CSAccounting__factory.connect( - address.CS_ACCOUNTING_ADDRESS, - fortaEthersProvider, - ) - const csFeeDistributorRunner = CSFeeDistributor__factory.connect( - address.CS_FEE_DISTRIBUTOR_ADDRESS, - fortaEthersProvider, - ) - const csFeeOracleRunner = CSFeeOracle__factory.connect( - address.CS_FEE_ORACLE_ADDRESS, - fortaEthersProvider, - ) - - const registry = new promClient.Registry() - const m = new Metrics(registry, 'test_') - - const csFeeOracleClient: ICSFeeOracleClient = new ETHProvider( - logger, - m, - fortaEthersProvider, - csModuleRunner, - csAccountingRunner, - csFeeDistributorRunner, - csFeeOracleRunner, - ) - - const csFeeOracleSrv = new CSFeeOracleSrv( - logger, - csFeeOracleClient, - getHashConsensusEvents(address.HASH_CONSENSUS_ADDRESS), - getCSFeeOracleEvents(address.CS_FEE_ORACLE_ADDRESS), - address.HASH_CONSENSUS_ADDRESS, - address.CS_FEE_ORACLE_ADDRESS, - ) - - test( - 'πŸ”΅ CSFeeOracle: Processing Started, Report Settled', - async () => { - const txHash = '0xf53cfcc9e576393b481a1c8ff4d28235703b6b5b62f9edb623d913b5d059f9c5' - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = csFeeOracleSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(2) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ HashConsensus: FrameConfig Set', - async () => { - const txHash = '0xa6f4206ce30d66b378ab6e4ddef442ac4f29c95c5175fbb4a8944e6bec663724' - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const result = csFeeOracleSrv.handleTransaction(transactionDto) - - expect(result).toMatchSnapshot() - expect(result.length).toBe(1) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ HashConsensus: Member added, Quorum Set', - async () => { - const txHash = '0xdfcdbe0b9e795b2b83ad405c17b0c7326b00748cb3b11282a460c50b1f4588b0' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = csFeeOracleSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(2) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ HashConsensus: Member Removed, Quorum Set, Consensus Reached, Report Submitted', - async () => { - const txHash = '0xd22f8208b4bb2013a1113d68f9f19e3be13147c1f77ce811baa32ef082deed42' - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const result = csFeeOracleSrv.handleTransaction(transactionDto) - - expect(result).toMatchSnapshot() - expect(result.length).toBe(4) - }, - TEST_TIMEOUT, - ) - - test( - 'Empty findings', - async () => { - const txHash = '0x74ff368ba6ea748e19a7f0fefd9d0f708078176e56799dbe97d46ae59782ff9d' - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const result = csFeeOracleSrv.handleTransaction(transactionDto) - - expect(result.length).toBe(0) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ CSFeeOracle: Consensus Hash Contract Set, Consensus Version Set, FeeDistributor Contract Set, Perf Leeway Set', - async () => { - const txHash = '0xdc5ed949e5b30a5ff6f325cd718ba5a52a32dc7719d3fe7aaf9661cc3da7e9a6' - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const result = csFeeOracleSrv.handleTransaction(transactionDto) - - expect(result).toMatchSnapshot() - expect(result.length).toBe(4) - }, - TEST_TIMEOUT, - ) -}) diff --git a/csm-alerts/src/services/CSFeeOracle/__snapshots__/CSFeeOracle.srv.spec.ts.snap b/csm-alerts/src/services/CSFeeOracle/__snapshots__/CSFeeOracle.srv.spec.ts.snap deleted file mode 100644 index f08c168d3..000000000 --- a/csm-alerts/src/services/CSFeeOracle/__snapshots__/CSFeeOracle.srv.spec.ts.snap +++ /dev/null @@ -1,481 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`CSFeeOracle and HashConsensus events tests πŸ”΄ CSFeeOracle: Consensus Hash Contract Set, Consensus Version Set, FeeDistributor Contract Set, Perf Leeway Set 1`] = ` -[ - { - "array": [ - "ethereum", - 5, - [], - 4, - "CSFEE-ORACLE-CONSENSUS-HASH-CONTRACT-SET", - "🚨 CSFeeOracle: Consensus hash contract set", - "Consensus hash contract set to [0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37](https://etherscan.io/address/0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37), previous contract was [0x0000000000000000000000000000000000000000](https://etherscan.io/address/0x0000000000000000000000000000000000000000)", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37,0x0000000000000000000000000000000000000000", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 4, - [], - 4, - "CSFEE-ORACLE-CONSENSUS-VERSION-SET", - "πŸ”΄ CSFeeOracle: Consensus version set", - "Consensus version set to 1, previous version was 0", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "1,0", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 4, - [], - 4, - "CSFEE-ORACLE-FEE-DISTRIBUTOR-CONTRACT-SET", - "πŸ”΄ CSFeeOracle: New CSFeeDistributor set", - "New CSFeeDistributor contract set to [0xD7ba648C8F72669C6aE649648B516ec03D07c8ED](https://etherscan.io/address/0xD7ba648C8F72669C6aE649648B516ec03D07c8ED)", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0xD7ba648C8F72669C6aE649648B516ec03D07c8ED", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 4, - [], - 4, - "CSFEE-ORACLE-PERF-LEEWAY-SET", - "πŸ”΄ CSFeeOracle: Performance leeway updated", - "Performance leeway set to 500 basis points", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "500", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; - -exports[`CSFeeOracle and HashConsensus events tests πŸ”΄ HashConsensus: FrameConfig Set 1`] = ` -[ - { - "array": [ - "ethereum", - 4, - [], - 4, - "HASH-CONSENSUS-FRAME-CONFIG-SET", - "πŸ”΄ HashConsensus: Frame config set", - "Frame configuration set. New initial epoch: 48038396020868878, Epochs per frame: 1575", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "48038396020868878,1575", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; - -exports[`CSFeeOracle and HashConsensus events tests πŸ”΄ HashConsensus: Member Removed, Quorum Set, Consensus Reached, Report Submitted 1`] = ` -[ - { - "array": [ - "ethereum", - 4, - [], - 4, - "HASH-CONSENSUS-MEMBER-REMOVED", - "πŸ”΄ HashConsensus: Member removed", - "Member [0x4c75FA734a39f3a21C57e583c1c29942F021C6B7](https://etherscan.io/address/0x4c75FA734a39f3a21C57e583c1c29942F021C6B7) removed. Total members: 9, New quorum: 5", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0x4c75FA734a39f3a21C57e583c1c29942F021C6B7,9,5", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 4, - [], - 4, - "HASH-CONSENSUS-QUORUM-SET", - "πŸ”΄ HashConsensus: Quorum set", - "Quorum set to 5. Total members: 9, Previous quorum: 6", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "5,9,6", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 1, - [], - 4, - "HASH-CONSENSUS-REACHED", - "πŸ”΅ HashConsensus: Consensus reached, report received", - "Consensus reached for slot 2068159. Report hash: 0x3f42b4c85f55a07ab3f38c6c910871fd654fe9dfed64c9ff69e8ad4921fd487b, Support: 5", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "2068159,0x3f42b4c85f55a07ab3f38c6c910871fd654fe9dfed64c9ff69e8ad4921fd487b,5", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 1, - [], - 4, - "CSFEE-ORACLE-REPORT-SUBMITTED", - "πŸ”΅ CSFeeOracle: Report submitted", - "Report submitted for slot 2068159. Hash: 0x3f42b4c85f55a07ab3f38c6c910871fd654fe9dfed64c9ff69e8ad4921fd487b, Processing deadline time: 1721325108", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "2068159,0x3f42b4c85f55a07ab3f38c6c910871fd654fe9dfed64c9ff69e8ad4921fd487b,1721325108", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; - -exports[`CSFeeOracle and HashConsensus events tests πŸ”΄ HashConsensus: Member added, Quorum Set 1`] = ` -[ - { - "array": [ - "ethereum", - 4, - [], - 4, - "HASH-CONSENSUS-MEMBER-ADDED", - "πŸ”΄ HashConsensus: Member added", - "New member [0x4c75FA734a39f3a21C57e583c1c29942F021C6B7](https://etherscan.io/address/0x4c75FA734a39f3a21C57e583c1c29942F021C6B7) added. Total members: 10, New quorum: 6", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0x4c75FA734a39f3a21C57e583c1c29942F021C6B7,10,6", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 4, - [], - 4, - "HASH-CONSENSUS-QUORUM-SET", - "πŸ”΄ HashConsensus: Quorum set", - "Quorum set to 6. Total members: 10, Previous quorum: 5", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "6,10,5", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; - -exports[`CSFeeOracle and HashConsensus events tests πŸ”΅ CSFeeOracle: Processing Started, Report Settled 1`] = ` -[ - { - "array": [ - "ethereum", - 1, - [], - 4, - "CSFEE-ORACLE-PROCESSING-STARTED", - "πŸ”΅ CSFeeOracle: Processing started", - "Processing started for slot 2068159. Hash: 0x3f42b4c85f55a07ab3f38c6c910871fd654fe9dfed64c9ff69e8ad4921fd487b", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "2068159,0x3f42b4c85f55a07ab3f38c6c910871fd654fe9dfed64c9ff69e8ad4921fd487b", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 1, - [], - 4, - "CSFEE-ORACLE-REPORT-SETTLED", - "πŸ”΅ CSFeeOracle: Report settled", - "Report settled for slot 2068159. Distributed: 219882093527933929, Tree root: 0xfe5c8e3e617728bb0cd034313cc615f79ff7e93ff2e747b99d39b7e36a65b56a, Tree CID: QmV9AfsMa4zV3J1AjMhNuTQP4F18eV3uY5ihbVFcT5SkW6", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "2068159,219882093527933929,0xfe5c8e3e617728bb0cd034313cc615f79ff7e93ff2e747b99d39b7e36a65b56a,QmV9AfsMa4zV3J1AjMhNuTQP4F18eV3uY5ihbVFcT5SkW6", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts b/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts deleted file mode 100644 index 1922a8dd4..000000000 --- a/csm-alerts/src/services/CSModule/CSModule.srv.spec.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { DeploymentAddress, DeploymentAddresses } from '../../utils/constants.holesky' -import { expect } from '@jest/globals' -import { TransactionDto } from '../../entity/events' -import { - CSModule__factory, - CSAccounting__factory, - CSFeeDistributor__factory, - CSFeeOracle__factory, -} from '../../generated/typechain' -import { CSModuleSrv, ICSModuleClient } from './CSModule.srv' -import { getCSModuleEvents } from '../../utils/events/cs_module_events' -import * as Winston from 'winston' -import { ETHProvider } from '../../clients/eth_provider' -import { ethers } from '@fortanetwork/forta-bot' -import { getFortaConfig } from 'forta-agent/dist/sdk/utils' -import promClient from 'prom-client' -import { Metrics } from '../../utils/metrics/metrics' - -const TEST_TIMEOUT = 120_000 // ms - -describe('CSModule event tests', () => { - const chainId = 17000 - - const logger: Winston.Logger = Winston.createLogger({ - format: Winston.format.simple(), - transports: [new Winston.transports.Console()], - }) - - const address: DeploymentAddress = DeploymentAddresses - - const fortaEthersProvider = new ethers.providers.JsonRpcProvider( - getFortaConfig().jsonRpcUrl, - chainId, - ) - const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) - const csAccountingRunner = CSAccounting__factory.connect( - address.CS_ACCOUNTING_ADDRESS, - fortaEthersProvider, - ) - const csFeeDistributorRunner = CSFeeDistributor__factory.connect( - address.CS_FEE_DISTRIBUTOR_ADDRESS, - fortaEthersProvider, - ) - const csFeeOracleRunner = CSFeeOracle__factory.connect( - address.CS_FEE_ORACLE_ADDRESS, - fortaEthersProvider, - ) - - const registry = new promClient.Registry() - const m = new Metrics(registry, 'test_') - - const csModuleClient: ICSModuleClient = new ETHProvider( - logger, - m, - fortaEthersProvider, - csModuleRunner, - csAccountingRunner, - csFeeDistributorRunner, - csFeeOracleRunner, - ) - - const csModuleSrv = new CSModuleSrv( - logger, - csModuleClient, - address.CS_MODULE_ADDRESS, - address.STAKING_ROUTER_ADDRESS, - getCSModuleEvents(address.CS_MODULE_ADDRESS), - ) - - test( - '🟠 CSModule: Target limit mode changed', - async () => { - const txHash = '0xd8bb4389a056be70fe20e3b6b903c3e7cdbf053610bd8d647c4e2fe49c94f8b6' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = await csModuleSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΄ CSModule: EL Rewards stealing penalty reported', - async () => { - const txHash = '0x45d08822a9e025d374ab182612a119d837a0869b0c343379025303f53c4c63be' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = await csModuleSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) - - test( - 'πŸ”΅ CSModule: Notable Node Operator creation', - async () => { - const txHash = '0x87ece6668905293fd00c7eeff15ff685ed1d10810bc5cbba204f0881ab877be6' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = await csModuleSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(1) - }, - TEST_TIMEOUT, - ) -}) diff --git a/csm-alerts/src/services/CSModule/__snapshots__/CSModule.srv.spec.ts.snap b/csm-alerts/src/services/CSModule/__snapshots__/CSModule.srv.spec.ts.snap deleted file mode 100644 index b17943876..000000000 --- a/csm-alerts/src/services/CSModule/__snapshots__/CSModule.srv.spec.ts.snap +++ /dev/null @@ -1,108 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`CSModule event tests πŸ”΄ CSModule: EL Rewards stealing penalty reported 1`] = ` -[ - { - "array": [ - "ethereum", - 4, - [], - 4, - "CS-MODULE-EL-REWARDS-STEALING-PENALTY-REPORTED", - "πŸ”΄ CSModule: EL Rewards stealing penalty reported", - "EL Rewards stealing penalty reported for Node Operator #37 with 0.004 ETH potentially stolen", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "37,0x9abf3544139d770248221e34fc90b40d9d2d526c7ae1638dc482bbcfae213c3b,3570000000000000", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; - -exports[`CSModule event tests πŸ”΅ CSModule: Notable Node Operator creation 1`] = ` -[ - { - "array": [ - "ethereum", - 1, - , - 4, - "CS-MODULE-NOTABLE-NODE-OPERATOR-CREATION", - "πŸ”΅ CSModule: Notable Node Operator creation", - "Operator #69 was created.", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": null, - }, -] -`; - -exports[`CSModule event tests 🟠 CSModule: Target limit mode changed 1`] = ` -[ - { - "array": [ - "ethereum", - 3, - [], - 4, - "CS-MODULE-TARGET-LIMIT-MODE-CHANGED", - "🟠 CSModule: Target limit mode changed", - "Target limit mode: 2 (forced mode)", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "3,2,5", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; diff --git a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.spec.ts b/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.spec.ts deleted file mode 100644 index 7abae91ea..000000000 --- a/csm-alerts/src/services/EventsWatcher/EventsWatcher.srv.spec.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { - CONTRACTS_WITH_ASSET_RECOVERER, - CSM_PROXY_CONTRACTS, - DeploymentAddress, - DeploymentAddresses, - PAUSABLE_CONTRACTS, - ROLES_MONITORING_CONTRACTS, -} from '../../utils/constants.holesky' -import { expect } from '@jest/globals' -import { TransactionDto } from '../../entity/events' -import { - CSModule__factory, - CSAccounting__factory, - CSFeeDistributor__factory, - CSFeeOracle__factory, -} from '../../generated/typechain' -import { getOssifiedProxyEvents } from '../../utils/events/ossified_proxy_events' -import { getPausableEvents } from '../../utils/events/pausable_events' -import { getAssetRecovererEvents } from '../../utils/events/asset_recoverer_events' -import { getRolesMonitoringEvents } from '../../utils/events/roles_monitoring_events' -import { ProxyWatcherSrv, IProxyWatcherClient } from './ProxyWatcher.srv' -import * as Winston from 'winston' -import { ETHProvider } from '../../clients/eth_provider' -import { ethers } from '@fortanetwork/forta-bot' -import { getFortaConfig } from 'forta-agent/dist/sdk/utils' -import promClient from 'prom-client' -import { Metrics } from '../../utils/metrics/metrics' - -const TEST_TIMEOUT = 120_000 // ms - -describe('ProxyWatcher event tests', () => { - const chainId = 17000 - - const logger: Winston.Logger = Winston.createLogger({ - format: Winston.format.simple(), - transports: [new Winston.transports.Console()], - }) - - const address: DeploymentAddress = DeploymentAddresses - - const fortaEthersProvider = new ethers.providers.JsonRpcProvider( - getFortaConfig().jsonRpcUrl, - chainId, - ) - const csModuleRunner = CSModule__factory.connect(address.CS_MODULE_ADDRESS, fortaEthersProvider) - const csAccountingRunner = CSAccounting__factory.connect( - address.CS_ACCOUNTING_ADDRESS, - fortaEthersProvider, - ) - const csFeeDistributorRunner = CSFeeDistributor__factory.connect( - address.CS_FEE_DISTRIBUTOR_ADDRESS, - fortaEthersProvider, - ) - const csFeeOracleRunner = CSFeeOracle__factory.connect( - address.CS_FEE_ORACLE_ADDRESS, - fortaEthersProvider, - ) - - const registry = new promClient.Registry() - const m = new Metrics(registry, 'test_') - - const proxyWatcherClient: IProxyWatcherClient = new ETHProvider( - logger, - m, - fortaEthersProvider, - csModuleRunner, - csAccountingRunner, - csFeeDistributorRunner, - csFeeOracleRunner, - ) - - const proxyWatcherSrv = new ProxyWatcherSrv( - logger, - proxyWatcherClient, - getOssifiedProxyEvents(CSM_PROXY_CONTRACTS), - getPausableEvents(PAUSABLE_CONTRACTS), - getAssetRecovererEvents(CONTRACTS_WITH_ASSET_RECOVERER), - getRolesMonitoringEvents(ROLES_MONITORING_CONTRACTS), - ) - - test( - '🚨 Proxy Watcher: Admin Changed', - async () => { - const txHash = '0x92410350f567757d8f73b2f4b3670454af3899d095103ea0e745c92714673277' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = proxyWatcherSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(4) - }, - TEST_TIMEOUT, - ) - - test( - '🚨 Proxy Watcher: Implementation Upgraded', - async () => { - const txHash = '0x262faac95560f7fc0c831580d17e48daa69b17831b798e0b00bc43168a310c52' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = proxyWatcherSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(4) - }, - TEST_TIMEOUT, - ) - - test( - '🚨 Proxy Watcher: Paused', - async () => { - const txHash = '0x56a49219b4e40d146c0dc11d795b6d43696947f0ceb63fad7e9b820eab2b3e14' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = proxyWatcherSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(3) - }, - TEST_TIMEOUT, - ) - - test( - '🚨 Proxy Watcher: Resumed', - async () => { - const txHash = '0xa44ac96956f254fe1b9d6ff0a60ad2b5b4a7eaff951eb98150c0f7bbe90dc5df' - - const trx = await fortaEthersProvider.getTransaction(txHash) - const receipt = await trx.wait() - - const transactionDto: TransactionDto = { - logs: receipt.logs, - to: trx.to ? trx.to : null, - block: { - timestamp: trx.timestamp ? trx.timestamp : new Date().getTime(), - number: trx.blockNumber ? trx.blockNumber : 1, - }, - hash: trx.hash, - } - - const results = proxyWatcherSrv.handleTransaction(transactionDto) - - expect(results).toMatchSnapshot() - expect(results.length).toBe(3) - }, - TEST_TIMEOUT, - ) -}) diff --git a/csm-alerts/src/services/EventsWatcher/__snapshots__/ProxyWatcher.srv.spec.ts.snap b/csm-alerts/src/services/EventsWatcher/__snapshots__/ProxyWatcher.srv.spec.ts.snap deleted file mode 100644 index 4224745f9..000000000 --- a/csm-alerts/src/services/EventsWatcher/__snapshots__/ProxyWatcher.srv.spec.ts.snap +++ /dev/null @@ -1,511 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ProxyWatcher event tests 🚨 Proxy Watcher: Admin Changed 1`] = ` -[ - { - "array": [ - "ethereum", - 5, - [], - 4, - "PROXY-ADMIN-CHANGED", - "🚨 CSModule: Admin Changed", - "The proxy admin for CSModule(0x4562c3e63c2e586cD1651B958C22F88135aCAd4f) has been changed from [0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164](https://etherscan.io/address/0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164) to [0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d](https://etherscan.io/address/0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d)", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164,0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 5, - [], - 4, - "PROXY-ADMIN-CHANGED", - "🚨 CSAccounting: Admin Changed", - "The proxy admin for CSAccounting(0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1) has been changed from [0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164](https://etherscan.io/address/0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164) to [0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d](https://etherscan.io/address/0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d)", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164,0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 5, - [], - 4, - "PROXY-ADMIN-CHANGED", - "🚨 CSFeeDistributor: Admin Changed", - "The proxy admin for CSFeeDistributor(0xD7ba648C8F72669C6aE649648B516ec03D07c8ED) has been changed from [0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164](https://etherscan.io/address/0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164) to [0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d](https://etherscan.io/address/0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d)", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164,0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 5, - [], - 4, - "PROXY-ADMIN-CHANGED", - "🚨 CSFeeOracle: Admin Changed", - "The proxy admin for CSFeeOracle(0xaF57326C7d513085051b50912D51809ECC5d98Ee) has been changed from [0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164](https://etherscan.io/address/0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164) to [0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d](https://etherscan.io/address/0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d)", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164,0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; - -exports[`ProxyWatcher event tests 🚨 Proxy Watcher: Implementation Upgraded 1`] = ` -[ - { - "array": [ - "ethereum", - 5, - [], - 4, - "PROXY-UPGRADED", - "🚨 CSModule: Implementation Upgraded", - "The proxy implementation has been upgraded to 0x4d70efa74ec0ac3a5f759cc0f714c94cbc5cc4da", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0x4D70efa74ec0Ac3a5f759cC0F714c94CBc5cc4da", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 5, - [], - 4, - "PROXY-UPGRADED", - "🚨 CSAccounting: Implementation Upgraded", - "The proxy implementation has been upgraded to 0x4d70efa74ec0ac3a5f759cc0f714c94cbc5cc4da", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0x4D70efa74ec0Ac3a5f759cC0F714c94CBc5cc4da", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 5, - [], - 4, - "PROXY-UPGRADED", - "🚨 CSFeeDistributor: Implementation Upgraded", - "The proxy implementation has been upgraded to 0x4d70efa74ec0ac3a5f759cc0f714c94cbc5cc4da", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0x4D70efa74ec0Ac3a5f759cC0F714c94CBc5cc4da", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 5, - [], - 4, - "PROXY-UPGRADED", - "🚨 CSFeeOracle: Implementation Upgraded", - "The proxy implementation has been upgraded to 0x4d70efa74ec0ac3a5f759cc0f714c94cbc5cc4da", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "0x4D70efa74ec0Ac3a5f759cC0F714c94CBc5cc4da", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; - -exports[`ProxyWatcher event tests 🚨 Proxy Watcher: Paused 1`] = ` -[ - { - "array": [ - "ethereum", - 5, - [], - 4, - "CSModule-PAUSED", - "🚨 CSModule: contract was paused", - "For 336 hours", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "1209600", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 5, - [], - 4, - "CSAccounting-PAUSED", - "🚨 CSAccounting: contract was paused", - "For 336 hours", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "1209600", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 5, - [], - 4, - "CSFeeOracle-PAUSED", - "🚨 CSFeeOracle: contract was paused", - "For 336 hours", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "1209600", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; - -exports[`ProxyWatcher event tests 🚨 Proxy Watcher: Resumed 1`] = ` -[ - { - "array": [ - "ethereum", - 5, - [], - 4, - "CSModule-UNPAUSED", - "🚨 CSModule: contract was resumed", - "Contract was resumed", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 5, - [], - 4, - "CSAccounting-UNPAUSED", - "🚨 CSAccounting: contract was resumed", - "Contract was resumed", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, - { - "array": [ - "ethereum", - 5, - [], - 4, - "CSFeeOracle-UNPAUSED", - "🚨 CSFeeOracle: contract was resumed", - "Contract was resumed", - , - , - [], - , - [], - [], - ], - "arrayIndexOffset_": -1, - "convertedPrimitiveFields_": {}, - "messageId_": undefined, - "pivot_": 1.7976931348623157e+308, - "wrappers_": { - "3": { - "arrClean": false, - "arr_": [], - "map_": { - "args": { - "key": "args", - "value": "", - "valueWrapper": undefined, - }, - }, - "valueCtor_": null, - }, - }, - }, -] -`; diff --git a/csm-alerts/tsconfig.json b/csm-alerts/tsconfig.json index 54a278c10..5549a8bc0 100644 --- a/csm-alerts/tsconfig.json +++ b/csm-alerts/tsconfig.json @@ -8,8 +8,6 @@ "exclude": [ "node_modules", "tests", - "dist", - "**/*spec.ts", - "**/*mock.ts" + "dist" ] } From 64ff3887c5888d114cc8a6763be07142bd821cdb Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:27:52 +0300 Subject: [PATCH 35/45] docs: update README --- csm-alerts/README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/csm-alerts/README.md b/csm-alerts/README.md index bb9c449a7..d6423a48f 100644 --- a/csm-alerts/README.md +++ b/csm-alerts/README.md @@ -28,7 +28,8 @@ 8. 🚨 CRITICAL: role change: VERIFIER_ROLE 9. 🚨 CRITICAL: role change: RECOVERER_ROLE 2. **CSAccounting** - 1. General 3. 🟒 LOW: sharesOf(CSAccounting.address) - CSBondCoreStorage.totalBondShares > 0.1 ether + 1. General + 1. 🟒 LOW: sharesOf(CSAccounting.address) - CSBondCoreStorage.totalBondShares > 0.1 ether 2. Events monitoring 1. 🚨 CRITICAL: ChargePenaltyRecipientSet(address chargeRecipient) 2. 🚨 CRITICAL: BondCurveUpdated(uint256 indexed curveId, uint256[] bondCurve) @@ -69,7 +70,8 @@ 6. πŸ”΄ HIGH: ReportProcessorSet(address indexed processor, address indexed prevProcessor) 7. πŸ”΄ HIGH: another report variant appeared (alternative hash) event ReportReceived(uint256 indexed refSlot, address indexed member, bytes32 report) 8. πŸ”΄ HIGH: ConsensusLost(uint256 indexed refSlot) - 9. πŸ”΅ INFO: ConsensusReached(uint256 indexed refSlot, bytes32 report, uint256 support) + 9. 🟑 MEDIUM: Sloppy oracle fast lane member + 10. πŸ”΅ INFO: ConsensusReached(uint256 indexed refSlot, bytes32 report, uint256 support) 2. Roles monitoring 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE 2. 🚨 CRITICAL: DISABLE_CONSENSUS_ROLE @@ -128,6 +130,9 @@ 4. πŸ”΄ HIGH: ERC721Recovered() 5. πŸ”΄ HIGH: ERC1155Recovered() +9. **GateSeal** + 1. πŸ”΄ HIGH: CSM GateSeal expires soon (less than 3 months). + ## Deployment - Make sure you have uncommitted changes From 551d0d53453458d30aaa2050b0691b688d4a1c7e Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:32:35 +0300 Subject: [PATCH 36/45] chore: update icon --- csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts index 21178e257..b6ee4cfdc 100644 --- a/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts +++ b/csm-alerts/src/services/CSFeeOracle/CSFeeOracle.srv.ts @@ -141,7 +141,7 @@ export class CSFeeOracleSrv implements Service { if (event.args.refSlot !== lastReportedRefSlots[index]) { out.push( Finding.fromObject({ - name: 'πŸ”΄ CSM: Sloppy oracle fast lane member', + name: '🟑 CSM: Sloppy oracle fast lane member', description: `Member ${etherscanAddress(addr)} (${ORACLE_MEMBERS[addr] || 'unknown'}) ` + `was in the fast lane but did not report`, From d9955a7cf1d19d6a5b15380248ccc92ac94e01c1 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:21:58 +0300 Subject: [PATCH 37/45] feat: separate HashConsensus events with fixes --- .../EventsWatcher/events/hashconsensus.ts | 115 ++++++++++++++++++ .../services/EventsWatcher/events/index.ts | 1 + .../services/EventsWatcher/events/oracle.ts | 103 +--------------- 3 files changed, 117 insertions(+), 102 deletions(-) create mode 100644 csm-alerts/src/services/EventsWatcher/events/hashconsensus.ts diff --git a/csm-alerts/src/services/EventsWatcher/events/hashconsensus.ts b/csm-alerts/src/services/EventsWatcher/events/hashconsensus.ts new file mode 100644 index 000000000..505cd7310 --- /dev/null +++ b/csm-alerts/src/services/EventsWatcher/events/hashconsensus.ts @@ -0,0 +1,115 @@ +import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' + +import { HashConsensus__factory } from '../../../generated/typechain' +import * as HashConsensus from '../../../generated/typechain/HashConsensus' +import { EventOfNotice } from '../../../shared/types' +import { etherscanAddress } from '../../../utils/string' + +const IHashConsensus = HashConsensus__factory.createInterface() + +export function getHashConsensusEvents( + address: string, + knownMembers: { [key: string]: string }, +): EventOfNotice[] { + return [ + { + address, + abi: IHashConsensus.getEvent('MemberAdded').format('full'), + alertId: 'HASH-CONSENSUS-MEMBER-ADDED', + name: 'πŸ”΄ CSM HashConsensus: Member added', + description: (args: HashConsensus.MemberAddedEvent.OutputObject) => + `New member ${etherscanAddress(args.addr)} (${knownMembers[args.addr] ?? 'unknown'}) added\n` + + `Total members: ${args.newTotalMembers}\n` + + `New quorum: ${args.newQuorum}\n` + + `Contract: ${etherscanAddress(address)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('MemberRemoved').format('full'), + alertId: 'HASH-CONSENSUS-MEMBER-REMOVED', + name: 'πŸ”΄ CSM HashConsensus: Member removed', + description: (args: HashConsensus.MemberRemovedEvent.OutputObject) => + `Member ${etherscanAddress(args.addr)} (${knownMembers[args.addr] ?? 'unknown'}) removed\n` + + `Total members: ${args.newTotalMembers}\n` + + `New quorum: ${args.newQuorum}\n` + + `Contract: ${etherscanAddress(address)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('QuorumSet').format('full'), + alertId: 'HASH-CONSENSUS-QUORUM-SET', + name: 'πŸ”΄ CSM HashConsensus: Quorum set', + description: (args: HashConsensus.QuorumSetEvent.OutputObject) => + `Quorum set to ${args.newQuorum}.\n` + + `Total members: ${args.totalMembers}\n` + + `Previous quorum: ${args.prevQuorum}\n` + + `Contract: ${etherscanAddress(address)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('FastLaneConfigSet').format('full'), + alertId: 'HASH-CONSENSUS-FASTLANE-CONFIG-SET', + name: 'πŸ”΄ CSM HashConsensus: Fastlane config set', + description: (args: HashConsensus.FastLaneConfigSetEvent.OutputObject) => + `Fastlane configuration set with length slots: ${args.fastLaneLengthSlots}\n` + + `Contract: ${etherscanAddress(address)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('FrameConfigSet').format('full'), + alertId: 'HASH-CONSENSUS-FRAME-CONFIG-SET', + name: 'πŸ”΄ CSM HashConsensus: Frame config set', + description: (args: HashConsensus.FrameConfigSetEvent.OutputObject) => + `Frame configuration set:\n` + + `New initial epoch: ${args.newInitialEpoch}\n` + + `Epochs per frame: ${args.newEpochsPerFrame}\n` + + `Contract: ${etherscanAddress(address)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('ReportProcessorSet').format('full'), + alertId: 'HASH-CONSENSUS-REPORT-PROCESSOR-SET', + name: 'πŸ”΄ CSM HashConsensus: Report processor set', + description: (args: HashConsensus.ReportProcessorSetEvent.OutputObject) => + `Previous processor: ${etherscanAddress(args.prevProcessor)}\n` + + `Current processor: ${etherscanAddress(args.processor)}\n` + + `Contract: ${etherscanAddress(address)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('ConsensusLost').format('full'), + alertId: 'HASH-CONSENSUS-LOST', + name: 'πŸ”΄ CSM HashConsensus: Consensus lost', + description: (args: HashConsensus.ConsensusLostEvent.OutputObject) => + `Consensus lost for slot ${args.refSlot}\n` + + `Contract: ${etherscanAddress(address)}`, + severity: FindingSeverity.High, + type: FindingType.Info, + }, + { + address, + abi: IHashConsensus.getEvent('ConsensusReached').format('full'), + alertId: 'HASH-CONSENSUS-REACHED', + name: 'πŸ”΅ CSM HashConsensus: Consensus reached, report received', + description: (args: HashConsensus.ConsensusReachedEvent.OutputObject) => + `Consensus reached for slot ${args.refSlot}\n` + + `Report hash: ${args.report}\n` + + `Support: ${args.support}\n` + + `Contract: ${etherscanAddress(address)}`, + severity: FindingSeverity.Info, + type: FindingType.Info, + }, + ] +} diff --git a/csm-alerts/src/services/EventsWatcher/events/index.ts b/csm-alerts/src/services/EventsWatcher/events/index.ts index d62e3d3c4..dfff4d578 100644 --- a/csm-alerts/src/services/EventsWatcher/events/index.ts +++ b/csm-alerts/src/services/EventsWatcher/events/index.ts @@ -1,4 +1,5 @@ export * from './assetRecoverer' +export * from './hashconsensus' export * from './distributor' export * from './accounting' export * from './pausable' diff --git a/csm-alerts/src/services/EventsWatcher/events/oracle.ts b/csm-alerts/src/services/EventsWatcher/events/oracle.ts index 60de8bf5f..b8bf2dd97 100644 --- a/csm-alerts/src/services/EventsWatcher/events/oracle.ts +++ b/csm-alerts/src/services/EventsWatcher/events/oracle.ts @@ -1,113 +1,12 @@ import { FindingSeverity, FindingType } from '@fortanetwork/forta-bot' -import { CSFeeOracle__factory, HashConsensus__factory } from '../../../generated/typechain' +import { CSFeeOracle__factory } from '../../../generated/typechain' import * as CSFeeOracle from '../../../generated/typechain/CSFeeOracle' -import * as HashConsensus from '../../../generated/typechain/HashConsensus' import { EventOfNotice } from '../../../shared/types' import { etherscanAddress } from '../../../utils/string' -const IHashConsensus = HashConsensus__factory.createInterface() const ICSFeeOracle = CSFeeOracle__factory.createInterface() -export function getHashConsensusEvents( - address: string, - knownMembers: { [key: string]: string }, -): EventOfNotice[] { - return [ - { - address, - abi: IHashConsensus.getEvent('MemberAdded').format('full'), - alertId: 'HASH-CONSENSUS-MEMBER-ADDED', - name: 'πŸ”΄ HashConsensus: Member added', - description: (args: HashConsensus.MemberAddedEvent.OutputObject) => - `New member ${etherscanAddress(args.addr)} (${knownMembers[args.addr] ?? 'unknown'}) added\n` + - `Total members: ${args.newTotalMembers}\n` + - `New quorum: ${args.newQuorum}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('MemberRemoved').format('full'), - alertId: 'HASH-CONSENSUS-MEMBER-REMOVED', - name: 'πŸ”΄ HashConsensus: Member removed', - description: (args: HashConsensus.MemberRemovedEvent.OutputObject) => - `Member ${etherscanAddress(args.addr)} (${knownMembers[args.addr] ?? 'unknown'}) removed\n` + - `Total members: ${args.newTotalMembers}\n` + - `New quorum: ${args.newQuorum}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('QuorumSet').format('full'), - alertId: 'HASH-CONSENSUS-QUORUM-SET', - name: 'πŸ”΄ HashConsensus: Quorum set', - description: (args: HashConsensus.QuorumSetEvent.OutputObject) => - `Quorum set to ${args.newQuorum}.\n` + - `Total members: ${args.totalMembers}\n` + - `Previous quorum: ${args.prevQuorum}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('FastLaneConfigSet').format('full'), - alertId: 'HASH-CONSENSUS-FASTLANE-CONFIG-SET', - name: 'πŸ”΄ HashConsensus: Fastlane config set', - description: (args: HashConsensus.FastLaneConfigSetEvent.OutputObject) => - `Fastlane configuration set with length slots: ${args.fastLaneLengthSlots}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('FrameConfigSet').format('full'), - alertId: 'HASH-CONSENSUS-FRAME-CONFIG-SET', - name: 'πŸ”΄ HashConsensus: Frame config set', - description: (args: HashConsensus.FrameConfigSetEvent.OutputObject) => - `Frame configuration set:\n` + - `New initial epoch: ${args.newInitialEpoch}\n` + - `Epochs per frame: ${args.newEpochsPerFrame}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('ReportProcessorSet').format('full'), - alertId: 'HASH-CONSENSUS-REPORT-PROCESSOR-SET', - name: 'πŸ”΄ HashConsensus: Report processor set', - description: (args: HashConsensus.ReportProcessorSetEvent.OutputObject) => - `Previous processor: ${etherscanAddress(args.prevProcessor)}\n` + - `Current processor: ${etherscanAddress(args.processor)}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('ConsensusLost').format('full'), - alertId: 'HASH-CONSENSUS-LOST', - name: 'πŸ”΄ HashConsensus: Consensus lost', - description: (args: HashConsensus.ConsensusLostEvent.OutputObject) => - `Consensus lost for slot ${args.refSlot}`, - severity: FindingSeverity.High, - type: FindingType.Info, - }, - { - address, - abi: IHashConsensus.getEvent('ConsensusReached').format('full'), - alertId: 'HASH-CONSENSUS-REACHED', - name: 'πŸ”΅ HashConsensus: Consensus reached, report received', - description: (args: HashConsensus.ConsensusReachedEvent.OutputObject) => - `Consensus reached for slot ${args.refSlot}\n` + - `Report hash: ${args.report}\n` + - `Support: ${args.support}`, - severity: FindingSeverity.Info, - type: FindingType.Info, - }, - ] -} - export function getCSFeeOracleEvents(address: string): EventOfNotice[] { return [ { From eb328dc83ccf3c15ed2e7ddb577a1fb0edd5b558 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:22:24 +0300 Subject: [PATCH 38/45] fix: update mainnet ORACLE_MEMBERS --- csm-alerts/src/services/constants.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/csm-alerts/src/services/constants.ts b/csm-alerts/src/services/constants.ts index 07c86b6a8..084bb8c27 100644 --- a/csm-alerts/src/services/constants.ts +++ b/csm-alerts/src/services/constants.ts @@ -35,7 +35,8 @@ export const ORACLE_MEMBERS: { [key: string]: string } = { '0x007DE4a5F7bc37E2F26c0cb2E8A95006EE9B89b5': 'P2P', '0xc79F702202E3A6B0B6310B537E786B9ACAA19BAf': 'Chainlayer', '0x61c91ECd902EB56e314bB2D5c5C07785444Ea1c8': 'bloXroute', - '0x1Ca0fEC59b86F549e1F1184d97cb47794C8Af58d': 'Instadapp', + '0x1Ca0fEC59b86F549e1F1184d97cb47794C8Af58d': 'Instadapp', // Revoked one. + '0x73181107c8D9ED4ce0bbeF7A0b4ccf3320C41d12': 'Instadapp', '0xe57B3792aDCc5da47EF4fF588883F0ee0c9835C9': 'MatrixedLink', '0xA7410857ABbf75043d61ea54e07D57A6EB6EF186': 'Kyber Network', } From e06305cfaf1c4a46c60829149c00c98caa160e4c Mon Sep 17 00:00:00 2001 From: Don Perignom <10616301+madlabman@users.noreply.github.com> Date: Wed, 23 Oct 2024 11:07:38 +0200 Subject: [PATCH 39/45] chore: apply suggestions from code review Co-authored-by: Dmitry Gusakov --- csm-alerts/src/services/CSModule/CSModule.srv.ts | 2 +- .../services/EventsWatcher/events/assetRecoverer.ts | 2 +- .../src/services/EventsWatcher/events/hashconsensus.ts | 2 +- csm-alerts/src/services/EventsWatcher/events/module.ts | 10 +++++----- csm-alerts/src/services/EventsWatcher/events/oracle.ts | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.ts b/csm-alerts/src/services/CSModule/CSModule.srv.ts index 7c31a18cc..bb5707393 100644 --- a/csm-alerts/src/services/CSModule/CSModule.srv.ts +++ b/csm-alerts/src/services/CSModule/CSModule.srv.ts @@ -246,7 +246,7 @@ export class CSModuleSrv implements Service { if (now - this.lastFiredAt.tooManyValidators > SECONDS_PER_DAY) { if (validatorsInQueue > QUEUE_VALIDATORS_MAX) { const f = Finding.fromObject({ - name: '🟒 CSModule: Too many validators in the queue.', + name: '🟒 CSModule: Significant number of validator keys in the queue.', description: `There's ${validatorsInQueue} keys waiting for deposit in CSM.`, alertId: 'CS-MODULE-TOO-MANY-VALIDATORS-IN-THE-QUEUE', // NOTE: Do not include the source to reach quorum. diff --git a/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts b/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts index 8516ea703..2aabc35a0 100644 --- a/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts +++ b/csm-alerts/src/services/EventsWatcher/events/assetRecoverer.ts @@ -68,7 +68,7 @@ export function getAssetRecovererEvents( address: contract.address, abi: IAssetRecoverer.getEvent('StETHSharesRecovered').format('full'), alertId: 'ASSET-RECOVERER-STETH-SHARES-RECOVERED', - name: 'πŸ”΄ AssetRecoverer: StETH Shares recovered', + name: 'πŸ”΄ AssetRecoverer: stETH Shares recovered', description: (args: AssetRecoverer.StETHSharesRecoveredEvent.OutputObject) => `StETH Shares recovered on ${contract.name}:\n` + `Recipient: ${etherscanAddress(args.recipient)}\n` + diff --git a/csm-alerts/src/services/EventsWatcher/events/hashconsensus.ts b/csm-alerts/src/services/EventsWatcher/events/hashconsensus.ts index 505cd7310..bc909e448 100644 --- a/csm-alerts/src/services/EventsWatcher/events/hashconsensus.ts +++ b/csm-alerts/src/services/EventsWatcher/events/hashconsensus.ts @@ -102,7 +102,7 @@ export function getHashConsensusEvents( address, abi: IHashConsensus.getEvent('ConsensusReached').format('full'), alertId: 'HASH-CONSENSUS-REACHED', - name: 'πŸ”΅ CSM HashConsensus: Consensus reached, report received', + name: 'πŸ”΅ CSM HashConsensus: Consensus reached', description: (args: HashConsensus.ConsensusReachedEvent.OutputObject) => `Consensus reached for slot ${args.refSlot}\n` + `Report hash: ${args.report}\n` + diff --git a/csm-alerts/src/services/EventsWatcher/events/module.ts b/csm-alerts/src/services/EventsWatcher/events/module.ts index 327c5b42e..b2f09cd30 100644 --- a/csm-alerts/src/services/EventsWatcher/events/module.ts +++ b/csm-alerts/src/services/EventsWatcher/events/module.ts @@ -14,7 +14,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { abi: ICSModule.getEvent('PublicRelease').format('full'), alertId: 'CS-MODULE-PUBLIC-RELEASE', name: 'πŸ”΅ CSModule: Public release', - description: () => 'CSM public release is activated! πŸ₯³', + description: () => 'CSM public release has been activated! πŸ₯³', severity: FindingSeverity.Info, type: FindingType.Info, }, @@ -52,7 +52,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { description: (args: CSModule.ELRewardsStealingPenaltyReportedEvent.OutputObject) => `EL Rewards stealing penalty reported for Node Operator #${args.nodeOperatorId} ` + `with ${formatEther(args.stolenAmount)} potentially stolen`, - severity: FindingSeverity.High, + severity: FindingSeverity.Info, type: FindingType.Info, }, { @@ -62,7 +62,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { name: 'πŸ”΄ CSModule: EL Rewards stealing penalty cancelled', description: (args: CSModule.ELRewardsStealingPenaltyCancelledEvent.OutputObject) => `EL Rewards stealing penalty (${formatEther(args.amount)}) cancelled for Node Operator #${args.nodeOperatorId}`, - severity: FindingSeverity.High, + severity: FindingSeverity.Info, type: FindingType.Info, }, { @@ -72,7 +72,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { name: 'πŸ”΄ CSModule: EL Rewards stealing penalty settled', description: (args: CSModule.ELRewardsStealingPenaltySettledEvent.OutputObject) => `EL Rewards stealing penalty settled for Node Operator #${args.nodeOperatorId}`, - severity: FindingSeverity.High, + severity: FindingSeverity.Info, type: FindingType.Info, }, { @@ -82,7 +82,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { name: 'πŸ”΄ CSModule: EL Rewards stealing penalty compensated', description: (args: CSModule.ELRewardsStealingPenaltyCompensatedEvent.OutputObject) => `${formatEther(args.amount)} of EL Rewards stealing penalty was compensated for Node Operator #${args.nodeOperatorId}`, - severity: FindingSeverity.High, + severity: FindingSeverity.Info, type: FindingType.Info, }, ] diff --git a/csm-alerts/src/services/EventsWatcher/events/oracle.ts b/csm-alerts/src/services/EventsWatcher/events/oracle.ts index b8bf2dd97..b7a82e06d 100644 --- a/csm-alerts/src/services/EventsWatcher/events/oracle.ts +++ b/csm-alerts/src/services/EventsWatcher/events/oracle.ts @@ -54,7 +54,7 @@ export function getCSFeeOracleEvents(address: string): EventOfNotice[] { address, abi: ICSFeeOracle.getEvent('WarnProcessingMissed').format('full'), alertId: 'CSFEE-ORACLE-PROCESSING-MISSED', - name: 'πŸ”΅ CSFeeOracle: Processing missed', + name: 'πŸ”΄ CSFeeOracle: Processing missed', description: (args: CSFeeOracle.WarnProcessingMissedEvent.OutputObject) => `Processing missed for slot ${args.refSlot}`, severity: FindingSeverity.High, From d2fa8e1e714b44c917ec4e68e7cb2bc79b9f829f Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 23 Oct 2024 12:14:42 +0300 Subject: [PATCH 40/45] chore: upd finding icons --- csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts | 6 +++--- csm-alerts/src/services/CSModule/CSModule.srv.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts index ed671f7c3..f463b279d 100644 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts @@ -16,7 +16,7 @@ import { SECONDS_PER_DAY, WEI_PER_ETH } from '../../shared/constants' import { Service } from '../../shared/types' import { sourceFromEvent } from '../../utils/findings' import { RedefineMode, requireWithTier } from '../../utils/require' -import { etherscanAddress } from '../../utils/string' +import { etherscanAddress, formatShares } from '../../utils/string' import * as Constants from '../constants' const { DEPLOYED_ADDRESSES } = requireWithTier( @@ -75,8 +75,8 @@ export class CSAccountingSrv implements Service { if (now - this.lastFiredAt.accountingExcessShares > SECONDS_PER_DAY) { if (diff > ACCOUNTING_BALANCE_EXCESS_SHARES_MAX) { const f = Finding.fromObject({ - name: `🟒 Shares to recover on CSAccounting.`, - description: `There's a valuable amount of shares to recover on CSAccounting.`, + name: `🫧 Shares to recover on CSAccounting.`, + description: `There's more than ${formatShares(ACCOUNTING_BALANCE_EXCESS_SHARES_MAX)} to recover on CSAccounting.`, alertId: 'CS-ACCOUNTING-EXCESS-SHARES', // NOTE: Do not include the source to reach quorum. // source: sourceFromEvent(blockEvent), diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.ts b/csm-alerts/src/services/CSModule/CSModule.srv.ts index bb5707393..3e8ad6c87 100644 --- a/csm-alerts/src/services/CSModule/CSModule.srv.ts +++ b/csm-alerts/src/services/CSModule/CSModule.srv.ts @@ -156,7 +156,7 @@ export class CSModuleSrv implements Service { if (now - this.lastFiredAt.moduleShareIsCloseToTargetShare > SECONDS_PER_DAY * 7) { if (percentUsed > TARGET_SHARE_USED_PERCENT_MAX) { const f = Finding.fromObject({ - name: `🟒 CSModule: Module's share is close to the target share.`, + name: `🫧CSModule: Module's share is close to the target share.`, description: `The module's share is close to the target share (${percentUsed}% utilization). Current share is ${(Number(csmCurrentShareBP * 100n) / Number(BASIS_POINT_MUL)).toFixed(2)}%. Target share is ${(Number(csmTargetShareBP * 100n) / Number(BASIS_POINT_MUL)).toFixed(2)}%`, alertId: 'CS-MODULE-CLOSE-TO-TARGET-SHARE', // NOTE: Do not include the source to reach quorum. @@ -230,7 +230,7 @@ export class CSModuleSrv implements Service { if (now - this.lastFiredAt.tooManyEmptyBatches > SECONDS_PER_DAY) { if (emptyBatchCount > QUEUE_EMPTY_BATCHES_MAX) { const f = Finding.fromObject({ - name: `🟒 CSModule: Too many empty batches in the deposit queue.`, + name: `🫧CSModule: Too many empty batches in the deposit queue.`, description: `More than ${QUEUE_EMPTY_BATCHES_MAX} empty batches in the deposit queue.`, alertId: 'CS-MODULE-TOO-MANY-EMPTY-BATCHES-IN-THE-QUEUE', // NOTE: Do not include the source to reach quorum. @@ -246,7 +246,7 @@ export class CSModuleSrv implements Service { if (now - this.lastFiredAt.tooManyValidators > SECONDS_PER_DAY) { if (validatorsInQueue > QUEUE_VALIDATORS_MAX) { const f = Finding.fromObject({ - name: '🟒 CSModule: Significant number of validator keys in the queue.', + name: '🫧SModule: Significant number of validator keys in the queue.', description: `There's ${validatorsInQueue} keys waiting for deposit in CSM.`, alertId: 'CS-MODULE-TOO-MANY-VALIDATORS-IN-THE-QUEUE', // NOTE: Do not include the source to reach quorum. From 3655b8d40ebead53ce87d8064626346e79d4fce9 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 23 Oct 2024 12:14:52 +0300 Subject: [PATCH 41/45] docs: update README --- csm-alerts/README.md | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/csm-alerts/README.md b/csm-alerts/README.md index d6423a48f..9874fb546 100644 --- a/csm-alerts/README.md +++ b/csm-alerts/README.md @@ -9,11 +9,11 @@ 1. **CSModule** 1. General - 1. πŸ”΄ HIGH: EL rewards stealing penalty reported/settled/cancelled for an operator. - 2. 🟠 MEDIUM: targetLimitMode was set for an operator. - 3. 🟒 LOW: Module's share is close to the targetShare. - 4. 🟒 LOW: More than N "empty" batches in the queue. (N = 30) - 5. 🟒 LOW: More than N validators in the queue. (N = 200) + 1. 🟠 MEDIUM: targetLimitMode was set for an operator. + 2. 🫧 LOW: Module's share is close to the targetShare. + 3. 🫧 LOW: More than N "empty" batches in the queue. (N = 30) + 4. 🫧 LOW: More than N validators in the queue. (N = 200) + 5. πŸ”΅ INFO: EL rewards stealing penalty reported/settled/cancelled for an operator. 6. πŸ”΅ INFO: Operator X was unvetted. 7. πŸ”΅ INFO: Public release is activated. 8. πŸ”΅ INFO: Every 100 new operators created (69th as well). @@ -29,13 +29,14 @@ 9. 🚨 CRITICAL: role change: RECOVERER_ROLE 2. **CSAccounting** 1. General - 1. 🟒 LOW: sharesOf(CSAccounting.address) - CSBondCoreStorage.totalBondShares > 0.1 ether + 1. 🚨 CRITICAL: sharesOf(CSAccounting.address) < CSBondCoreStorage.totalBondShares + 2. 🫧 LOW: sharesOf(CSAccounting.address) - CSBondCoreStorage.totalBondShares > 0.1 ether 2. Events monitoring 1. 🚨 CRITICAL: ChargePenaltyRecipientSet(address chargeRecipient) 2. 🚨 CRITICAL: BondCurveUpdated(uint256 indexed curveId, uint256[] bondCurve) - 3. πŸ”΄ HIGH: BondCurveAdded(uint256[] bondCurve) - 4. πŸ”΄ HIGH: BondCurveSet(uint256 indexed nodeOperatorId, uint256 curveId) - 5. πŸ”΅ INFO: Approval(address owner, address spender, uint256 value) (stETH contract) + 3. 🚨 CRITICAL: Approval(address owner, address spender, uint256 value) of stETH from CSAccounting, unless to the Burner + 4. πŸ”΄ HIGH: BondCurveAdded(uint256[] bondCurve) + 5. πŸ”΄ HIGH: BondCurveSet(uint256 indexed nodeOperatorId, uint256 curveId) 3. Roles monitoring 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE 2. 🚨 CRITICAL: PAUSE_ROLE @@ -47,12 +48,12 @@ 8. 🚨 CRITICAL: RECOVERER_ROLE 3. **CSFeeOracle** 1. General - 1. 🚨 CRITICAL: ConsensusHashContractSet(address indexed addr, address indexed prevAddr) - 2. πŸ”΄ HIGH: PerfLeewaySet(uint256 valueBP) - 3. πŸ”΄ HIGH: FeeDistributorContractSet(address feeDistributorContract) + 1. 🚨 CRITICAL: FeeDistributorContractSet(address feeDistributorContract) + 2. 🚨 CRITICAL: ConsensusHashContractSet(address indexed addr, address indexed prevAddr) + 3. πŸ”΄ HIGH: PerfLeewaySet(uint256 valueBP) 4. πŸ”΄ HIGH: ConsensusVersionSet(uint256 indexed version, uint256 indexed prevVersion) - 5. πŸ”΅ INFO: WarnProcessingMissed(uint256 indexed refSlot) - 6. πŸ”΅ INFO: ReportSubmitted(uint256 indexed refSlot, bytes32 hash, uint256 processingDeadlineTime) + 5. 🫧 INFO: WarnProcessingMissed(uint256 indexed refSlot) + 6. 🫧 INFO: ReportSubmitted(uint256 indexed refSlot, bytes32 hash, uint256 processingDeadlineTime) 2. Roles monitoring 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE 2. 🚨 CRITICAL: CONTRACT_MANAGER_ROLE @@ -90,11 +91,7 @@ 1. 🚨 CRITICAL: DEFAULT_ADMIN_ROLE 2. 🚨 CRITICAL: RECOVERER_ROLE -5. **CSEarlyAdoption** - - - _To be added_ - -6. **OssifiableProxy** +5. **OssifiableProxy** For the following contracts: - CSModule @@ -106,7 +103,7 @@ 2. 🚨 CRITICAL: event Upgraded(address indexed implementation) 3. 🚨 CRITICAL: event AdminChanged(address previousAdmin, address newAdmin) -7. **PausableUntil** +6. **PausableUntil** For the following contracts: - CSModule @@ -116,7 +113,7 @@ 1. 🚨 CRITICAL: Paused(uint256 duration); 2. 🚨 CRITICAL: Resumed(); -8. **AssetRecoverer** +7. **AssetRecoverer** For the following contracts: - CSModule @@ -130,7 +127,7 @@ 4. πŸ”΄ HIGH: ERC721Recovered() 5. πŸ”΄ HIGH: ERC1155Recovered() -9. **GateSeal** +8. **GateSeal** 1. πŸ”΄ HIGH: CSM GateSeal expires soon (less than 3 months). ## Deployment From 3193111a4b0cc8c9fde53af9b85078b1ead3ff08 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Fri, 1 Nov 2024 12:47:02 +0100 Subject: [PATCH 42/45] fix: by-severity icons --- .../src/services/CSAccounting/CSAccounting.srv.ts | 2 +- .../src/services/EventsWatcher/events/module.ts | 10 +++++----- .../src/services/EventsWatcher/events/oracle.ts | 2 +- csm-alerts/src/utils/findings.ts | 15 --------------- 4 files changed, 7 insertions(+), 22 deletions(-) diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts index f463b279d..cb6219ee4 100644 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts @@ -119,7 +119,7 @@ export class CSAccountingSrv implements Service { event.args.spender !== DEPLOYED_ADDRESSES.BURNER ) { const f = Finding.fromObject({ - name: `πŸ”΄ Unexpected stETH approval from CSAccounting`, + name: `🚨 Unexpected stETH approval from CSAccounting`, description: `${etherscanAddress(event.args.spender)} received allowance from ` + `${etherscanAddress(event.args.owner)} for ${event.args.value} stETH`, diff --git a/csm-alerts/src/services/EventsWatcher/events/module.ts b/csm-alerts/src/services/EventsWatcher/events/module.ts index b2f09cd30..acec9d35a 100644 --- a/csm-alerts/src/services/EventsWatcher/events/module.ts +++ b/csm-alerts/src/services/EventsWatcher/events/module.ts @@ -22,7 +22,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { address: csmAddress, abi: ICSModule.getEvent('VettedSigningKeysCountDecreased').format('full'), alertId: 'CS-MODULE-VETTED-SIGNING-KEYS-DECREASED', - name: 'πŸ”΅ CSModule: Node Operator vetted signing keys decreased', + name: 'πŸ”΄ CSModule: Node Operator vetted signing keys decreased', description: (args: CSModule.VettedSigningKeysCountDecreasedEvent.OutputObject) => `Vetted signing keys decreased for Node Operator #${args.nodeOperatorId}`, severity: FindingSeverity.High, @@ -48,7 +48,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { address: csmAddress, abi: ICSModule.getEvent('ELRewardsStealingPenaltyReported').format('full'), alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-REPORTED', - name: 'πŸ”΄ CSModule: EL Rewards stealing penalty reported', + name: 'πŸ”΅ CSModule: EL Rewards stealing penalty reported', description: (args: CSModule.ELRewardsStealingPenaltyReportedEvent.OutputObject) => `EL Rewards stealing penalty reported for Node Operator #${args.nodeOperatorId} ` + `with ${formatEther(args.stolenAmount)} potentially stolen`, @@ -59,7 +59,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { address: csmAddress, abi: ICSModule.getEvent('ELRewardsStealingPenaltyCancelled').format('full'), alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-CANCELLED', - name: 'πŸ”΄ CSModule: EL Rewards stealing penalty cancelled', + name: 'πŸ”΅ CSModule: EL Rewards stealing penalty cancelled', description: (args: CSModule.ELRewardsStealingPenaltyCancelledEvent.OutputObject) => `EL Rewards stealing penalty (${formatEther(args.amount)}) cancelled for Node Operator #${args.nodeOperatorId}`, severity: FindingSeverity.Info, @@ -69,7 +69,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { address: csmAddress, abi: ICSModule.getEvent('ELRewardsStealingPenaltySettled').format('full'), alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-SETTLED', - name: 'πŸ”΄ CSModule: EL Rewards stealing penalty settled', + name: 'πŸ”΅ CSModule: EL Rewards stealing penalty settled', description: (args: CSModule.ELRewardsStealingPenaltySettledEvent.OutputObject) => `EL Rewards stealing penalty settled for Node Operator #${args.nodeOperatorId}`, severity: FindingSeverity.Info, @@ -79,7 +79,7 @@ export function getCSModuleEvents(csmAddress: string): EventOfNotice[] { address: csmAddress, abi: ICSModule.getEvent('ELRewardsStealingPenaltyCompensated').format('full'), alertId: 'CS-MODULE-EL-REWARDS-STEALING-PENALTY-COMPENSATED', - name: 'πŸ”΄ CSModule: EL Rewards stealing penalty compensated', + name: 'πŸ”΅ CSModule: EL Rewards stealing penalty compensated', description: (args: CSModule.ELRewardsStealingPenaltyCompensatedEvent.OutputObject) => `${formatEther(args.amount)} of EL Rewards stealing penalty was compensated for Node Operator #${args.nodeOperatorId}`, severity: FindingSeverity.Info, diff --git a/csm-alerts/src/services/EventsWatcher/events/oracle.ts b/csm-alerts/src/services/EventsWatcher/events/oracle.ts index b7a82e06d..139c936ae 100644 --- a/csm-alerts/src/services/EventsWatcher/events/oracle.ts +++ b/csm-alerts/src/services/EventsWatcher/events/oracle.ts @@ -23,7 +23,7 @@ export function getCSFeeOracleEvents(address: string): EventOfNotice[] { address, abi: ICSFeeOracle.getEvent('FeeDistributorContractSet').format('full'), alertId: 'CSFEE-ORACLE-FEE-DISTRIBUTOR-CONTRACT-SET', - name: 'πŸ”΄ CSFeeOracle: New CSFeeDistributor set', + name: '🚨 CSFeeOracle: New CSFeeDistributor set', description: (args: CSFeeOracle.FeeDistributorContractSetEvent.OutputObject) => `New CSFeeDistributor contract set to ${etherscanAddress(args.feeDistributorContract)}`, severity: FindingSeverity.Critical, diff --git a/csm-alerts/src/utils/findings.ts b/csm-alerts/src/utils/findings.ts index 19ff9c08d..9a50f457f 100644 --- a/csm-alerts/src/utils/findings.ts +++ b/csm-alerts/src/utils/findings.ts @@ -56,18 +56,3 @@ export function errorAlert(name: string, err: string | Error | undefined): Findi }, }) } - -export function failedTxAlert( - txEvent: TransactionEvent, - description: string, - reason: string, -): Finding { - return Finding.fromObject({ - name: `🟣 CRITICAL: ${reason}`, - description: `Transaction reverted. ${description}`, - alertId: `CSFEE-${toKebabCase(reason)}`, - source: sourceFromEvent(txEvent), - severity: FindingSeverity.Critical, - type: FindingType.Info, - }) -} From e51abfa51627cf6eaffca629c629b001bda7e0f1 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Wed, 6 Nov 2024 22:21:42 +0700 Subject: [PATCH 43/45] chore: missing C --- csm-alerts/src/services/CSModule/CSModule.srv.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csm-alerts/src/services/CSModule/CSModule.srv.ts b/csm-alerts/src/services/CSModule/CSModule.srv.ts index 3e8ad6c87..e4bca69f7 100644 --- a/csm-alerts/src/services/CSModule/CSModule.srv.ts +++ b/csm-alerts/src/services/CSModule/CSModule.srv.ts @@ -246,7 +246,7 @@ export class CSModuleSrv implements Service { if (now - this.lastFiredAt.tooManyValidators > SECONDS_PER_DAY) { if (validatorsInQueue > QUEUE_VALIDATORS_MAX) { const f = Finding.fromObject({ - name: '🫧SModule: Significant number of validator keys in the queue.', + name: '🫧CSModule: Significant number of validator keys in the queue.', description: `There's ${validatorsInQueue} keys waiting for deposit in CSM.`, alertId: 'CS-MODULE-TOO-MANY-VALIDATORS-IN-THE-QUEUE', // NOTE: Do not include the source to reach quorum. From 63c81a20946bb5f96fc961fc8f3f7cabe6986f77 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Thu, 28 Nov 2024 19:21:41 +0800 Subject: [PATCH 44/45] chore: mask all the urls in errors --- csm-alerts/src/utils/findings.ts | 10 +++++----- csm-alerts/src/utils/string.ts | 4 ++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/csm-alerts/src/utils/findings.ts b/csm-alerts/src/utils/findings.ts index 9a50f457f..eed6893ac 100644 --- a/csm-alerts/src/utils/findings.ts +++ b/csm-alerts/src/utils/findings.ts @@ -7,7 +7,7 @@ import { } from '@fortanetwork/forta-bot' import { FindingSource } from '@fortanetwork/forta-bot/dist/findings/finding.source' -import { toKebabCase } from './string' +import { maskUrls, toKebabCase } from './string' import { APP_NAME } from '../config' import Version from './version' @@ -45,14 +45,14 @@ export function invariantAlert(event: BlockEvent | TransactionEvent, message: st export function errorAlert(name: string, err: string | Error | undefined): Finding { return Finding.fromObject({ name: name, - description: String(err), + description: maskUrls(String(err)), alertId: 'CODE-ERROR', severity: FindingSeverity.Unknown, type: FindingType.Degraded, metadata: { - stack: `${err instanceof Error ? err.stack : null}`, - message: `${err instanceof Error ? err.message : null}`, - name: `${err instanceof Error ? err.name : null}`, + stack: maskUrls(`${err instanceof Error ? err.stack : null}`), + message: maskUrls(`${err instanceof Error ? err.message : null}`), + name: maskUrls(`${err instanceof Error ? err.name : null}`), }, }) } diff --git a/csm-alerts/src/utils/string.ts b/csm-alerts/src/utils/string.ts index fc4e569d3..00c07b01d 100644 --- a/csm-alerts/src/utils/string.ts +++ b/csm-alerts/src/utils/string.ts @@ -25,3 +25,7 @@ export function formatEther(amount: bigint): string { export function ipfsLink(cid: string): string { return `[${cid}](https://ipfs.io/ipfs/${cid})` } + +export function maskUrls(msg: string): string { + return msg.replace(/https?:\/\/[^"\s]*/g, '***') +} From a7e53283cf139aa972881db5df20de41f50708d2 Mon Sep 17 00:00:00 2001 From: madlabman <10616301+madlabman@users.noreply.github.com> Date: Sun, 12 Jan 2025 12:36:05 +0100 Subject: [PATCH 45/45] feat: dirty multicall for accounting shares --- csm-alerts/src/abis/Multicall3.json | 1 + .../services/CSAccounting/CSAccounting.srv.ts | 39 ++++++++++++++++--- csm-alerts/src/services/constants.holesky.ts | 1 + csm-alerts/src/services/constants.ts | 2 + csm-alerts/src/shared/types.ts | 1 + 5 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 csm-alerts/src/abis/Multicall3.json diff --git a/csm-alerts/src/abis/Multicall3.json b/csm-alerts/src/abis/Multicall3.json new file mode 100644 index 000000000..8d6d7a956 --- /dev/null +++ b/csm-alerts/src/abis/Multicall3.json @@ -0,0 +1 @@ +[{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct Multicall3.Call[]","name":"calls","type":"tuple[]"}],"name":"aggregate","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes[]","name":"returnData","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"allowFailure","type":"bool"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct Multicall3.Call3[]","name":"calls","type":"tuple[]"}],"name":"aggregate3","outputs":[{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"internalType":"struct Multicall3.Result[]","name":"returnData","type":"tuple[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"allowFailure","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct Multicall3.Call3Value[]","name":"calls","type":"tuple[]"}],"name":"aggregate3Value","outputs":[{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"internalType":"struct Multicall3.Result[]","name":"returnData","type":"tuple[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct Multicall3.Call[]","name":"calls","type":"tuple[]"}],"name":"blockAndAggregate","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"internalType":"struct Multicall3.Result[]","name":"returnData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBasefee","outputs":[{"internalType":"uint256","name":"basefee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getBlockHash","outputs":[{"internalType":"bytes32","name":"blockHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlockNumber","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"chainid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockCoinbase","outputs":[{"internalType":"address","name":"coinbase","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockDifficulty","outputs":[{"internalType":"uint256","name":"difficulty","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockGasLimit","outputs":[{"internalType":"uint256","name":"gaslimit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getEthBalance","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastBlockHash","outputs":[{"internalType":"bytes32","name":"blockHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"requireSuccess","type":"bool"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct Multicall3.Call[]","name":"calls","type":"tuple[]"}],"name":"tryAggregate","outputs":[{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"internalType":"struct Multicall3.Result[]","name":"returnData","type":"tuple[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"requireSuccess","type":"bool"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct Multicall3.Call[]","name":"calls","type":"tuple[]"}],"name":"tryBlockAndAggregate","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"internalType":"struct Multicall3.Result[]","name":"returnData","type":"tuple[]"}],"stateMutability":"view","type":"function"}] diff --git a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts index cb6219ee4..2ad0f8b6a 100644 --- a/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts +++ b/csm-alerts/src/services/CSAccounting/CSAccounting.srv.ts @@ -10,7 +10,12 @@ import { import { Logger } from 'winston' import { IS_CLI } from '../../config' -import { CSAccounting__factory, CSModule__factory, Lido__factory } from '../../generated/typechain' +import { + CSAccounting__factory, + CSModule__factory, + Lido__factory, + Multicall3__factory, +} from '../../generated/typechain' import { getLogger } from '../../logger' import { SECONDS_PER_DAY, WEI_PER_ETH } from '../../shared/constants' import { Service } from '../../shared/types' @@ -25,6 +30,9 @@ const { DEPLOYED_ADDRESSES } = requireWithTier( RedefineMode.Merge, ) +const ILido = Lido__factory.createInterface() +const ICSAccounting = CSAccounting__factory.createInterface() + const CHECK_ACCOUNTING_INTERVAL_BLOCKS = 301 // ~ every hour const ACCOUNTING_BALANCE_EXCESS_SHARES_MAX = WEI_PER_ETH / 10n const CURVE_EARLY_ADOPTION_ID = 1n @@ -62,11 +70,32 @@ export class CSAccountingSrv implements Service { return [] } - const accounting = CSAccounting__factory.connect(DEPLOYED_ADDRESSES.CS_ACCOUNTING, provider) - const steth = Lido__factory.connect(DEPLOYED_ADDRESSES.LIDO_STETH, provider) + const multicall = Multicall3__factory.connect(DEPLOYED_ADDRESSES.MULTICALL3, provider) + const { blockNumber, returnData } = await multicall.tryBlockAndAggregate( + true, // requireSuccess + [ + { + target: DEPLOYED_ADDRESSES.LIDO_STETH, + callData: ILido.encodeFunctionData('sharesOf', [ + DEPLOYED_ADDRESSES.CS_ACCOUNTING, + ]) as `0x${string}`, + }, + { + target: DEPLOYED_ADDRESSES.CS_ACCOUNTING, + callData: ICSAccounting.encodeFunctionData('totalBondShares') as `0x${string}`, + }, + ], + { blockTag: blockEvent.blockHash }, + ) + + if (blockNumber != BigInt(blockEvent.blockNumber)) { + this.logger.warn( + `Unexpected block number, got=${blockNumber}, expected=${blockEvent.blockNumber}`, + ) + } - const totalBondShares = await accounting.totalBondShares({ blockTag: blockEvent.blockHash }) - const actualBalance = await steth.sharesOf(accounting, { blockTag: blockEvent.blockHash }) + const totalBondShares = BigInt(returnData[0][1]) + const actualBalance = BigInt(returnData[1][1]) const diff = totalBondShares - actualBalance const now = blockEvent.block.timestamp diff --git a/csm-alerts/src/services/constants.holesky.ts b/csm-alerts/src/services/constants.holesky.ts index e545bfcc6..4114f372f 100644 --- a/csm-alerts/src/services/constants.holesky.ts +++ b/csm-alerts/src/services/constants.holesky.ts @@ -12,6 +12,7 @@ export const DEPLOYED_ADDRESSES: DeployedAddresses = { BURNER: '0x4E46BD7147ccf666E1d73A3A456fC7a68de82eCA', HASH_CONSENSUS: '0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37', STAKING_ROUTER: '0xd6EbF043D30A7fe46D1Db32BA90a0A51207FE229', + MULTICALL3: '0xcA11bde05977b3631167028862bE2a173976CA11', } export const ORACLE_MEMBERS: { [key: string]: string } = { diff --git a/csm-alerts/src/services/constants.ts b/csm-alerts/src/services/constants.ts index 084bb8c27..540390a9e 100644 --- a/csm-alerts/src/services/constants.ts +++ b/csm-alerts/src/services/constants.ts @@ -12,6 +12,7 @@ export const DEPLOYED_ADDRESSES: DeployedAddresses = { BURNER: '0xD15a672319Cf0352560eE76d9e89eAB0889046D3', HASH_CONSENSUS: '0x71093efF8D8599b5fA340D665Ad60fA7C80688e4', STAKING_ROUTER: '0xFdDf38947aFB03C621C71b06C9C70bce73f12999', + MULTICALL3: '0xcA11bde05977b3631167028862bE2a173976CA11', } export const ALIASES: Record = { @@ -26,6 +27,7 @@ export const ALIASES: Record = { BURNER: 'Burner', HASH_CONSENSUS: 'CSM HashConsensus', STAKING_ROUTER: 'StakingRouter', + MULTICALL3: 'Multicall3', } export const ORACLE_MEMBERS: { [key: string]: string } = { diff --git a/csm-alerts/src/shared/types.ts b/csm-alerts/src/shared/types.ts index 4e2dc9f09..1f9ff64a6 100644 --- a/csm-alerts/src/shared/types.ts +++ b/csm-alerts/src/shared/types.ts @@ -28,6 +28,7 @@ export type DeployedAddresses = { BURNER: string HASH_CONSENSUS: string STAKING_ROUTER: string + MULTICALL3: string } interface Initialize {